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 (\(\Delta\)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 \(\Delta\)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 \(\Delta\)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 \(\Delta\)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 \(\Delta\)14C over time for “slow” and “fast” soil carbon pools are shown below (Fig. 1) in relationship to the \(\Delta\)14C of the atmosphere and respired CO2 for a theoretical model system.

Fig 1a. Modeled trajectories of \(\Delta\)14C over time in soil carbon pools (fast, slow, respiration flux) in relationship to observed atmospheric \(\Delta\)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 \(\Delta\)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 \(\Delta\)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 \(\Delta\)14C in fast and slow cycling soil carbon pools (same model as Fig 1a), and \(\Delta\)14C of respired CO2 is shown in yellow. Solid circles show hypothetical observations of \(\Delta\)14C-CO2 from control incubations, while the open symbols represent two possible scenarios in which \(\Delta\)14C-CO2 shifts due to increased contribution from the fast pool (open circles), or shifts due to increased 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 \(\Delta\)14C-CO2 in 1991, but relative enrichment of \(\Delta\)14C-CO2 in 2019, while the opposite is observed for increased fast pool contribution scenario.
In the above plot (Fig. 2), increased contribution from the slow pool leads to depletion in \(\Delta\)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 \cdot \left( (FM \cdot e^{\frac{-year_{sampled} + 1950}{8267}}) - 1 \right)\]
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).
Experiment 3 (storage duration)
Samples were only incubated for a single enclosure period for this experiment, instead of two (pre-incubation followed by equilibrium respiration). Grassland soils from the storage duration treatment group responded rapidly to rewetting and reached target CO2 levels after just 72 h of incubation. Only a single observation was made for the grassland treament samples due to the rapid respiration rates, which peaked at 5.6 mg CO2 g soil C-1 d-1. The mean peak respiration rate for forest treatment samples was lower and lagged in comparison to the grassland soils, reaching 2.2 mg CO2 g soil C-1 d-1 after 97 h.
Conditions for control incubations varied. Grassland control samples were incubated in 2011 under the same conditions as the control samples from Experiment 1, i.e. 96 h pre-incubation period followed by 14 d of equilibrium respiration. Respiration rates peaked after the pre-incubation period (115 h), at 2.3 mg CO2 g soil C-1 d-1. Forest control samples were pre-incubated under various conditions, but respiration rates were only measured during the pre-incubation period for two samples from the Sierra Nevada mountains (USA). In general, respiration rates for forest control samples in Experiment 3 were much lower than in the treatment incubations, peaking at 0.6 mg CO2 g soil C-1 d-1 after 120 h.


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
13C_archivecInc_Pre_20181207-141691-141751.xls
13C_archivedInc_20190116-142012-142072.xls
20190122-ManuelRost-142082-141553.xls
20190909-2Wh-Jeffrey_Beem-Miller-13613-13658.xls
20190910-Jeffrey_Beem-Miller-13664-13702.xls
20191126-MRost-BeemMiller-17509-17555.xls
20190213-ManuelRost-143192-143294.xls
20191106-MRost-16925-16952.xls
ArcInc_dry_13C.xls
\(\delta\)13C
Error in rbind(deparse.level, ...) :
numbers of columns of arguments do not match
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 \(\Delta\)14C against equilibrium respiration period \(\Delta\)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 \(\Delta\)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 \(\Delta\)14C. The outlier point with the substantially depleted pre-incubation \(\Delta\)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. 4) led to enrichment in grassland samples, but depletion in forest samples. In contrast, the air-dry only treatment (Experiment 2, open circles, Fig. 4) 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. 4), and significant for grassland samples but not forest samples in Experiment 2 (2019 points, Fig. 4). 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 (\(\Delta\)\(\Delta\)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 \(\Delta\)14C-CO2 over time (Experiments 1 and 2)
Caption: Filled circles show \(\Delta\)14C-CO2 observed for control samples, while open symbols show \(\Delta\)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 \(\Delta\)14C-CO2 relative to the controls. Points are means and error bars show 2x standard error. The gray line shows \(\Delta\)14C of the atmosphere.

Fig 5. Treatment effect on observed \(\delta\)13C-CO2 for Experiments 1 and 2
Caption: Filled circles show \(\delta\)13C-CO2 observed for control samples, while open symbols show \(\delta\)13C-CO2 observed for treament samples (open squares = air-dry + storage treatment, Experiment 1, 2011; open circles = air-dry only treatment, Experiment 2, 2019). Points are means and error bars show 2x standard error.
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 \(\Delta\)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 the Experiments 1 and 3 (air-dry + storage treatment). 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
What is the effect of 13C? Can we explain the patterns in 14C or the differences between grasslands and forests with 13C data?
Note that 13C can give insight into the type of compound, as well as the degree of processing, cf. Buzek et al 2009. Oxidation of microbial CH4 to CO2 can lead to extremely negative \(\delta\)13C. CO2 derived from unprocessed material should have \(\delta\)13C values closer to that of plants, while highly processed material would be heavier.
Within rep variability
Compare the variability in \(\Delta\)14C among laboratory replicates to that between treatment and control.
Calculate by site, by ecosystem. Note that means and standard errors for the Experiment 2 samples (“rewet”) are calculated as the mean of the mean differences observed for control duplicates and for treatment duplicates, and the standard error is equal to the square root of the sum of the variances for each set.

Change in soil moisture content with moisture adjustment
The main treatment effect in all three experiments is the degree of moisture adjustment of the soil sample prior to incubation. In the case of the control samples the change in moisture content is less extreme than the treatment samples since the samples are still field-moist rather than air-dried. The magnitude of the treatment effect may therefore depend on what the field moisture content of the control soils was.

[1] -4.966667
LS0tCnRpdGxlOiAiQXJjaGl2ZWQgU29pbCBJbmN1YmF0aW9ucyBQcm9qZWN0IgphdXRob3I6ICJKLiBCZWVtLU1pbGxlciIKZGF0ZTogIjMwIEFwciAyMDIwIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDIKICAgIGNzczogY3VzdG9tLmNzcwogIHBkZl9kb2N1bWVudDoKICAgIGxhdGV4X2VuZ2luZTogeGVsYXRleAogICAgY3NzOiBjdXN0b20uY3NzCmhlYWRlcl9pbmNsdWRlczoKICAtIFx1c2VwYWNrYWdlW3V0Zjhde2lucHV0ZW5jfQogIC0gXHVzZXBhY2thZ2V7ZmxvYXR9Ci0tLQpgYGB7ciBnbG9iYWxfb3B0aW9ucywgaW5jbHVkZSA9IEZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgIGZpZy5hbGlnbiA9ICdjZW50ZXInLCBkZXYgPSAnY2Fpcm9fcGRmJykKYGBgCgpgYGB7ciBzZXR1cCwgaW5jbHVkZSA9IEZBTFNFfQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkodGlkeXIpCmxpYnJhcnkoU29pbFIpCmxpYnJhcnkoY29ycnBsb3QpCmxpYnJhcnkob3Blbnhsc3gpCmxpYnJhcnkoSVNSYUQpCmBgYAojIyBOb3RlcwoqIFRoaXMgd29ya2Jvb2sgaXMgaW50ZW5kZWQgdG8gbG9hZCBhbmQgcHJlcGFyZSB0aGUga2V5IGRhdGEgZm9yIGFuYWx5c2lzIGZvciB0aGUgYXJjaGl2ZSBpbmN1YmF0aW9uIHByb2plY3QuCiogaW4gZ2VuZXJhbCwgdGhpcyBpcyBhbiB1cGRhdGVkIHZlcnNpb24gb2Ygc2NyaXB0ICIuL3NyYy9hcmNfaW5jX21hc3Rlci5SIgoqIGFsbCBjb2RlIGNodW5rIG9wdGlvbnMgYXJlIHNldCB0byAiZWNobyA9IEZBTFNFIjsgc2VlIHJhdyAuUm1kIGZpbGUgZm9yIGRhdGEgd3JhbmdsaW5nIGNvZGUuCgojIEludHJvZHVjdGlvbgpUaGUgbGFib3JhdG9yeSBzb2lsIGluY3ViYXRpb24gaXMgYSBjb21tb25seSB1c2VkIHRlY2huaXF1ZSBmb3IgdW5kZXJzdGFuZGluZyBzb2lsIGNhcmJvbiBkeW5hbWljcy4gU29pbCBjYXJib24gaXMgYSBoZXRlcm9nZW5lb3VzIG1peHR1cmUgb2Ygb3JnYW5pYyBtYXR0ZXIsIHNvbWUgb2Ygd2hpY2ggcGVyc2lzdHMgaW4gdGhlIHNvaWwgZm9yIG1vbnRocyBvciB5ZWFycywgd2hpbGUgc29tZSBwZXJzaXN0cyBmb3IgY2VudHVyaWVzIG9yIG1pbGxlbmlhLiBUaGUgcGVyc2lzdGVuY2Ugb2Ygc29pbCBjYXJib24gY2FuIGJlIHVuZGVyc3Rvb2QgdGhyb3VnaCB0aGUgY29uY2VwdCBvZiBkaWZmZXJlbnQgInBvb2xzIiBvZiBjYXJib24gdGhhdCBhcmUgZGVmaW5lZCBieSB0aGUgbWVjaGFuaXNtIGJ5IHdoaWNoIHRoZXkgcGVyc2lzdCBpbiB0aGUgc29pbCBhbmQgYXJlIGNoYXJhY3Rlcml6ZWQgYnkgZGlzdGluY3QgYWdlIGRpc3RyaWJ1dGlvbnMuIAoKTmF0dXJhbCBhYnVuZGFuY2UgcmFkaW9jYXJib24gcHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgY2FyYm9uIGR5bmFtaWNzIG9uIHRoZSBzY2FsZSBvZiBjZW50dXJpZXMgdG8gbWlsbGVuaWEsIHdoaWxlIGluc2lnaHQgaW50byBkZWNhZGFsIHNjYWxlIGR5bmFtaWNzIGNhbiBiZSBnYWluZWQgZnJvbSB0cmFjaW5nIHRoZSBwdWxzZSBvZiByYWRpb2NhcmJvbiBpbnRyb2R1Y2VkIGludG8gdGhlIGJpb3NwaGVyZSBmcm9tIG51Y2xlYXIgd2VhcG9ucyB0ZXN0aW5nICgiYm9tYi1DIikgaW4gdGhlIG1pZC0yMF50aF4gY2VudHVyeS4gVGhlIGJvbWItQyBwdWxzZSBwZWFrZWQgaW4gdGhlIGF0bW9zcGhlcmUgaW4gdGhlIDE5NTBzIChGaWcuIDEpLCBidXQgZHVlIHRvIGRpZmZlcmVudGlhbCByYXRlcyBvZiBhYmlvdGljIGluY29ycG9yYXRpb24gYW5kIGJpb2xvZ2ljYWwgcHJvY2Vzc2luZywgdGhlIHBlYWsgaXMgbGFnZ2VkIGluIHRpbWUgYW5kIGRhbXBlbmVkIGluIHNvaWxzLiBUaGUgcmVsYXRpdmUgZW5yaWNobWVudCBpbiBib21iLUMgaW4gZGlmZmVyZW50IHBvb2xzIG9mIHNvaWwgY2FyYm9uIGlzIGEgdXNlZnVsIHRvb2wgZm9yIGluZmVycmluZyB0aGUgcmVsYXRpdmUgcmF0ZSBhdCB3aGljaCBjYXJib24gZW50ZXJzIGFuZCBsZWF2ZXMgdGhlIHBvb2wsIGFuZCBmb3IgYSBob21vZ2Vub3VzIHBvb2wgaXQgaXMgZnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdG8gdGhlIGludHJpbnNpYyBkZWNvbXBvc2l0aW9uIHJhdGUuCgpFeHRyYWN0aW5nIGFuZCBtZWFzdXJpbmcgdGhlIHJhZGlvY2FyYm9uIGNvbnRlbnQgb2Ygc3BlY2lmaWMgc29pbCBjYXJib24gcG9vbHMgaXMgaGFtcGVyZWQgYnkgc3BhdGlhbCBhbmQgdGVtcG9yYWwgaGV0ZXJvZ2VuZWl0eSBvZiB0aGUgbWVjaGFuaXNtcyB0aGF0IGxlYWQgdG8gc29pbCBjYXJib24gcGVyc2lzdGVuY2UsIHN1Y2ggYXMgcGh5c2ljYWwgb2NjbHVzaW9uIGluIGFnZ3JlZ2F0ZXMsIGFzc29jaWF0aW9uIHdpdGggbWluZXJhbHMsIG9yIHRoZXJtb2R5bmFtaWNzLiBEZWZpbmluZyBzb2lsIGNhcmJvbiBwb29scyBlbXBpcmljYWxseSB3aXRoIHRlY2huaXF1ZXMgc3VjaCBhcyBkZW5zaXR5LCBzaXplLCBvciByZXNpc3RhbmNlIHRvIGNoZW1pY2FsIGF0dGFjayBjYW4gYmUgdXNlZnVsLCBidXQgdGhlc2UgbWV0aG9kcyBhbHNvIGludHJvZHVjZSBhcnRpZmFjdHMgYW5kIGxpa2VseSByZXN1bHQgaW4gbWl4dHVyZXMgb2YgcG9vbHMgd2l0aCBkaWZmZXJlbnQgYWdlIGRpc3RyaWJ1dGlvbnMuIEluIGNvbnRyYXN0LCBhbHRob3VnaCB0aGV5IGFsc28gaW50cm9kdWNlIGFydGlmYWN0cyBkdWUgdG8gZGlzdHVyYmFuY2UgYW5kIHBvdGVudGlhbCBhbHRlcmF0aW9uIG9mIHRoZSBtaWNyb2JpYWwgY29tbXVuaXR5LCBsYWJvcmF0b3J5IHNvaWwgaW5jdWJhdGlvbnMgbWFrZSB1c2Ugb2YgdGhlIHNhbWUgZnJhY3Rpb25hdGlvbiBhZ2VudCBhcyBpcyBmb3VuZCAqaW4gc2l0dSo6IHRoZSBtaWNyb2JpYWwgY29tbXVuaXR5LiBNZWFzdXJpbmcgdGhlIHJhZGlvY2FyYm9uIHNpZ25hbCBvZiBDT34yfiAoJFxEZWx0YSReMTReQy1DT34yfikgcmVsZWFzZWQgaW4gbGFib3JhdG9yeSBpbmN1YmF0aW9ucyBvZiBidWxrIHNvaWxzIGlzIGEgcG93ZXJmdWwgdG9vbCBmb3IgdW5kZXJzdGFuZGluZyB0aGUgcmVsYXRpdmUgcHJvY2Vzc2luZyByYXRlIG9mIGNhcmJvbiBpbiBzb2lsIChvciB0cmFuc2l0IHRpbWUpIGFzIGl0IHByb3ZpZGVzIGFuIGludGVncmF0ZWQgbWVhc3VyZSBvZiB0aGUgd2VpZ2h0ZWQgY29udHJpYnV0aW9uIHRvIHRoZSByZWxlYXNlIGZsdXggZnJvbSBwb29scyBvZiBzb2lsIGNhcmJvbiB3aXRoIGRpc3RpbmN0IHByb2Nlc3NpbmcgcmF0ZXMuIAoKSW50ZXJwcmV0aW5nICRcRGVsdGEkXjE0XkMtQ09+Mn4gZnJvbSBsYWJvcmF0b3J5IHNvaWwgaW5jdWJhdGlvbnMgcmVxdWlyZXMgdGhlIHVzZSBvZiBhIG1vZGVsLiBIb3dldmVyLCBwYXJhbWV0ZXJpemluZyB0aGVzZSBtb2RlbHMgaXMgY2hhbGxlbmdpbmcsIGJvdGggZHVlIHRvIHRoZSB1bmNlcnRhaW50eSBvZiB0aGUgcGVyc2lzdGVuY2UgbWVjaGFuaXNtcyB0aGVtc2VsdmVzIGFzIHdlbGwgYXMgYSBsYWNrIG9mIG9ic2VydmF0aW9uYWwgY29uc3RyYWludHMuIFJhZGlvY2FyYm9uIG9ic2VydmF0aW9ucyBhdCBhIHNpbmdsZSBwb2ludCBpbiB0aW1lIGFyZSB2ZXJ5IHVzZWZ1bCwgYnV0IGR1ZSB0byB0aGUgY3VydmF0dXJlIG9mIHRoZSBib21iLUMgcGVhayB0aGVyZSBhcmUgdHdvIHBvaW50cyBpbiB0aW1lIHdpdGggdGhlIHNhbWUgYXRtb3NwaGVyaWMgcmFkaW9jYXJib24gdmFsdWUgd2hpY2ggbGVhZHMgdG8gbXVsdGlwbGUgbW9kZWwgc29sdXRpb25zLiBBZGRpbmcgb2JzZXJ2YXRpb25zIG9mICRcRGVsdGEkXjE0XkMtQ09+Mn4gYXQgbW9yZSB0aGFuIG9uZSBwb2ludCBpbiB0aW1lIGNhbiBncmVhdGx5IHJlZHVjZSBtb2RlbCB1bmNlcnRhaW50eSBieSBhZGRpbmcgYWRkaXRpb2FubCBjb25zdHJhaW50cy4KClNvaWwgYXJjaGl2ZXMgaGF2ZSBhbHJlYWR5IHByb3ZlbiB0byBiZSBhIHZhbHVhYmxlIHNvdXJjZSBvZiBkYXRhIGZvciBjb25zdHJhaW5pbmcgc29pbCBjYXJib24gbW9kZWxzIGJ5IHByb3ZpZGluZyB0aW1lIHNlcmllcyBvZiB0aGUgY2hhbmdlIGluIHNvaWwgY2FyYm9uIF4xNF5DIGNvbnRlbnQuIFRoZSBwcm9taXNlIG9mIGltcHJvdmluZyBtb2RlbHMgZnVydGhlciBieSBvYnRhaW5pbmcgXjE0XkMtQ09+Mn4gbWVhc3VyZW1lbnRzIGZyb20gYXJjaGl2ZWQgc29pbHMgaXMgdGFudGFsaXppbmcsIGJ1dCBmaXJzdCB0aGUgcG9zc2libGUgZWZmZWN0cyBvZiBhaXItZHJ5aW5nIGFuZCByZXdldHRpbmcsIGFzIHdlbGwgYXMgdGhlIGVmZmVjdCBvZiB0aGUgZHVyYXRpb24gb2Ygc3RvcmFnZSwgbXVzdCBiZSBxdWFudGlmaWVkLgoKQWlyLWRyeWluZyBhbmQgcmV3ZXR0aW5nIG9mIHNvaWxzIHN0aW11bGF0ZXMgdGhlIHJlbGVhc2Ugb2YgQ09+Mn4uLi5bZXhwYW5kXSAKCldlIGRlc2lnbmVkIGFuIGV4cGVyaW1lbnQgdG8gYXNzZXNzIHRoZXNlIGVmZmVjdHMsIHByZWxpbWluYXJ5IHJlc3VsdHMgb2Ygd2hpY2ggYXJlIHByZXNlbnRlZCBpbiB0aGUgZm9sbG93aW5nIHJlcG9ydC4KCiMgSHlwb3RoZXNlcyBhbmQgY29uY2VwdHVhbCB1bmRlcnN0YW5kaW5nCklmIHRoZSBudWxsIGh5cG90aGVzaXMgaXMgZGlzcHJvdmVkLCBpLmUuIGFpci1kcnlpbmcgYW5kIHJld2V0dGluZyAoYWlyLWRyeSkgb3IgYWlyLWRyeWluZywgcmV3ZXR0aW5nLCBhbmQgc3RvcmFnZSAoYWlyLWRyeSArIHN0b3JhZ2UpIGhhdmUgYSBzaWduaWZpY2FudCBlZmZlY3Qgb24gJFxEZWx0YSReMTReQy1DT34yfiByZWxhdGl2ZSB0byBjb250cm9sIHNhbXBsZXMsIHRoZXJlIGFyZSB0d28gcG9zc2libGUgb3V0Y29tZXM6IGVucmljaG1lbnQgb2YgdGhlIHJlc3BpcmF0aW9uIGZsdXggb3IgZGVwbGV0aW9uLiAKCkluIGEgc2ltcGxlIHR3by1wb29sIHNvaWwgY2FyYm9uIG1vZGVsLCB0aGUgdHJlYXRtZW50IGVmZmVjdCBjYW4gYmUgY29uY2VwdHVhbGl6ZWQgYXMgYSByZWxhdGl2ZSBjaGFuZ2UgaW4gdGhlIGNvbnRyaWJ1dGlvbiBvZiAic2xvd2VyIiBvciAiZmFzdGVyIiBjeWNsaW5nIGNhcmJvbiB0byB0aGUgcmVzcGlyYXRpb24gZmx1eCBvYnNlcnZlZCBpbiBjb250cm9sIHNhbXBsZXMuCgpUcmFqZWN0b3JpZXMgb2YgdGhlIGNoYW5nZSBpbiAkXERlbHRhJF4xNF5DIG92ZXIgdGltZSBmb3IgInNsb3ciIGFuZCAiZmFzdCIgc29pbCBjYXJib24gcG9vbHMgYXJlIHNob3duIGJlbG93IChGaWcuIDEpIGluIHJlbGF0aW9uc2hpcCB0byB0aGUgJFxEZWx0YSReMTReQyBvZiB0aGUgYXRtb3NwaGVyZSBhbmQgcmVzcGlyZWQgQ09+Mn4gZm9yIGEgdGhlb3JldGljYWwgbW9kZWwgc3lzdGVtLgoKYGBge3IgY29uY2VwdHVhbC1tb2RlbC1jYWxjcywgaW5jbHVkZSA9IEZBTFNFfQojIGluaXRpYWwgcGFyYW1ldGVyIHNldApEYXRtIDwtIHJiaW5kKGdyYXZlbiwgZnV0dXJlMTRDKQpEYXRtIDwtIERhdG1bRGF0bSREYXRlID4gMTkwMCwgYygiRGF0ZSIsICJOSGMxNCIpXQp5cnMgPC0gRGF0bSREYXRlCgojIGhlbHBlciBmeHMKbGFtYmRhIDwtICgxLzgyNjcpCgprIDwtIGZ1bmN0aW9uKEZtKSB7CiAgKEZtKmxhbWJkYSkvKDEtRm0pCn0KZm0gPC0gZnVuY3Rpb24oayl7CiAgay8oaytsYW1iZGEpCn0KZm1fMTRjIDwtIGZ1bmN0aW9uKGZtLCBkYXRlKSB7CiAgKGZtKmV4cChsYW1iZGEqKDE5NTAgLSBkYXRlKSkgLSAxKSoxMDAwCn0KCiMgZm9yZXN0cwpmLmMgPC0gMzguOTYxMDQgIyBmb3Jlc3QgQyBwb29sLCB0b3RhbCAobWVhbiBIYWluaWNoIGZvcmVzdCBDICA9IDI0IGcga2deLTEpOyBuYiBAIHNzID0gc3VtKC0xKnNvbHZlKEEpJSolYyhmLmluKmYuZ2FtLCBmLmluKigxLWYuZ2FtKSkpCmYuaW4gPC0gMSAjIGlucHV0cyAoMTIuNT1tZWFuIGVxdWlsaWJyaXVtIEMgZmx1eCwgYW5udWFsIGV4dHJhcG9sYXRpb24sIGdDIHlyLTEsIDIwMTEgaW5jdWJhdGlvbiBkYXRhKTsgdHJ5IG11Y2ggbGVzcy4uLgpmLmZyYyA8LSAuMSAjIEMtc3RvY2sgcGFydGl0aW9uaW5nIGNvZWZmaWNpZW50IChmcm9tIFNjaHJ1bXBmIDIwMTMsIEhhaW5pY2ggMC01LCBmcmVlIGxpZ2h0KQpmLkNmYXN0IDwtIGYuZnJjKmYuYwpmLkNzbG93IDwtIGYuYy1mLkNmYXN0CmYua2Zhc3QgPC0gMS82ICMgdW5rbm93bgpmLmtzbG93IDwtIDEvMTAwICMgdW5rbm93bgpmLmZhc3QuZm0gPC0gZm0oZi5rZmFzdCkKZi5zbG93LmZtIDwtIGZtKGYua3Nsb3cpCmYuRjBfRGVsdGExNEMgPC0gZm1fMTRjKGMoZi5mYXN0LmZtLCBmLnNsb3cuZm0pLCBkYXRlID0gYygxOTAwLCAxOTAwKSkKZi5nYW0gPC0gKGYuYypmLkNmYXN0KmYua2Zhc3QpLyhmLmMqZi5DZmFzdCpmLmtmYXN0K2YuYypmLkNzbG93KmYua3Nsb3cpICMgaW5wdXQgcGFydGl0aW9uaW5nIGNvZWZmaWNpZW50IChwcm9wb3J0aW9uIHRvIGZhc3QgcG9vbCwgZnVuY3Rpb24gb2Yga3MpCiAgCiMgIyBncmFzc2xhbmRzCiMgZy5jIDwtIDQyICMgQyBwb29sLCB0b3RhbCAobWVhbiBIYWluaWNoIGdyYXNzbGFuZCBDIGcga2deLTEpCiMgZy5pbiA8LSA2My40ICMgaW5wdXRzIChtZWFuIGVxdWlsaWJyaXVtIEMgZmx1eCwgYW5udWFsIGV4dHJhcG9sYXRpb24sIDIwMTEgaW5jdWJhdGlvbiBkYXRhKQojIGcuZnJjIDwtIC4zICMgQy1zdG9jayBwYXJ0aXRpb25pbmcgY29lZmZpY2llbnQgKGZyb20gU2NocnVtcGYgMjAxMywgYXZlcmFnZSBvZiBMYWNxdWV2aWxsZSwgRWFzdGVyIEJ1c2gsIEJ1Z2FjLCAwLTUsIGZyZWUgbGlnaHQpCiMgZy5DZmFzdCA8LSBnLmZyYypnLmMKIyBnLkNzbG93IDwtIGcuYy1nLkNmYXN0CiMgZy5rZmFzdCA8LSAxLzEwICMgdW5rbm93bgojIGcua3Nsb3cgPC0gMS8xMDAgIyB1bmtub3duCiMgZy5mYXN0LmZtIDwtIGZtKGcua2Zhc3QpCiMgZy5zbG93LmZtIDwtIGZtKGcua3Nsb3cpCiMgZy5GMF9EZWx0YTE0QyA8LSBmbV8xNGMoYyhnLmZhc3QuZm0sIGcuc2xvdy5mbSksIGRhdGUgPSBjKDE5MDAsIDE5MDApKQojIGcuZ2FtIDwtIChnLmMqZy5DZmFzdCpnLmtmYXN0KS8oZy5jKmcuQ2Zhc3QqZy5rZmFzdCtnLmMqZy5Dc2xvdypnLmtzbG93KSAjIGlucHV0IHBhcnRpdGlvbmluZyBjb2VmZmljaWVudCAocHJvcG9ydGlvbiB0byBmYXN0IHBvb2wsIGZ1bmN0aW9uIG9mIGtzKQoKIyAycG9vbCBwYXJhbGxlbCBtb2RlbCwgZm9yZXN0cwpmLjJwIDwtIFR3b3BQYXJhbGxlbE1vZGVsMTQodCA9IHlycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtzID0gYyhmLmtmYXN0LCBmLmtzbG93KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMwID0gYyhmLkNmYXN0LCBmLkNzbG93KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEYwX0RlbHRhMTRDID0gZi5GMF9EZWx0YTE0QywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluID0gZi5pbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhbSA9IGYuZ2FtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRGYyA9IERhdG0pCgpmLjJwLkMxNCA8LSBnZXRGMTQoZi4ycCkKZi4ycC5IUiA8LSBnZXRGMTRSKGYuMnApCmYuMnAuQ3RvdCA8LSBnZXRDKGYuMnApCgojIHNvbHZlIGZvciBzdGVhZHktc3RhdGUgQyBzdG9ja3MKQSA8LSAtMSpkaWFnKGMoZi5rZmFzdCwgZi5rc2xvdykpCnN1bSgtMSpzb2x2ZShBKSUqJWMoZi5pbipmLmdhbSwgZi5pbiooMS1mLmdhbSkpKQoKZi4ycC5DMTQuZGYgPC0gZGF0YS5mcmFtZSgKICB5ZWFycyA9IHJlcChEYXRtJERhdGUsIDQpLAogIGQxNEMgPSBjKGYuMnAuQzE0WywxXSwgZi4ycC5DMTRbLDJdLCBmLjJwLkhSLCBEYXRtJE5IYzE0KSwKICBwb29sID0gcmVwKGMoImZhc3QiLCAic2xvdyIsICJyZXNwaXJhdGlvbiIsICJhdG0iKSwgZWFjaCA9IG5yb3coZi4ycC5DMTQpKQogICkKCiMgIyBQbG90IEMgc3RvY2tzIHRvIGNvbmZpcm0gZmxhdAojIHBsb3QoeXJzLCB4bGltID0gYygxOTAwLDIwMjIpLCB5bGltID0gYygwLDYwKSkKIyBsaW5lcyh5cnMsIGYuMnAuQ3RvdFssIDFdLCBjb2wgPSAyKQojIGxpbmVzKHlycywgZi4ycC5DdG90WywgMl0sIGNvbCA9IDQpCgojIGNhbGN1bGF0ZSByZXNwIGZsdXggcG9pbnRzIGF0IDE5OTEgYW5kIDIwMTkgYW5kIHB1dCBpbiBkYXRhIGZyYW1lCm9icy5wdHMgPC0gZGF0YS5mcmFtZShwb29sID0gcmVwKCJyZXNwaXJhdGlvbiIsIDYpLAogICAgICAgICAgICAgICAgICAgICAgeWVhcnMgPSByZXAoYygxOTkxLDIwMTkpLDMpLAogICAgICAgICAgICAgICAgICAgICAgZDE0YyA9IGMobWVhbihmLjJwLkMxNC5kZltmLjJwLkMxNC5kZiR5ZWFycyA+IDE5OTAgJiBmLjJwLkMxNC5kZiR5ZWFycyA8IDE5OTIgJiBmLjJwLkMxNC5kZiRwb29sID09ICJyZXNwaXJhdGlvbiIsICJkMTRDIl0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhbihmLjJwLkMxNC5kZltmLjJwLkMxNC5kZiR5ZWFycyA+IDIwMTggJiBmLjJwLkMxNC5kZiR5ZWFycyA8IDIwMjAgJiBmLjJwLkMxNC5kZiRwb29sID09ICJyZXNwaXJhdGlvbiIsICJkMTRDIl0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTUwLCA2MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5MCwgMzApLAogICAgICAgICAgICAgICAgICAgICAgT2JzZXJ2YXRpb24gPSByZXAoYygiY29udHJvbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbmNyZWFzZWQgc2xvdyBwb29sIGNvbnRyaWJ1dGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbmNyZWFzZWQgZmFzdCBwb29sIGNvbnRyaWJ1dGlvbiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFjaCA9IDIpKQpvYnMucHRzLnIgPC0gb2JzLnB0c1tvYnMucHRzJE9ic2VydmF0aW9uID09ICJjb250cm9sIiwgXQpgYGAKCmBgYHtyIGNvbmNlcHR1YWwtbW9kZWwtZmlnMX0KZ2dwbG90KGYuMnAuQzE0LmRmLCBhZXMoeWVhcnMsIGQxNEMsIGNvbG9yID0gcG9vbCkpICsKICBnZW9tX3BhdGgoKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKAogICAgbmFtZSA9ICJQb29sIiwKICAgIHZhbHVlcyA9IGMoImF0bSIgPSA4LAogICAgICAgICAgICAgICAiZmFzdCIgPSAiI0Q4MUI2MCIsIAogICAgICAgICAgICAgICAicmVzcGlyYXRpb24iID0gIiNGRkMxMDciLCAKICAgICAgICAgICAgICAgInNsb3ciID0gIiMxRTg4RTUiKSwKICAgIGxhYmVscyA9IGMoImF0bSIgPSAiYXRtb3NwaGVyZSIsCiAgICAgICAgICAgICAgICJmYXN0IiA9ICJmYXN0IiwKICAgICAgICAgICAgICAgInNsb3ciID0gInNsb3ciKSkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDE5NTAsIDIwMjIpKSArCiAgeGxhYigiWWVhciIpICsKICB5bGFiKGV4cHJlc3Npb24oJycqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAoKPioqRmlnIGByIHsoZmlnLm4gPC0gMSl9YGEuIE1vZGVsZWQgdHJhamVjdG9yaWVzIG9mICRcRGVsdGEkXjE0XkMgb3ZlciB0aW1lIGluIHNvaWwgY2FyYm9uIHBvb2xzIChmYXN0LCBzbG93LCByZXNwaXJhdGlvbiBmbHV4KSBpbiByZWxhdGlvbnNoaXAgdG8gb2JzZXJ2ZWQgYXRtb3NwaGVyaWMgJFxEZWx0YSReMTReQyoqCgo+KkNhcHRpb246KiBNb2RlbGVkIGN1cnZlcyBkZXJpdmVkIGZyb20gYSBjb25jZXB0dWFsIHR3by1wb29sIHBhcmFsbGVsIG1vZGVsIHN5c3RlbSBpbiB3aGljaCBpbnB1dHMgYXJlIHBhcnRpdGlvbmVkIGJldHdlZW4gZmFzdGVyIGFuZCBtb3JlIHNsb3dseSBjeWNsaW5nIHBvb2xzIHdpdGhvdXQgYW55IHRyYW5mZXJzIGJldHdlZW4gdGhlIHBvb2xzLiBDYXJib24gc3RvY2tzIGFuZCBwb29sIHNpemVzIGFyZSBiYXNlZCBvbiBkZW5zaXR5IGZyYWN0aW9uIGRhdGEgZm9yIHRoZSBIYWluaWNoIEZvcmVzdCAoU2NocnVtcGYgZXQgYWwuIDIwMTMpOyBkZWNvbXBvc2l0aW9uIHJhdGVzIGFyZSBjaG9zZW4gdG8gYmUgcmVhbGlzdGljIGJ1dCBhcmUgYXJiaXRyYXJ5LiBBdG1vc3BoZXJpYyAkXERlbHRhJF4xNF5DIGRhdGEgdXAgdG8gdGhlIHllYXIgMjAxNSBhcmUgZnJvbSBHcmF2ZW4gZXQgYWwuICgyMDE3KSwgd2hpbGUgZGF0YSBwb2ludHMgYmV5b25kIDIwMTUgdXNlIHRoZSBleHRyYXBvbGF0aW9uIG1ldGhvZCBmcm9tIFNpZXJyYSAoMjAxOCkuIEFsbCBhdG1vc3BoZXJpYyBkYXRhIGlzIGZvciB0aGUgbm9ydGhlcm4gaGVtaXNwaGVyZSAoem9uZSAyKS4KClRoZSBzaW1wbGVzdCB0d28tcG9vbCBtb2RlbCBpcyBhIHBhcmFsbGVsIHN5c3RlbTogb25lIGluIHdoaWNoIGNhcmJvbiBlbnRlcmluZyB0aGUgc29pbCBpcyBwYXJ0aXRpb25lZCBiZXR3ZWVuIHRoZSB0d28gcG9vbHMgd2l0aG91dCBhbnkgdHJhbnNmZXJzIGZyb20gb25lIHBvb2wgdG8gdGhlIG90aGVyLiBIb3dldmVyLCBldmVuIGluIHRoaXMgc2ltcGxlIHN5c3RlbSwgdGhlIHNhbWUgdHJlYXRtZW50IGVmZmVjdCBjYW4gcmVzdWx0IGluIGVpdGhlciBlbnJpY2htZW50IG9yIGRlcGxldGlvbiBkZXBlbmRpbmcgb24gdGhlIHllYXIgdGhlIHNhbXBsZSB3YXMgY29sbGVjdGVkLiBUaGUgZGlyZWN0aW9uIG9mIGNoYW5nZSB3aWxsIGJlIGRlcGVuZGVudCBvbiBzeXN0ZW0gZHluYW1pY3MsIHNwZWNpZmljYWxseSB0aGUgaW50cmluc2ljIGRlY29tcG9zaXRpb24gcmF0ZXMgb2YgdGhlIHNsb3cgYW5kIGZhc3QgcG9vbHMsIHdoaWxlIGluIG1vcmUgY29tcGxpY2F0ZWQgc3l0ZW1zIHRoZSBhbW91bnQgb2YgbWl4aW5nIGJldHdlZW4gdGhlIHBvb2xzIHdpbGwgcGxheSBhIHJvbGUgYXMgd2VsbC4gUG90ZW50aWFsIHRyZWF0bWVudCBlZmZlY3RzIGZvciB0aGUgc2FtZSBwYXJhbGxlbCB0d28tcG9vbCBtb2RlbCBzeXN0ZW0gc2hvd24gaW4gRmlnLiAxIGFyZSBzaG93biBiZWxvdyBhdCB0d28gcG9pbnRzIGluIHRpbWUgKEZpZy4gMikuCgpgYGB7ciBjb25jZXB0dWFsLW1vZGVsLWZpZzFifQojIHpvb20gKHcvIGF0bSwgdG8gMjAyMikKZi4ycC5DMTQuZGYgJT4lIAogIGZpbHRlcih5ZWFycyA+IDE5ODcpICU+JQogIGdncGxvdCguLCBhZXMoeWVhcnMsIGQxNEMpKSArCiAgZ2VvbV9wYXRoKGFlcyhjb2xvciA9IHBvb2wpKSArCiAgZ2VvbV9wb2ludChkYXRhID0gb2JzLnB0cywgYWVzKHllYXJzLCBkMTRjLCBzaGFwZSA9IE9ic2VydmF0aW9uKSwgY29sb3IgPSAiI0ZGQzEwNyIsIHN0cm9rZSA9IDEsIHNpemUgPSAzKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKAogICAgbmFtZSA9ICJQb29sIiwKICAgIHZhbHVlcyA9IGMoImF0bSIgPSA4LAogICAgICAgICAgICAgICAiZmFzdCIgPSAiI0Q4MUI2MCIsIAogICAgICAgICAgICAgICAicmVzcGlyYXRpb24iID0gIiNGRkMxMDciLCAKICAgICAgICAgICAgICAgInNsb3ciID0gIiMxRTg4RTUiKSwKICAgIGxhYmVscyA9IGMoImF0bSIgPSAiYXRtb3NwaGVyZSIsCiAgICAgICAgICAgICAgICJmYXN0IiA9ICJmYXN0IiwKICAgICAgICAgICAgICAgInNsb3ciID0gInNsb3ciKSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbCgKICAgIG5hbWUgPSAiT2JzZXJ2ZWQgcmVzcGlyYXRpb24iLAogICAgdmFsdWVzID0gYygiY29udHJvbCIgPSAxNiwKICAgICAgICAgICAgICAgImluY3JlYXNlZCBzbG93IHBvb2wgY29udHJpYnV0aW9uIiA9IDAsCiAgICAgICAgICAgICAgICJpbmNyZWFzZWQgZmFzdCBwb29sIGNvbnRyaWJ1dGlvbiIgPSAxKSkgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKC0yNSwgMjY1KSkgKwogIHhsYWIoIlllYXIiKSArCiAgeWxhYihleHByZXNzaW9uKCcnKkRlbHRhKicnXjE0KidDICjigLApJykpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKQpgYGAKCj4qKkZpZyBgciB7KGZpZy5uKX1gYi4gUG90ZW50aWFsIHNoaWZ0cyBpbiAkXERlbHRhJF4xNF5DIG9mIHJlc3BpcmVkIENPfjJ+IGluIHJlc3BvbnNlIHRvIGFpci1kcnlpbmcgYW5kIHJld2V0dGluZywgb3IgYWlyLWRyeWluZyBhbmQgcmV3ZXR0aW5nICsgc3RvcmFnZSoqCgo+KkNhcHRpb246KiBCbHVlIGFuZCBtYWdlbnRhIGxpbmVzIHNob3cgbW9kZWxlZCB0cmFqZWN0b3JpZXMgb2YgJFxEZWx0YSReMTReQyBpbiBmYXN0IGFuZCBzbG93IGN5Y2xpbmcgc29pbCBjYXJib24gcG9vbHMgKHNhbWUgbW9kZWwgYXMgRmlnIDFhKSwgYW5kICRcRGVsdGEkXjE0XkMgb2YgcmVzcGlyZWQgQ09+Mn4gaXMgc2hvd24gaW4geWVsbG93LiBTb2xpZCBjaXJjbGVzIHNob3cgaHlwb3RoZXRpY2FsIG9ic2VydmF0aW9ucyBvZiAkXERlbHRhJF4xNF5DLUNPfjJ+IGZyb20gY29udHJvbCBpbmN1YmF0aW9ucywgd2hpbGUgdGhlIG9wZW4gc3ltYm9scyByZXByZXNlbnQgdHdvIHBvc3NpYmxlIHNjZW5hcmlvcyBpbiB3aGljaCAkXERlbHRhJF4xNF5DLUNPfjJ+IHNoaWZ0cyBkdWUgdG8gaW5jcmVhc2VkIGNvbnRyaWJ1dGlvbiBmcm9tIHRoZSBmYXN0IHBvb2wgKG9wZW4gY2lyY2xlcyksIG9yIHNoaWZ0cyBkdWUgdG8gaW5jcmVhc2VkIGNvbnRyaWJ1dGlvbiBmcm9tIHRoZSBzbG93IHBvb2wgKG9wZW4gc3F1YXJlcykuIER1ZSB0byB0aGUgY3Jvc3Npbmcgb2YgdGhlIGJsdWUgYW5kIG1hZ2VudGEgbGluZXMgaW4gMjAwOSwgaW5jcmVhc2VkIGNvbnRyaWJ1dGlvbiBvZiB0aGUgc2xvdyBwb29sIHRvIHJlc3BpcmF0aW9uIGZvbGxvd2luZyB0cmVhdG1lbnQgbGVhZHMgdG8gcmVsYXRpdmUgZGVwbGV0aW9uIG9mICRcRGVsdGEkXjE0XkMtQ09+Mn4gaW4gMTk5MSwgYnV0IHJlbGF0aXZlIGVucmljaG1lbnQgb2YgJFxEZWx0YSReMTReQy1DT34yfiBpbiAyMDE5LCB3aGlsZSB0aGUgb3Bwb3NpdGUgaXMgb2JzZXJ2ZWQgZm9yIGluY3JlYXNlZCBmYXN0IHBvb2wgY29udHJpYnV0aW9uIHNjZW5hcmlvLgoKSW4gdGhlIGFib3ZlIHBsb3QgKEZpZy4gMiksIGluY3JlYXNlZCBjb250cmlidXRpb24gZnJvbSB0aGUgc2xvdyBwb29sIGxlYWRzIHRvIGRlcGxldGlvbiBpbiAkXERlbHRhJF4xNF5DIG9mIHJlc3BpcmF0aW9uIHJlbGF0aXZlIHRvIHRoZSBjb250cm9sIG9ic2VydmF0aW9uIGluIDE5OTEgYnV0IHJlbGF0aXZlIGVucmljaG1lbnQgaW4gMjAxOS4KCiMgTWV0aG9kcyBhbmQgbWF0ZXJpYWxzCgoqUmFkaW9jYXJib24gY29ycmVjdGlvbnMqCgpBbHRob3VnaCBkaWZmZXJlbmNlcyB3ZXJlIHNtYWxsLCByYWRpb2NhcmJvbiBkYXRhIGZvciBhcmNoaXZlZCBzYW1wbGVzIHdlcmUgZmlyc3QgY29ycmVjdGVkIGZvciBkZWNheSBzaW5jZSB0aGUgeWVhciBvZiBjb2xsZWN0aW9uIGJlZm9yZSBhc3Nlc3NpbmcgdHJlYXRtZW50IGVmZmVjdHMuCgpEZWNheSBjb3JyZWN0aW9uIGZvcm11bGE6CiQkMTAwMCBcY2RvdCBcbGVmdCggKEZNIFxjZG90IGVee1xmcmFjey15ZWFyX3tzYW1wbGVkfSArIDE5NTB9ezgyNjd9fSkgLSAxIFxyaWdodCkkJAoKd2hlcmUgRk0gaXMgdGhlIGZyYWN0aW9uIG1vZGVybiwgYW5kIDgyNjcgaXMgdGhlIGludmVyc2Ugb2YgdGhlIHByb2R1Y3Qgb2YgdGhlIG5hdHVyYWwgbG9nIG9mIHR3byBhbmQgdGhlIHRydWUgaGFsZiBsaWZlIG9mIF4xNF5DICg1NzMwIHkpLgoKYGBge3IgMTRDIGhlbHBlciBmeHN9CiMgNS4gQ3JlYXRlIGhlbHBlciBmdW5jdGlvbnMKIyBkZWNheSBjb3JyZWN0aW9uIGZ1bmN0aW9uICAKZGVjYXkuY29yci5meCA8LSBmdW5jdGlvbih5ZWFyX3NhbXBsZWQsIGZyYWN0aW9uX21vZGVybikgewogIGlmZWxzZShpcy5uYShmcmFjdGlvbl9tb2Rlcm4pLCBOQSwgMTAwMCooKGZyYWN0aW9uX21vZGVybipleHAoKC15ZWFyX3NhbXBsZWQgKyAxOTUwKS84MjY3KSktMSkpCn0KCiMgZDE0QyB0byBmcmFjdGlvbiBtb2Rlcm4gZnVuY3Rpb24KZDE0Yy5mbS5meCA8LSBmdW5jdGlvbih5ZWFyX3NhbXBsZWQsIGQxNGMpIHsKICAoKGQxNGMgLyAxMDAwKSArIDEpIC8gZXhwKDAuMDAwMTIwOTcgKiAoMTk1MCAtIHllYXJfc2FtcGxlZCkpCiAgfQoKIyBkZWZpbmUgaGVscGVyIGZ1bmN0aW9uIGZvciBzdHJpcHBpbmcgb3V0ICJOQSIgYW5kIG5vbi1FeHBsb3JhdG9yaWVzIGRhdGEKZXh0cmEuY2xlYW4uZnggPC0gZnVuY3Rpb24oZGYpIHsKICBkZiA8LSBkZlt3aGljaChncmVwbCgiSEVHIiwgZGYkUHJvYmUpIHwKICAgICAgICAgICAgICAgICAgIGdyZXBsKCJIRVciLCBkZiRQcm9iZSkgfAogICAgICAgICAgICAgICAgICAgZ3JlcGwoIlNFRyIsIGRmJFByb2JlKSB8CiAgICAgICAgICAgICAgICAgICBncmVwbCgiU0VXIiwgZGYkUHJvYmUpKSwgXQogIGlmKGxlbmd0aChncmVwKCJFeHBlcmltZW50IiwgbmFtZXMoZGYpKSkgPiAwKSB7CiAgICAgZGYgPC0gZGZbd2hpY2goZGYkRXhwZXJpbWVudCAhPSAidG1lIiksIF0gCiAgfQogIGl4IDwtIHdoaWNoKGlzLm5hKGRmJEYxNEMpICYgaXMubmEoZGYkYOKIhjE0Qy4o4oCwKWApKQogIGlmKGxlbmd0aChpeCkgPiAxKSB7CiAgICBkZiA8LSBkZlstaXgsIF0KICB9CiAgcmV0dXJuKGRmKQp9CgojIGV4dHJhY3Qgc3RvcmFnZSBkdXJhdGlvbiBkYXRhIHNlcGFyYXRlbHkKdG1lLjE0Yy5meCA8LSBmdW5jdGlvbihkZikgewogIGRmJFNhbXBsZU5hbWUgPC0gZGYkUHJvYmUKICBkZiRQZXJpb2QgPC0gImluYyIKICBpZihsZW5ndGgoZ3JlcCgiRXhwZXJpbWVudCIsIG5hbWVzKGRmKSkpID4gMCkgewogICAgIGRmIDwtIGRmW3doaWNoKGRmJEV4cGVyaW1lbnQgPT0gInRtZSIpLCBdIAogIH0KICByZXR1cm4oZGYpCn0KYGBgCgoKYGBge3IgcmVhZCB3aWRlIHRzIGRhdGF9CiMgMS4gTG9hZCBmbHV4IGRhdGEgZnJvbSBhaXItZHJ5ICsgc3RvcmFnZSAoZXhwZXJpbWVudCAxKSBhbmQgc3RvcmFnZSBkdXJhdGlvbiAoZXhwZXJpbWVudCAzKSBjb250cm9sIHNhbXBsZXMsIGFuZCBjb252ZXJ0IGZyb20gIndpZGUiIHRvICJsb25nIiBmb3JtYXQgc28gYXMgdG8gbWF0Y2ggb3RoZXIgZGF0YS4gCiMgUmVhZCBhaXItZHJ5ICsgc3RvcmFnZSByZXNwaXJhdGlvbiBjb250cm9sIGRhdGEKYXJjaGl2ZS5jdGwudHMud2lkZSA8LSByZWFkLmNzdigiLi4vZGF0YS9kZXJpdmVkL2FyYy1zdG9yYWdlLXQxLWZsdXgvYXJjLWluY194cGxyX2FyYy1zdG9yYWdlLXQxLWZsdXhfMjAyMC0wNy0wMy5jc3YiKQoKIyBDb252ZXJ0IHRpbWUgZGF0YSBmcm9tIHdpZGUgdG8gbG9uZwphcmNoaXZlLmN0bC50cy5kIDwtIHNlbGVjdChhcmNoaXZlLmN0bC50cy53aWRlLCBzdGFydHNfd2l0aCgiaW5jX3RpbWVfZCIpKSAlPiUKICBwaXZvdF9sb25nZXIoZXZlcnl0aGluZygpLAogICAgICAgICAgICAgICBuYW1lc190byA9ICJ0aW1lcG9pbnRfY210diIsCiAgICAgICAgICAgICAgIG5hbWVzX3ByZWZpeCA9ICJpbmNfdGltZV9kXyIsCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJ0aW1lX2QiKQojIHNvcnQgYnkgdGltZXBvaW50X2NtdHYKYXJjaGl2ZS5jdGwudHMuZCA8LSBkYXRhLmZyYW1lKGFyY2hpdmUuY3RsLnRzLmRbb3JkZXIoYXJjaGl2ZS5jdGwudHMuZCR0aW1lcG9pbnRfY210diksXSkKCiMgQ29udmVydCBtZ0NPMiBkYXRhIGZyb20gd2lkZSB0byBsb25nCmFyY2hpdmUuY3RsLnRzLmNvMiA8LSBzZWxlY3QoYXJjaGl2ZS5jdGwudHMud2lkZSwgc3RhcnRzX3dpdGgoImluY19tZ0NPMl9qYXJfIikpICU+JQogIHBpdm90X2xvbmdlcihldmVyeXRoaW5nKCksCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gInRpbWVwb2ludF9jbXR2IiwKICAgICAgICAgICAgICAgbmFtZXNfcHJlZml4ID0gImluY19tZ0NPMl9qYXJfIiwKICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gIm1nQ08yX2phciIpCiMgc29ydCBieSB0aW1lcG9pbnRfY210dgphcmNoaXZlLmN0bC50cy5jbzIgPC0gYXJjaGl2ZS5jdGwudHMuY28yW29yZGVyKGFyY2hpdmUuY3RsLnRzLmNvMiR0aW1lcG9pbnRfY210diksXQoKIyBhc3NlbWJsZSBpbiBsb25nIGRhdGFmcmFtZSAKYXJjaGl2ZS5jdGwudHMgPC0gZGF0YS5mcmFtZShJRCA9IHJlcCh1bmlxdWUoYXJjaGl2ZS5jdGwudHMud2lkZSRJRCksIDQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmlvZCA9ICJpbmMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVwb2ludF9jbXR2ID0gcmVwKHNlcShmcm9tID0gMiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvID0gNSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhY2ggPSBsZW5ndGgoYXJjaGl2ZS5jdGwudHMud2lkZSRJRCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVfZCA9IGFyY2hpdmUuY3RsLnRzLmQkdGltZV9kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1nQ08yX2phciA9IGFyY2hpdmUuY3RsLnRzLmNvMiRtZ0NPMl9qYXIpCgojIGFkZCBwcmVpbmN1YmF0aW9uIGRhdGEKYXJjaGl2ZS5jdGwudHMucHJlIDwtIGFyY2hpdmUuY3RsLnRzLndpZGVbMTpsZW5ndGgodW5pcXVlKGFyY2hpdmUuY3RsLnRzLndpZGUkSUQpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiSUQiLCAicHJlaW5jX3RpbWVfZCIsICJwcmVpbmNfbWdDTzJfamFyIildCmFyY2hpdmUuY3RsLnRzLnByZSA8LSByZW5hbWUoYXJjaGl2ZS5jdGwudHMucHJlLCB0aW1lX2QgPSBwcmVpbmNfdGltZV9kLCBtZ0NPMl9qYXIgPSBwcmVpbmNfbWdDTzJfamFyKQphcmNoaXZlLmN0bC50cy5wcmUkdGltZXBvaW50X2NtdHYgPC0gMQphcmNoaXZlLmN0bC50cy5wcmUkUGVyaW9kIDwtICJwcmUiCmFyY2hpdmUuY3RsLnRzLnByZSR0aW1lX2RfY210diA8LSBhcmNoaXZlLmN0bC50cy5wcmUkdGltZV9kCiAgCiMgQ2FsY3VsYXRlIHRpbWVfZF9jbXR2CmFyY2hpdmUuY3RsLnRzIDwtIGJpbmRfcm93cygKICBsYXBwbHkoCiAgICBzcGxpdChhcmNoaXZlLmN0bC50cywgYXJjaGl2ZS5jdGwudHMkdGltZXBvaW50X2NtdHYpLAogICAgZnVuY3Rpb24oeCkgewogICAgICB4JHRpbWVfZF9jbXR2IDwtIHgkdGltZV9kICsgCiAgICAgICAgYXJjaGl2ZS5jdGwudHMucHJlW21hdGNoKHgkSUQsIGFyY2hpdmUuY3RsLnRzLnByZSRJRCksICJ0aW1lX2QiXQogICAgICByZXR1cm4oeCkKICAgIH0KICAgICkKICApCgojIHJiaW5kIHByZWluYyBhbmQgaW5jIGRhdGEKYXJjaGl2ZS5jdGwudHMgPC0gcmJpbmQoYXJjaGl2ZS5jdGwudHMucHJlLCBhcmNoaXZlLmN0bC50cykKCiMgYWRkIFNhbXBsZU5hbWUgY29sdW1uIGFuZCByZXN0b3JlIEV4cGVyaW1lbnQgY29sdW1uCmFyY2hpdmUuY3RsLnRzJFNhbXBsZU5hbWUgPC0gYXJjaGl2ZS5jdGwudHMkSUQKYXJjaGl2ZS5jdGwudHMkRXhwZXJpbWVudCA8LSBhcmNoaXZlLmN0bC50cy53aWRlW21hdGNoKGFyY2hpdmUuY3RsLnRzJElELCBhcmNoaXZlLmN0bC50cy53aWRlJElEKSwgIkV4cGVyaW1lbnQiXQoKIyByZW1vdmUgaW50ZXJtZWRpYXRlIGZpbGVzCnJtKGFyY2hpdmUuY3RsLnRzLmQsIGFyY2hpdmUuY3RsLnRzLmNvMiwgYXJjaGl2ZS5jdGwudHMucHJlKQpgYGAKCmBgYHtyIHJlYWQtbG9uZy10cy1kYXRhfQojIDIuIExvYWQgZmx1eCBkYXRhIGZyb20gYWlyLWRyeSArIHN0b3JhZ2Ugc2FtcGxlcyBhbmQgZnJvbSBhaXItZHJ5IGV4cGVyaW1lbnQgKGN0bCAmIHRyZWF0bWVudCksIEMgJiBOIGRhdGEgZm9yIGFsbCB0aGUgRXhwbG9yYXRvcmllcyBzYW1wbGVzIChtZWFzdXJlZCBpbiAyMDExKSwgYW5kIHNvaWwgbWFzcyBhbmQgbW9pc3R1cmUgZGF0YSBmb3IgYWxsIGV4cGVyaW1lbnRzLgojIFJlYWQgWHBsciBDIGFuZCBOIGRhdGEKeHBsci5jbiA8LSByZWFkLmNzdigiLi4vZGF0YS9leHRlcm5hbC9leHBsb3JhdG9yaWVzX2lzY2hvZW5pbmdfc29pbGNuXzIwMTEvMTcwNDA3X0NOX2NvbmNlbnRyYXRpb25zX0V4cGxvcmF0b3JpZXNfRVBfUGxvdHNfMjAxMS5jc3YiKQoKIyBSZWFkIFhwbHIgMTRDIGRhdGEgZm9yIGNvbnRyb2wgc2FtcGxlcyAoInRtZSIgYW5kICJhcmMiIEV4cGVyaW1lbnRzKQp4cGxyLmN0bC5pc28gPC0gcmVhZC54bHN4KCIuLi9kYXRhL2V4dGVybmFsL2V4cGxvcmF0b3JpZXNfaXNjaG9lbmluZ18xNGMtY28yXzIwMTEvMTcwMjI4XzE0Q19SZXNwaXJhdGlvbi54bHN4IikKCiMgUmVhZCBzb2lsIG1hc3MgYW5kIG1vaXN0dXJlIGluZm8gZm9yIGFpci1kcnkgKyBzdG9yYWdlIHRyZWF0bWVudCBzYW1wbGVzCmphcmluZm8uYXJjIDwtIHJlYWQuY3N2KCIuLi9kYXRhL2Rlcml2ZWQvYXJjLXN0b3JhZ2UtdDItamFySW5mby9qYXJfaW5mb3JtYXRpb24uY3N2IikKCiMgUmVhZCBzb2lsIG1hc3MgYW5kIG1vaXN0dXJlIGluZm8gZm9yIGFpci1kcnkgZGF0YQpqYXJpbmZvLnJld2V0IDwtIHJlYWQuY3N2KCIuLi9kYXRhL2Rlcml2ZWQvYWlyLWRyeS0yMDE5LXdoYy9haXItZHJ5LTIwMTktd2hjXzIwMjAtMDctMDMuY3N2IikKCiMgUmVhZCBzb2lsIG1hc3MgYW5kIG1vaXN0dXJlIGluZm8gZm9yIHN0b3JhZ2UgZHVyYXRpb24gdHJlYXRtZW50IHNhbXBsZXMKIyByZW1vdmUgdW5pdCByb3cgYW5kIGNvbnZlcnQgdG8gYXBwcm9wcmlhdGUgdHlwZXMKamFyaW5mby50bWUgPC0gdHlwZS5jb252ZXJ0KHJlYWQueGxzeCgiLi4vZGF0YS9yYXcvbGFiX2plbmFfcmVzdWx0cy1jbzJfMjAxOC0wNy0zMC9BcmNJbmNfSW5jRGF0YV8yMDE4Lnhsc3giLCBzaGVldCA9IDEpWy0xLCBdKQoKIyBSZWFkIER1a2UgaXNvIGFuZCBmbHV4IGRhdGEKdG1lLmN0bC5kdWsgPC0gcmVhZC5jc3YoIi4uL2RhdGEvZGVyaXZlZC9hcmMtdG1lLWR1a2UvYXJjLXRtZS1kdWtlXzIwMjAtMDQtMjkuY3N2IikKCiMgUmVhZCBTaWVycmEgTmV2YWRhIChKdW4ncykgc29pbCBkYXRhCnRtZS5jdGwuc29pbC5zcmEgPC0gcmVhZC5jc3YoIi4uL2RhdGEvZGVyaXZlZC9hcmMtdG1lLXNpZXJyYS9hcmMtdG1lLXNpZXJyYS1zb2lsXzIwMjAtMDQtMjkuY3N2IikKCiMgUmVhZCBPYWsgUmlkZ2UgQyBkYXRhCnRtZS5jdGwub3JubCA8LSByZWFkLmNzdigiLi4vZGF0YS9kZXJpdmVkL2FyYy10bWUtb3JubC9hcmMtdG1lLW9ybmxfMjAyMC0wNC0zMC5jc3YiKQoKIyBSZWFkIGFpci1kcnkgKyBzdG9yYWdlIHJlc3BpcmF0aW9uIGRhdGEKYXJjaGl2ZS5hcmMudHMgPC0gcmVhZC5jc3YoIi4uL2RhdGEvZGVyaXZlZC9hcmMtc3RvcmFnZS10Mi1mbHV4L2FyY2hpdmUtZmx1eC10Ml8yMDIwLTA0LTI0LmNzdiIpCgojIFJlYWQgY29udHJvbCByZXNwaXJhdGlvbiBkYXRhIGZyb20gMjAxOSBhaXItZHJ5IGV4cGVyaW1lbnQKcmV3ZXQuY3RsLnRzIDwtIHJlYWQuY3N2KCIuLi9kYXRhL2Rlcml2ZWQvZnJlc2gtMjAxOS1mbHV4L2ZyZXNoLTIwMTktZmx1eF8yMDIwLTA0LTI0LmNzdiIpCgojIFJlYWQgdHJlYXRtZW50IHJlc3BpcmF0aW9uIGRhdGEgZnJvbSAyMDE5IGFpci1kcnkgZXhwZXJpbWVudApyZXdldC5kcnkudHMgPC0gcmVhZC5jc3YoIi4uL2RhdGEvZGVyaXZlZC9kcmllZC0yMDE5LWZsdXgvZHJpZWQtMjAxOS1mbHV4XzIwMjAtMDQtMjQuY3N2IikKCiMgUmVhZCBTaWVycmEgTmV2YWRhIChKdW4ncykgZmx1eCBkYXRhCnRtZS5jdGwuZmx4LnNyYSA8LSByZWFkLmNzdigiLi4vZGF0YS9kZXJpdmVkL2FyYy10bWUtc2llcnJhL2FyYy10bWUtc2llcnJhLWZsdXhfMjAyMC0wNC0yOS5jc3YiKQoKIyBSZWFkIHN0b3JhZ2UgZHVyYXRpb24gcmVzcGlyYXRpb24gZGF0YQp0bWUudHJ0LnRzIDwtIHJiaW5kKHJlYWQuY3N2KCIuLi9kYXRhL2Rlcml2ZWQvYXJjLXRtZS10Mi1mbHV4L2FyYy10bWUtdDItZmx1eC0xXzIwMjAtMDQtMjcuY3N2Iiwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKSwKICAgICAgICAgICAgICAgICAgICAgICAgcmVhZC5jc3YoIi4uL2RhdGEvZGVyaXZlZC9hcmMtdG1lLXQyLWZsdXgvYXJjLXRtZS10Mi1mbHV4LTJfMjAyMC0wNC0yNy5jc3YiLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpKQoKIyBSZWFkIG1pc2NlbGxhbmVvdXMgc3RvcmFnZSB0cmVhdG1lbnQgZGF0YQp0bWUubWlzYyA8LSByZWFkLmNzdigiLi4vZGF0YS9kZXJpdmVkL2FyYy10bWUtbWlzYy9hcmMtdG1lLW1pc2MtaXNvXzIwMjAtMDQtMjkuY3N2IikKYGBgCgpgYGB7ciBzdW1tYXJpemUgZGF0YSwgaW5jbHVkZSA9IEZBTFNFfQojIDMuIENvbWJpbmUgYW5kIHN1bW1hcml6ZSBkYXRhIGluIGxvbmcgZm9ybWF0IHRvIGNhbGN1bGF0ZSByZXNwaXJhdGlvbiByYXRlcyBhbmQgcGxvdCBvdmVyIHRpbWUKIyBOQjogc2V0ICJpbmNsdWRlIiB0byBmYWxzZSB0byBzdXBwcmVzcyBiaW5kX3Jvd3Mgd2FybmluZyBhYm91dCBjb2VyY2luZyBmYWN0b3IgdG8gY2hhcgojIHJlbW92ZSBmb3JtdWxhX2NoZWNrIGNvbHVtbnMKaW52aXNpYmxlKGxpc3QyZW52KGxhcHBseShsaXN0KGFyY2hpdmUuYXJjLnRzID0gYXJjaGl2ZS5hcmMudHMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV3ZXQuY3RsLnRzID0gcmV3ZXQuY3RsLnRzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJld2V0LmRyeS50cyA9IHJld2V0LmRyeS50cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtZS50cnQudHMgPSB0bWUudHJ0LnRzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbih4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4JGZvcm11bGFfY2hlY2sgPC0gTlVMTAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwKICAgICAgICAgICAgICAgICAgIGVudmlyID0gLkdsb2JhbEVudikKICAgICAgICAgICkKCiMgQWRkIFRyZWF0bWVudCBjb2x1bW5zIHRvIGVhY2ggZGF0YXNldAphcmNoaXZlLmFyYy50cyRUcmVhdG1lbnQgPC0gImFpci1kcnkgKyBzdG9yYWdlIgphcmNoaXZlLmN0bC50cyRUcmVhdG1lbnQgPC0gImNvbnRyb2wiCnRtZS50cnQudHMkVHJlYXRtZW50IDwtICJzdG9yYWdlIGR1cmF0aW9uIgpyZXdldC5jdGwudHMkVHJlYXRtZW50IDwtICJjb250cm9sIgpyZXdldC5kcnkudHMkVHJlYXRtZW50IDwtICJhaXItZHJ5IgoKIyBjb21iaW5lIHJld2V0IGRhdGEKcmV3ZXQudHMgPC0gcmJpbmQocmV3ZXQuY3RsLnRzLCByZXdldC5kcnkudHMpCnJld2V0LnRzJEV4cGVyaW1lbnQgPC0gInJld2V0IgoKIyBhZGQgc29pbCBkcnkgd3QgZGF0YQphcmNoaXZlLmFyYy50cyRkd19nIDwtIGphcmluZm8uYXJjW21hdGNoKGFyY2hpdmUuYXJjLnRzJFNhbXBsZU5hbWUsIGphcmluZm8uYXJjJFNhbXBsZSksICJTb2lsLmRyeS53ZWlnaHRfLmcuIl0KYXJjaGl2ZS5jdGwudHMkZHdfZyA8LSBhcmNoaXZlLmN0bC50cy53aWRlW21hdGNoKGFyY2hpdmUuY3RsLnRzJElELCBhcmNoaXZlLmN0bC50cy53aWRlJElEKSwgImRyeV9zb2lsX3d0X2NvcnJlY3RlZF9nIl0KcmV3ZXQudHMgPC0gbWVyZ2UocmV3ZXQudHMsIGphcmluZm8ucmV3ZXRbICwgYygiSUQiLCAiVHJlYXRtZW50IiwgImR3X2ciKV0sIGJ5ID0gYygiSUQiLCAiVHJlYXRtZW50IikpCnRtZS50cnQudHMgPC0gbWVyZ2UodG1lLnRydC50cywgamFyaW5mby50bWVbICwgYygiTnIuIiwgImRyeS5zb2lsIildLCBieS54ID0gIlNhbXBsZU5hbWUiLCBieS55ID0gIk5yLiIpCmNvbG5hbWVzKHRtZS50cnQudHMpW3doaWNoKG5hbWVzKHRtZS50cnQudHMpID09ICJkcnkuc29pbCIpXSA8LSAiZHdfZyIKCiMgYWRkIGV4cGVyaW1lbnQgY29sIHRvIGFyY2hpdmUuYXJjLnRzLCBzdG9yYWdlLnRydC50cwphcmNoaXZlLmFyYy50cyRFeHBlcmltZW50IDwtICJhcmMiCnRtZS50cnQudHMkRXhwZXJpbWVudCA8LSAidG1lIgoKIyBjb21iaW5lIGFyY2hpdmUgZGF0YSBhbmQgRXhwbG9yYXRvcmllcyBzdG9yYWdlIGR1cmF0aW9uIGRhdGEKYXJjaGl2ZS50cyA8LSByYmluZChhcmNoaXZlLmN0bC50c1t3aGljaChhcmNoaXZlLmN0bC50cyRFeHBlcmltZW50ICE9ICJ0bWUiKSwgXSwgCiAgICAgICAgICAgICAgICAgICAgYXJjaGl2ZS5hcmMudHNbICwgbmFtZXMoYXJjaGl2ZS5jdGwudHMpXSkKdG1lLnRzIDwtIHJiaW5kKGFyY2hpdmUuY3RsLnRzW3doaWNoKGFyY2hpdmUuY3RsLnRzJEV4cGVyaW1lbnQgPT0gInRtZSIpLCBdLAogICAgICAgICAgICAgICAgdG1lLnRydC50c1sgLCBuYW1lcyhhcmNoaXZlLmN0bC50cyldKQoKIyBiaW5kIHRtZS5jdGwuZmx4LnNyYSBkYXRhIHRvIHRtZS50cwojIGFsbCBvdGhlciB0bWUuZmx4IGRhdGEgaXMgYWxyZWFkeSBzdW1tYXJpemVkCnRtZS5jdGwuZmx4LnNyYSRFeHBlcmltZW50IDwtICJ0bWUiCnRtZS5jdGwuZmx4LnNyYSRUcmVhdG1lbnQgPC0gImNvbnRyb2wiCnRtZS5jdGwuZmx4LnNyYSRkd19nIDwtIHRtZS5jdGwuc29pbC5zcmFbbWF0Y2godG1lLmN0bC5mbHguc3JhJEphcl9JRCwgdG1lLmN0bC5zb2lsLnNyYSRKYXJfSUQpLCAiZHdfZyJdCnRtZS50cyA8LSByYmluZCh0bWUudHMsIHRtZS5jdGwuZmx4LnNyYVsgLCBuYW1lcyh0bWUudHMpXSkKCiMgVGVzdCB0aGF0IHJlcXVpcmVkIG5hbWVzIGFyZSBwcmVzZW50Cm5tcyA8LSBjKCJTYW1wbGVOYW1lIiwgIklEIiwgIkV4cGVyaW1lbnQiLCAiVHJlYXRtZW50IiwgIlBlcmlvZCIsICJ0aW1lcG9pbnRfY210diIsICAidGltZV9kIiwgInRpbWVfZF9jbXR2IiwgIm1nQ08yX2phciIsICJkd19nIikKaW52aXNpYmxlKGxhcHBseShsaXN0KGFyY2hpdmUudHMgPSBhcmNoaXZlLnRzLAogICAgICAgICAgICAgICAgICAgICAgcmV3ZXQudHMgPSByZXdldC50cywKICAgICAgICAgICAgICAgICAgICAgIHRtZS50cyksCiAgICAgICBmdW5jdGlvbih4KSB7CiAgICAgICAgIGlmZWxzZSghaXMubmEobWF0Y2gobm1zLCBuYW1lcyh4KSkpLCAieWVzIiwgIm5vIikKICAgICAgIH0KICAgICAgICkpCgojIGNvbWJpbmUgYWxsIGRhdGEgYW5kIHJlbW92ZSB0aW1lIHBvaW50cyB3aXRob3V0IENPMiBtZWFzdXJlbWVudHMKdHMgPC0gYmluZF9yb3dzKGFyY2hpdmUudHNbICwgbm1zXSwgcmV3ZXQudHNbICwgbm1zXSwgdG1lLnRzWyAsIG5tc10pCmlmKGxlbmd0aCh3aGljaChpcy5uYSh0cyRtZ0NPMl9qYXIpKSkgPiAwKSB7CiAgdHMgPC0gdHNbLXdoaWNoKGlzLm5hKHRzJG1nQ08yX2phcikpLCBdCn0KCiMgYWRkIEMgY29udGVudAojIHhwbHIKdHMkZ0NfZ1MgPC0geHBsci5jblttYXRjaCh0cyRJRCwgeHBsci5jbiRFUF9QbG90aWQpLCAiVG90YWxfQyJdKjEwXi0zCiMgZHVrZQp0c1t3aGljaChpcy5uYSh0cyRnQ19nUykpLCAiZ0NfZ1MiXSA8LSB0bWUuY3RsLmR1a1ttYXRjaCh0c1t3aGljaChpcy5uYSh0cyRnQ19nUykpLCAiSUQiXSwgdG1lLmN0bC5kdWskSUQpLCAiQ19nX2tnIl0qMTBeLTMKIyBzaWVycmFzCnRzW3doaWNoKGlzLm5hKHRzJGdDX2dTKSksICJnQ19nUyJdIDwtIHRtZS5jdGwuc29pbC5zcmFbbWF0Y2godHNbd2hpY2goaXMubmEodHMkZ0NfZ1MpKSwgIklEIl0sIHRtZS5jdGwuc29pbC5zcmEkSUQpLCAiZ0Nfa2dTIl0qMTBeLTMKIyBvYWsgcmlkZ2UKdHNbd2hpY2goaXMubmEodHMkZ0NfZ1MpKSwgImdDX2dTIl0gPC0gdG1lLmN0bC5vcm5sW21hdGNoKHRzW3doaWNoKGlzLm5hKHRzJGdDX2dTKSksICJJRCJdLCB0bWUuY3RsLm9ybmwkSUQpLCAiQ19nX2tnIl0qMTBeLTMKCiMgYWRkIFR5cGUKdHMkVHlwZSA8LSBpZmVsc2UoZ3JlcGwoIkciLCB0cyRJRCksICJHIiwgIkYiKQoKIyBjYWxjdWxhdGUgQ08yIHJlc3BpcmF0aW9uIGluIG1nQ08yLUMgcGVyIGcgc29pbCBDCiMgTkI6IDEyLzQ0ID0gbWFzcyByYXRpbyBvZiBDIGluIENPMgp0cyRtZ0NPMi5DX2dDIDwtICh0cyRtZ0NPMl9qYXIqKDEyLzQ0KSkvKHRzJGR3X2cqdHMkZ0NfZ1MpCnRzJG1nQ08yLkNfZ0NfZCA8LSB0cyRtZ0NPMi5DX2dDL3RzJHRpbWVfZAoKIyBzdW1tYXJpemUgQ08yIHJlbGVhc2UgZGF0YSBmb3IgZWFjaCB0aW1lcG9pbnQsIGJ5IGV4cGVyaW1lbnQsIHRyZWF0bWVudCwgYW5kIHR5cGUKdHMuYXZnIDwtIGRhdGEuZnJhbWUobmEub21pdCh0cykgJT4lCiAgc2VsZWN0KEV4cGVyaW1lbnQsIFRyZWF0bWVudCwgVHlwZSwgdGltZXBvaW50X2NtdHYsIG1nQ08yLkNfZ0NfZCwgdGltZV9kX2NtdHYpICAlPiUKICBncm91cF9ieShFeHBlcmltZW50LCBUcmVhdG1lbnQsIFR5cGUsIHRpbWVwb2ludF9jbXR2KSAlPiUKICBhZGRfdGFsbHkoKSAlPiUKICBzdW1tYXJpc2VfYWxsKGxpc3QobWVhbiA9IG1lYW4sIHNkID0gc2QpLCBuYS5ybSA9IFRSVUUpICU+JQogIG11dGF0ZShzZV9zbG9wZSA9IG1nQ08yLkNfZ0NfZF9zZC9zcXJ0KG5fbWVhbiksCiAgICAgICAgIHNlX3Nsb3BlX2wgPSBtZ0NPMi5DX2dDX2RfbWVhbiAtIHNlX3Nsb3BlLAogICAgICAgICBzZV9zbG9wZV91ID0gbWdDTzIuQ19nQ19kX21lYW4gKyBzZV9zbG9wZSkpCgojIGFkZCB0aW1lcG9pbnQgemVybyBkYXRhCnRwMC5mIDwtIGZ1bmN0aW9uKGRmKSB7CiAgdHAwIDwtIGRmWzEsIF0KICB0cDBbICwgLXdoaWNoKG5hbWVzKHRwMCkgPT0gIkV4cGVyaW1lbnQiIHwgbmFtZXModHAwKSA9PSAiVHJlYXRtZW50IiB8IG5hbWVzKHRwMCkgPT0gIlR5cGUiIHwgbmFtZXModHAwKSA9PSAibiIpXSA8LSAwCiAgcmJpbmQodHAwLCBkZikKfQp0cy5hdmckdHJlYXQuRXhwIDwtIHBhc3RlKHRzLmF2ZyRUcmVhdG1lbnQsIHRzLmF2ZyRFeHBlcmltZW50KQp0cy5hdmcgPC0gbGFwcGx5KHNwbGl0KHRzLmF2ZywgdHMuYXZnJHRyZWF0LkV4cCksIGZ1bmN0aW9uKHgpIHsKICBsYXBwbHkoc3BsaXQoeCwgeCRUeXBlKSwgdHAwLmYpCiAgfSkKdHMuYXZnIDwtIGJpbmRfcm93cyhsYXBwbHkodHMuYXZnLCBiaW5kX3Jvd3MpKQoKIyByZXN0b3JlIGNsYXNzZXMKdHMuYXZnIDwtIGFzLmRhdGEuZnJhbWUobGFwcGx5KHRzLmF2ZywgdHlwZS5jb252ZXJ0KSkKYGBgCgojIFJlc3VsdHMKIyMgUmVzcGlyYXRpb24gcmF0ZXMKCmBgYHtyIHJlc3AtcmF0ZS1zdGF0cywgaW5jbHVkZSA9IEZBTFNFfQojIHJld2V0IG1heCByZXNwIHJhdGVzCnQudGVzdCgKICB0YXBwbHkodHNbdHMkRXhwZXJpbWVudCA9PSAicmV3ZXQiICYgdHMkVHJlYXRtZW50ID09ICJhaXItZHJ5IiAmIHRzJFBlcmlvZCA9PSAicHJlIiAmIHRzJFR5cGUgPT0gIkciLCAibWdDTzIuQ19nQ19kIl0sdHNbdHMkRXhwZXJpbWVudCA9PSAicmV3ZXQiICYgdHMkVHJlYXRtZW50ID09ICJhaXItZHJ5IiAmIHRzJFBlcmlvZCA9PSAicHJlIiAmIHRzJFR5cGUgPT0gIkciLCAiU2FtcGxlTmFtZSJdLCBtYXgsIG5hLnJtID0gVFJVRSksCiAgdGFwcGx5KHRzW3RzJEV4cGVyaW1lbnQgPT0gInJld2V0IiAmIHRzJFRyZWF0bWVudCA9PSAiYWlyLWRyeSIgJiB0cyRQZXJpb2QgPT0gInByZSIgJiB0cyRUeXBlID09ICJGIiwgIm1nQ08yLkNfZ0NfZCJdLHRzW3RzJEV4cGVyaW1lbnQgPT0gInJld2V0IiAmIHRzJFRyZWF0bWVudCA9PSAiYWlyLWRyeSIgJiB0cyRQZXJpb2QgPT0gInByZSIgJiB0cyRUeXBlID09ICJGIiwgIlNhbXBsZU5hbWUiXSwgbWF4LCBuYS5ybSA9IFRSVUUpKQpgYGAKCipFeHBlcmltZW50IDEgKGFpci1kcnkgKyBzdG9yYWdlIHRyZWF0bWVudCkqCgpSZXNwaXJhdGlvbiByYXRlcyBpbmNyZWFzZWQgZHJhbWF0aWNhbGx5IGZvbGxvd2luZyByZXdldHRpbmcgZm9yIHRoZSBhaXItZHJ5ICsgc3RvcmFnZSB0cmVhdG1lbnQgaW4gY29tcGFyaXNvbiB0byBjb250cm9sIHNhbXBsZXMsIHNpbWlsYXIgdG8gd2hhdCBoYXMgYmVlbiBvYnNlcnZlZCBpbiBvdGhlciBhaXItZHJ5L3Jld2V0dGluZyBzdHVkaWVzIFtjaXRlXS4gSG93ZXZlciwgdGhlIG1hZ25pdHVkZSBhbmQgdGltaW5nIG9mIHRoZSBwZWFrIGluIHJlc3BpcmF0aW9uIHJhdGVzIHdhcyBzaWduaWZpY2FudGx5IGRpZmZlcmVudCBiZXR3ZWVuIGdyYXNzbGFuZCBhbmQgZm9yZXN0IHNpdGVzIFtzdGF0aXN0aWNzOyBvdGhlciBmb3Jlc3QvZ3Jhc3NsYW5kIHN0dWRpZXMgZm9yIGNvbXBhcmlzb24/XSAqKihGaWcuIDMpKiouCgpBbW9uZyB0aGUgYWlyLWRyeSArIHN0b3JhZ2Ugc2FtcGxlcywgcmVzcGlyYXRpb24gcmF0ZXMgd2VyZSBtb3JlIHRoYW4gdHdpY2UgYXMgaGlnaCBpbiBncmFzc2xhbmQgc29pbHMgdGhhbiBpbiBmb3Jlc3Qgc29pbHMsIHJlYWNoaW5nIGEgbWF4aW11bSBvZiBgciB7cm91bmQobWF4KHRzLmF2ZzJbdHMuYXZnMiRFeHBlcmltZW50ID09ICJhcmMiICYgdHMuYXZnMiRUcmVhdG1lbnQgPT0gImFpci1kcnkgKyBzdG9yYWdlIiAmIHRzLmF2ZzIkVHlwZSA9PSAiRyIsICJtZ0NPMi5DX2dDX2RfbWVhbiJdKSwxKX1gIG1nIENPfjJ+IGcgc29pbCBDXi0xXiBkXi0xXiBhZnRlciBgciB7cm91bmQodHMuYXZnMlt3aGljaCh0cy5hdmcyJG1nQ08yLkNfZ0NfZF9tZWFuID09IG1heCh0cy5hdmcyW3RzLmF2ZzIkRXhwZXJpbWVudCA9PSAiYXJjIiAmIHRzLmF2ZzIkVHJlYXRtZW50ID09ICJhaXItZHJ5ICsgc3RvcmFnZSIgJiB0cy5hdmcyJFR5cGUgPT0gIkciLCAibWdDTzIuQ19nQ19kX21lYW4iXSkpLCAidGltZV9kX2NtdHZfbWVhbiJdKjI0LDApfWAgaCwgZm9sbG93ZWQgYnkgYSBzaGFycCBkZWNsaW5lLiBNZWFuIHJlc3BpcmF0aW9uIHJhdGVzIGluIGZvcmVzdCBzaXRlcyBwZWFrZWQgYXQgYHIge3JvdW5kKG1heCh0cy5hdmcyW3RzLmF2ZzIkRXhwZXJpbWVudCA9PSAiYXJjIiAmIHRzLmF2ZzIkVHJlYXRtZW50ID09ICJhaXItZHJ5ICsgc3RvcmFnZSIgJiB0cy5hdmcyJFR5cGUgPT0gIkYiLCAibWdDTzIuQ19nQ19kX21lYW4iXSksMSl9YCBtZyBDT34yfiBnIHNvaWwgQ14tMV4gZF4tMV4gYWZ0ZXIgYHIge3JvdW5kKHRzLmF2ZzJbd2hpY2godHMuYXZnMiRtZ0NPMi5DX2dDX2RfbWVhbiA9PSBtYXgodHMuYXZnMlt0cy5hdmcyJEV4cGVyaW1lbnQgPT0gImFyYyIgJiB0cy5hdmcyJFRyZWF0bWVudCA9PSAiYWlyLWRyeSArIHN0b3JhZ2UiICYgdHMuYXZnMiRUeXBlID09ICJGIiwgIm1nQ08yLkNfZ0NfZF9tZWFuIl0pKSwgInRpbWVfZF9jbXR2X21lYW4iXSoyNCwwKX1gIGgsIGZvbGxvd2VkIGJ5IGEgbXVjaCBtb3JlIGdyYWR1YWwgZGVjbGluZSB0aGFuIGluIGdyYXNzbGFuZCBzaXRlcy4gQ29udHJvbCBzYW1wbGVzIHJlc3BvbmRlZCBtb3JlIHdlYWtseSBhbmQgbW9yZSBncmFkdWFsbHkgdG8gcmV3ZXR0aW5nLCBhbHRob3VnaCBhcyBpbiB0aGUgdHJlYXRtZW50IHNhbXBsZXMgcmVzcGlyYXRpb24gd2FzIGdyZWF0ZXIgaW4gZ3Jhc3NsYW5kIHNvaWxzIHRoYW4gaW4gZm9yZXN0IHNvaWxzLiBQZWFrIHJlc3BpcmF0aW9uIHJhdGVzIGZvciBjb250cm9sIGluY3ViYXRpb25zIHdlcmUgYHIge3JvdW5kKG1heCh0cy5hdmcyW3RzLmF2ZzIkRXhwZXJpbWVudCA9PSAiYXJjIiAmIHRzLmF2ZzIkVHJlYXRtZW50ID09ICJjb250cm9sIiAmIHRzLmF2ZzIkVHlwZSA9PSAiRyIsICJtZ0NPMi5DX2dDX2RfbWVhbiJdKSwxKX1gIGFuZCBgciB7cm91bmQobWF4KHRzLmF2ZzJbdHMuYXZnMiRFeHBlcmltZW50ID09ICJhcmMiICYgdHMuYXZnMiRUcmVhdG1lbnQgPT0gImNvbnRyb2wiICYgdHMuYXZnMiRUeXBlID09ICJGIiwgIm1nQ08yLkNfZ0NfZF9tZWFuIl0pLDEpfWAgbWcgQ09+Mn4gZyBzb2lsIENeLTFeIGReLTFeIGFmdGVyIGByIHtyb3VuZCh0cy5hdmcyW3doaWNoKHRzLmF2ZzIkbWdDTzIuQ19nQ19kX21lYW4gPT0gbWF4KHRzLmF2ZzJbdHMuYXZnMiRFeHBlcmltZW50ID09ICJhcmMiICYgdHMuYXZnMiRUcmVhdG1lbnQgPT0gImNvbnRyb2wiICYgdHMuYXZnMiRUeXBlID09ICJGIiwgIm1nQ08yLkNfZ0NfZF9tZWFuIl0pKSwgInRpbWVfZF9jbXR2X21lYW4iXSoyNCwwKX1gIGggZm9yIGdyYXNzbGFuZCBhbmQgZm9yZXN0IHNvaWxzLCByZXNwZWN0aXZlbHkuCgoqRXhwZXJpbWVudCAyIChhaXItZHJ5IHRyZWF0bWVudCwgMjAxOSBzYW1wbGVzKSoKClJlc3BpcmF0aW9uIHJhdGVzIGZvciB0aGUgYWlyLWRyeSBvbmx5IHRyZWF0bWVudCBzYW1wbGVzIHNob3dlZCBhIHNpbWlsYXJseSBkcmFtYXRpYyBpbmNyZWFzZSBpbiBjb21wYXJpc29uIHRvIHRoZSBjb250cm9scyBhcyB3YXMgb2JzZXJ2ZWQgZm9yIHRoZSBhaXItZHJ5ICsgc3RvcmFnZSB0cmVhdG1lbnQgc2FtcGxlcyBpbiBFeHBlcmltZW50IDEuIEhvd2V2ZXIsIHVubGlrZSB0aGUgYWlyLWRyeSArIHN0b3JhZ2UgdHJlYXRtZW50LCBwZWFrIHJlc3BpcmF0aW9uIHJhdGVzIHdlcmUgbm90IHNpZ25pZmljYW50bHkgZGlmZmVyZW50IChwID4gMC4wNSkgYmV0d2VlbiBmb3Jlc3QgYW5kIGdyYXNzbGFuZCBzb2lscyBpbiBFeHBlcmltZW50IDIsIHBlYWtpbmcgYXQgYHIge3JvdW5kKG1heCh0cy5hdmcyW3RzLmF2ZzIkRXhwZXJpbWVudCA9PSAicmV3ZXQiICYgdHMuYXZnMiRUcmVhdG1lbnQgPT0gImFpci1kcnkiICYgdHMuYXZnMiRUeXBlID09ICJHIiwgIm1nQ08yLkNfZ0NfZF9tZWFuIl0pLDEpfWAuMCBhbmQgYHIge3JvdW5kKG1heCh0cy5hdmcyW3RzLmF2ZzIkRXhwZXJpbWVudCA9PSAicmV3ZXQiICYgdHMuYXZnMiRUcmVhdG1lbnQgPT0gImFpci1kcnkiICYgdHMuYXZnMiRUeXBlID09ICJGIiwgIm1nQ08yLkNfZ0NfZF9tZWFuIl0pLDEpfWAgbWcgQ09+Mn4gZyBzb2lsIENeLTFeIGReLTFeIGFmdGVyIGByIHtyb3VuZCh0cy5hdmcyW3doaWNoKHRzLmF2ZzIkbWdDTzIuQ19nQ19kX21lYW4gPT0gbWF4KHRzLmF2ZzJbdHMuYXZnMiRFeHBlcmltZW50ID09ICJyZXdldCIgJiB0cy5hdmcyJFRyZWF0bWVudCA9PSAiYWlyLWRyeSIgJiB0cy5hdmcyJFR5cGUgPT0gIkYiLCAibWdDTzIuQ19nQ19kX21lYW4iXSkpLCAidGltZV9kX2NtdHZfbWVhbiJdKjI0LDApfWAgaCBmb3IgZ3Jhc3NsYW5kIGFuZCBmb3Jlc3Qgc29pbHMsIHJlc3BlY3RpdmVseSAqKihGaWcuIDMpKiouCgoqRXhwZXJpbWVudCAzIChzdG9yYWdlIGR1cmF0aW9uKSoKClNhbXBsZXMgd2VyZSBvbmx5IGluY3ViYXRlZCBmb3IgYSBzaW5nbGUgZW5jbG9zdXJlIHBlcmlvZCBmb3IgdGhpcyBleHBlcmltZW50LCBpbnN0ZWFkIG9mIHR3byAocHJlLWluY3ViYXRpb24gZm9sbG93ZWQgYnkgZXF1aWxpYnJpdW0gcmVzcGlyYXRpb24pLiBHcmFzc2xhbmQgc29pbHMgZnJvbSB0aGUgc3RvcmFnZSBkdXJhdGlvbiB0cmVhdG1lbnQgZ3JvdXAgcmVzcG9uZGVkIHJhcGlkbHkgdG8gcmV3ZXR0aW5nIGFuZCByZWFjaGVkIHRhcmdldCBDT34yfiBsZXZlbHMgYWZ0ZXIganVzdCBgciB7cm91bmQodHMuYXZnMlt3aGljaCh0cy5hdmcyJG1nQ08yLkNfZ0NfZF9tZWFuID09IG1heCh0cy5hdmcyW3RzLmF2ZzIkRXhwZXJpbWVudCA9PSAidG1lIiAmIHRzLmF2ZzIkVHJlYXRtZW50ID09ICJzdG9yYWdlIGR1cmF0aW9uIiAmIHRzLmF2ZzIkVHlwZSA9PSAiRyIsICJtZ0NPMi5DX2dDX2RfbWVhbiJdKSksICJ0aW1lX2RfY210dl9tZWFuIl0qMjQsMCl9YCBoIG9mIGluY3ViYXRpb24uIE9ubHkgYSBzaW5nbGUgb2JzZXJ2YXRpb24gd2FzIG1hZGUgZm9yIHRoZSBncmFzc2xhbmQgdHJlYW1lbnQgc2FtcGxlcyBkdWUgdG8gdGhlIHJhcGlkIHJlc3BpcmF0aW9uIHJhdGVzLCB3aGljaCBwZWFrZWQgYXQgYHIge3JvdW5kKG1heCh0cy5hdmcyW3RzLmF2ZzIkRXhwZXJpbWVudCA9PSAidG1lIiAmIHRzLmF2ZzIkVHJlYXRtZW50ID09ICJzdG9yYWdlIGR1cmF0aW9uIiAmIHRzLmF2ZzIkVHlwZSA9PSAiRyIsICJtZ0NPMi5DX2dDX2RfbWVhbiJdKSwxKX1gIG1nIENPfjJ+IGcgc29pbCBDXi0xXiBkXi0xXi4gVGhlIG1lYW4gcGVhayByZXNwaXJhdGlvbiByYXRlIGZvciBmb3Jlc3QgdHJlYXRtZW50IHNhbXBsZXMgd2FzIGxvd2VyIGFuZCBsYWdnZWQgaW4gY29tcGFyaXNvbiB0byB0aGUgZ3Jhc3NsYW5kIHNvaWxzLCByZWFjaGluZyBgciB7cm91bmQobWF4KHRzLmF2ZzJbdHMuYXZnMiRFeHBlcmltZW50ID09ICJ0bWUiICYgdHMuYXZnMiRUcmVhdG1lbnQgPT0gInN0b3JhZ2UgZHVyYXRpb24iICYgdHMuYXZnMiRUeXBlID09ICJGIiwgIm1nQ08yLkNfZ0NfZF9tZWFuIl0pLDEpfWAgbWcgQ09+Mn4gZyBzb2lsIENeLTFeIGReLTFeIGFmdGVyIGByIHtyb3VuZCh0cy5hdmcyW3doaWNoKHRzLmF2ZzIkbWdDTzIuQ19nQ19kX21lYW4gPT0gbWF4KHRzLmF2ZzJbdHMuYXZnMiRFeHBlcmltZW50ID09ICJ0bWUiICYgdHMuYXZnMiRUcmVhdG1lbnQgPT0gInN0b3JhZ2UgZHVyYXRpb24iICYgdHMuYXZnMiRUeXBlID09ICJGIiwgIm1nQ08yLkNfZ0NfZF9tZWFuIl0pKSwgInRpbWVfZF9jbXR2X21lYW4iXSoyNCwwKX1gIGguCgpDb25kaXRpb25zIGZvciBjb250cm9sIGluY3ViYXRpb25zIHZhcmllZC4gR3Jhc3NsYW5kIGNvbnRyb2wgc2FtcGxlcyB3ZXJlIGluY3ViYXRlZCBpbiAyMDExIHVuZGVyIHRoZSBzYW1lIGNvbmRpdGlvbnMgYXMgdGhlIGNvbnRyb2wgc2FtcGxlcyBmcm9tIEV4cGVyaW1lbnQgMSwgaS5lLiA5NiBoIHByZS1pbmN1YmF0aW9uIHBlcmlvZCBmb2xsb3dlZCBieSAxNCBkIG9mIGVxdWlsaWJyaXVtIHJlc3BpcmF0aW9uLiBSZXNwaXJhdGlvbiByYXRlcyBwZWFrZWQgYWZ0ZXIgdGhlIHByZS1pbmN1YmF0aW9uIHBlcmlvZCAoYHIge3JvdW5kKHRzLmF2ZzJbd2hpY2godHMuYXZnMiRtZ0NPMi5DX2dDX2RfbWVhbiA9PSBtYXgodHMuYXZnMlt0cy5hdmcyJEV4cGVyaW1lbnQgPT0gInRtZSIgJiB0cy5hdmcyJFRyZWF0bWVudCA9PSAiY29udHJvbCIgJiB0cy5hdmcyJFR5cGUgPT0gIkciLCAibWdDTzIuQ19nQ19kX21lYW4iXSkpLCAidGltZV9kX2NtdHZfbWVhbiJdKjI0LDApfWAgaCksIGF0IGByIHtyb3VuZChtYXgodHMuYXZnMlt0cy5hdmcyJEV4cGVyaW1lbnQgPT0gInRtZSIgJiB0cy5hdmcyJFRyZWF0bWVudCA9PSAiY29udHJvbCIgJiB0cy5hdmcyJFR5cGUgPT0gIkciLCAibWdDTzIuQ19nQ19kX21lYW4iXSksMSl9YCBtZyBDT34yfiBnIHNvaWwgQ14tMV4gZF4tMV4uIEZvcmVzdCBjb250cm9sIHNhbXBsZXMgd2VyZSBwcmUtaW5jdWJhdGVkIHVuZGVyIHZhcmlvdXMgY29uZGl0aW9ucywgYnV0IHJlc3BpcmF0aW9uIHJhdGVzIHdlcmUgb25seSBtZWFzdXJlZCBkdXJpbmcgdGhlIHByZS1pbmN1YmF0aW9uIHBlcmlvZCBmb3IgdHdvIHNhbXBsZXMgZnJvbSB0aGUgU2llcnJhIE5ldmFkYSBtb3VudGFpbnMgKFVTQSkuIEluIGdlbmVyYWwsIHJlc3BpcmF0aW9uIHJhdGVzIGZvciBmb3Jlc3QgY29udHJvbCBzYW1wbGVzIGluIEV4cGVyaW1lbnQgMyB3ZXJlIG11Y2ggbG93ZXIgdGhhbiBpbiB0aGUgdHJlYXRtZW50IGluY3ViYXRpb25zLCBwZWFraW5nIGF0IGByIHtyb3VuZChtYXgodHMuYXZnMlt0cy5hdmcyJEV4cGVyaW1lbnQgPT0gInRtZSIgJiB0cy5hdmcyJFRyZWF0bWVudCA9PSAiY29udHJvbCIgJiB0cy5hdmcyJFR5cGUgPT0gIkYiLCAibWdDTzIuQ19nQ19kX21lYW4iXSksMSl9YCBtZyBDT34yfiBnIHNvaWwgQ14tMV4gZF4tMV4gYWZ0ZXIgYHIge3JvdW5kKHRzLmF2ZzJbd2hpY2godHMuYXZnMiRtZ0NPMi5DX2dDX2RfbWVhbiA9PSBtYXgodHMuYXZnMlt0cy5hdmcyJEV4cGVyaW1lbnQgPT0gInRtZSIgJiB0cy5hdmcyJFRyZWF0bWVudCA9PSAiY29udHJvbCIgJiB0cy5hdmcyJFR5cGUgPT0gIkYiLCAibWdDTzIuQ19nQ19kX21lYW4iXSkpLCAidGltZV9kX2NtdHZfbWVhbiJdKjI0LDApfWAgaC4KCmBgYHtyIENPMi1yZXNwLXJhdGVzfQojIHBsb3R0ZWQgYXMgbWVhc3VyZWQKdHMuYXZnICU+JQogIGZpbHRlcihFeHBlcmltZW50ICE9ICJ0bWUiKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHRpbWVfZF9jbXR2X21lYW4sIG1nQ08yLkNfZ0NfZF9tZWFuKSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDQsIGNvbG9yPSJncmF5IikgKwogIGdlb21fcmliYm9uKGFlcyh5bWluID0gc2Vfc2xvcGVfbCwgeW1heCA9IHNlX3Nsb3BlX3UsIGZpbGwgPSBUeXBlLCBsaW5ldHlwZSA9IFRyZWF0bWVudCwgYWxwaGEgPSBUcmVhdG1lbnQpKSArCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBUeXBlLCBzaGFwZSA9IFRyZWF0bWVudCkpICsKICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gVHlwZSwgbGluZXR5cGUgPSBUcmVhdG1lbnQpKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhFeHBlcmltZW50KSwKICAgICAgICAgICAgIGxhYmVsbGVyID0gbGFiZWxsZXIoRXhwZXJpbWVudCA9IGMoImFyYyIgPSAiMjAxMSIsICJyZXdldCIgPSAiMjAxOSIpKSkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDAsMTgpKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAnRWNvc3lzdGVtJywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID1jKCdGJz0nI2EzNTUxMycsJ0cnPScjMTM2MWEzJyksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ0ZvcmVzdCcsJ0dyYXNzbGFuZCcpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwobmFtZSA9ICdTdGQuIEVyci4nLAogICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9YygnRic9JyNhMzU1MTMnLCdHJz0nIzEzNjFhMycpLAogICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ0ZvcmVzdCcsJ0dyYXNzbGFuZCcpKSArCiAgc2NhbGVfYWxwaGFfbWFudWFsKG5hbWUgPSAnVHJlYXRtZW50JywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYWlyLWRyeSArIHN0b3JhZ2UiID0gLjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRyb2wiID0gLjQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpci1kcnkiID0gLjIpKSArCiAgc2NhbGVfbGluZXR5cGVfbWFudWFsKG5hbWUgPSAnVHJlYXRtZW50JywKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYWlyLWRyeSArIHN0b3JhZ2UiID0gJ2Rhc2hlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRyb2wiID0nc29saWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5IiA9ICJkYXNoZWQiKSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gJ1RyZWF0bWVudCcsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFpci1kcnkgKyBzdG9yYWdlIiA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRyb2wiID0gMTYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpci1kcnkiID0gMSkpICsKICB5bGFiKGV4cHJlc3Npb24oJ1Jlc3BpcmF0aW9uIFJhdGUgKG1nQ08nWzJdKictQyBnQydeLTEqJ2QnXi0xKicpJykpICsKICB4bGFiKCJUaW1lIChkYXlzKSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKQoKIyBwbG90IGFsbCB0aHJlZSBleHBlcmltZW50cwp0cy5hdmcgJT4lCiAgZ2dwbG90KC4sIGFlcyh0aW1lX2RfY210dl9tZWFuLCBtZ0NPMi5DX2dDX2RfbWVhbikpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSA0LCBjb2xvcj0iZ3JheSIpICsKICBnZW9tX3JpYmJvbihhZXMoeW1pbiA9IHNlX3Nsb3BlX2wsIHltYXggPSBzZV9zbG9wZV91LCBmaWxsID0gVHlwZSwgbGluZXR5cGUgPSBUcmVhdG1lbnQsIGFscGhhID0gVHJlYXRtZW50KSkgKwogIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gVHlwZSwgc2hhcGUgPSBUcmVhdG1lbnQpKSArCiAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IFR5cGUsIGxpbmV0eXBlID0gVHJlYXRtZW50KSkgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoRXhwZXJpbWVudCkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDE4KSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gJ0Vjb3N5c3RlbScsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9YygnRic9JyNhMzU1MTMnLCdHJz0nIzEzNjFhMycpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCdGb3Jlc3QnLCdHcmFzc2xhbmQnKSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKG5hbWUgPSAnU3RkLiBFcnIuJywKICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPWMoJ0YnPScjYTM1NTEzJywnRyc9JyMxMzYxYTMnKSwKICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCdGb3Jlc3QnLCdHcmFzc2xhbmQnKSkgKwogIHNjYWxlX2FscGhhX21hbnVhbChuYW1lID0gJ1RyZWF0bWVudCcsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFpci1kcnkgKyBzdG9yYWdlIiA9IC4yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250cm9sIiA9IC40LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5IiA9IC4yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdG9yYWdlIGR1cmF0aW9uIiA9IC4yKSkgKwogIHNjYWxlX2xpbmV0eXBlX21hbnVhbChuYW1lID0gJ1RyZWF0bWVudCcsCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFpci1kcnkgKyBzdG9yYWdlIiA9ICdkYXNoZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250cm9sIiA9J3NvbGlkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeSIgPSAiZGFzaGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RvcmFnZSBkdXJhdGlvbiIgPSAiZGFzaGVkIikpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICdUcmVhdG1lbnQnLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhaXItZHJ5ICsgc3RvcmFnZSIgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250cm9sIiA9IDE2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5IiA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0b3JhZ2UgZHVyYXRpb24iID0gMSkpICsKICB5bGFiKGV4cHJlc3Npb24oJ1Jlc3BpcmF0aW9uIFJhdGUgKG1nQ08nWzJdKictQyBnQydeLTEqJ2QnXi0xKicpJykpICsKICB4bGFiKCJUaW1lIChkYXlzKSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKQpgYGAKCj4qKkZpZy4gYHIgeyhmaWcubiArIDEpfWAuIFJlc3BpcmF0aW9uIHJhdGVzIGZvciBFeHBlcmltZW50IDEgKGFpci1kcnkgKyBzdG9yYWdlIHRyZWF0bWVudCkgYW5kIEV4cGVyaW1lbnQgMiAoYWlyLWRyeSBvbmx5IHRyZWF0bWVudCkqKgoKPipDYXB0aW9uOiogVG9wIHBhbmVsIHNob3dzIGRhdGEgZnJvbSBFeHBlcmltZW50IDEgKGFpci1kcnkgKyBzdG9yYWdlIHRyZWF0bWVudCksIGJvdHRvbSBwYW5lbCBzaG93cyBkYXRhIGZyb20gRXhwZXJpbWVudCAyIChhaXItZHJ5IG9ubHkgdHJlYXRtZW50KS4gVmVydGljYWwgZ3JheSBsaW5lIGRlbWFyY2F0ZXMgdGhlIHByZS1pbmN1YmF0aW9uIHBlcmlvZCBmcm9tIHRoZSBlcXVpbGlicml1bSByZXNwaXJhdGlvbiBwZXJpb2QuIFBvaW50cyBzaG93IG1lYXN1cmVtZW50cyBhbmQgbGluZXMgc2hvdyB0cmVuZHMgaW4gbWVhbiByZXNwaXJhdGlvbiByYXRlcy4gU2hhZGVkIHJpYmJvbnMgcmVwcmVzZW50IHRoZSBzdGFuZGFyZCBlcnJvci4gVGhlIGZpbmFsIG1lYXN1cmVtZW50IHBvaW50cyBmb3IgYSBmZXcgc2FtcGxlcyB3aGljaCB0b29rID4xOCBkYXlzIHRvIHJlYWNoIENPfjJ+IHRhcmdldHMgYXJlIGV4Y2x1ZGVkIGZvciBkaXNwbGF5IHJlYXNvbnMuIFJlc3BpcmF0aW9uIHJhdGVzIGZvciB0aG9zZSBzYW1wbGVzIHJlbWFpbmVkIGZsYXQuIE5vdGUgdGhhdCBDT34yfiBjb25jZW50cmF0aW9ucyBmb3IgY29udHJvbCBzYW1wbGUgaW5jdWJhdGlvbnMgaW4gRXhwZXJpbWVudCAxIHdlcmUgb25seSBtZWFzdXJlZCBvbmNlIGR1cmluZyB0aGUgcHJlLWluY3ViYXRpb24gcGVyaW9kLCBzbyByYXRlcyBhcmUgc2hvd24gYXMgdGhlIGN1bXVsYXRpdmUgYXZlcmFnZS4gRm9yIHB1cnBvc2VzIG9mIGNvbXBhcmlzb24sIFN1cHBsZW1lbnRhbCBGaWd1cmUgMSBzaG93cyBhbGwgZGF0YSBwbG90dGVkIHdpdGggcHJlLWluY3ViYXRpb24gcmVzcGlyYXRpb24gcmF0ZXMgY2FsY3VsYXRlZCBhcyBhIGN1bXVsYXRpdmUgYXZlcmFnZS4KCipTdXBwbGVtZW50YWwgcmVzcGlyYXRpb24gcmF0ZXMgZmlndXJlOioKCmBgYHtyIENPMi1mbHV4LXBsb3RzLVNJfQojIE5vdGU6IHRoaXMgY29kZSBwbG90cyBkYXRhIHdpdGggcHJlLWluY3ViYXRpb24gb2JzZXJ2YXRpb25zIGF2ZXJhZ2VkCiMgUGxvdCByZXNwIHJhdGVzIG92ZXIgdGltZQp0cy5wcmUgPC0gdHNbdHMkUGVyaW9kID09ICJwcmUiLCBdCnRzLnByZS5hdmcgPC0gdHMucHJlICU+JQogIGZpbHRlcih0aW1lX2RfY210diA+IDMuNSkgJT4lCiAgc2VsZWN0KEV4cGVyaW1lbnQsIFRyZWF0bWVudCwgVHlwZSwgdGltZXBvaW50X2NtdHYsIFNhbXBsZU5hbWUsIG1nQ08yLkNfZ0MsIHRpbWVfZF9jbXR2KSAgJT4lCiAgZ3JvdXBfYnkoRXhwZXJpbWVudCwgVHJlYXRtZW50LCBUeXBlLCB0aW1lcG9pbnRfY210diwgU2FtcGxlTmFtZSkgJT4lCiAgc3VtbWFyaXNlX2FsbChsaXN0KG1lYW4gPSBtZWFuKSwgbmEucm0gPSBUUlVFKSAlPiUKICBtdXRhdGUobWdDTzIuQ19nQ19kID0gbWdDTzIuQ19nQ19tZWFuL3RpbWVfZF9jbXR2X21lYW4pICU+JQogIHNlbGVjdCgtU2FtcGxlTmFtZSwgLW1nQ08yLkNfZ0NfbWVhbiwgRXhwZXJpbWVudCwgVHJlYXRtZW50LCBUeXBlLCBtZ0NPMi5DX2dDX2QsIHRpbWVfZF9jbXR2X21lYW4pICU+JQogIGdyb3VwX2J5KEV4cGVyaW1lbnQsIFRyZWF0bWVudCwgVHlwZSkgJT4lCiAgYWRkX3RhbGx5KCkgJT4lCiAgc3VtbWFyaXNlX2FsbChsaXN0KG1lYW4gPSBtZWFuLCBzZCA9IHNkKSwgbmEucm0gPSBUUlVFKSAlPiUKICBtdXRhdGUoc2Vfc2xvcGUgPSBtZ0NPMi5DX2dDX2Rfc2Qvc3FydChuX21lYW4pLAogICAgICAgICBzZV9zbG9wZV9sID0gbWdDTzIuQ19nQ19kX21lYW4gLSBzZV9zbG9wZSwKICAgICAgICAgc2Vfc2xvcGVfdSA9IG1nQ08yLkNfZ0NfZF9tZWFuICsgc2Vfc2xvcGUpCgp0cy5pbmMuYXZnIDwtIHRzICU+JQogIGZpbHRlcihQZXJpb2QgPT0gImluYyIpICU+JQogIHNlbGVjdChFeHBlcmltZW50LCBUcmVhdG1lbnQsIFR5cGUsIHRpbWVwb2ludF9jbXR2LCBtZ0NPMi5DX2dDX2QsIHRpbWVfZF9jbXR2KSAgJT4lCiAgZ3JvdXBfYnkoRXhwZXJpbWVudCwgVHJlYXRtZW50LCBUeXBlLCB0aW1lcG9pbnRfY210dikgJT4lCiAgYWRkX3RhbGx5KCkgJT4lCiAgc3VtbWFyaXNlX2FsbChsaXN0KG1lYW4gPSBtZWFuLCBzZCA9IHNkKSwgbmEucm0gPSBUUlVFKSAlPiUKICBtdXRhdGUoc2Vfc2xvcGUgPSBtZ0NPMi5DX2dDX2Rfc2Qvc3FydChuX21lYW4pLAogICAgICAgICBzZV9zbG9wZV9sID0gbWdDTzIuQ19nQ19kX21lYW4gLSBzZV9zbG9wZSwKICAgICAgICAgc2Vfc2xvcGVfdSA9IG1nQ08yLkNfZ0NfZF9tZWFuICsgc2Vfc2xvcGUpCgpjb2xuYW1lcyh0cy5wcmUuYXZnKVt3aGljaChuYW1lcyh0cy5wcmUuYXZnKSAlaW4lIGMoInRpbWVwb2ludF9jbXR2X21lYW4iLAogICAgICAgICAgICAgICAgICAgICAgICJ0aW1lX2RfY210dl9tZWFuX21lYW4iLAogICAgICAgICAgICAgICAgICAgICAgICJ0aW1lX2RfY210dl9tZWFuX3NkIikpXSA8LSBjKCJ0aW1lcG9pbnRfY210diIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGltZV9kX2NtdHZfbWVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGltZV9kX2NtdHZfc2QiKQoKdHMucHJlLmF2ZyA8LSB0cy5wcmUuYXZnWyAsIC13aGljaCghbmFtZXModHMucHJlLmF2ZykgJWluJSBuYW1lcyh0cy5pbmMuYXZnKSldCgp0cy5hdmcyIDwtIGRhdGEuZnJhbWUocmJpbmQodHMucHJlLmF2ZywgdHMuaW5jLmF2ZykpCnRzLmF2ZzIgPC0gdHMuYXZnMltjb21wbGV0ZS5jYXNlcyh0cy5hdmcyKSwgXQoKIyBhZGQgdGltZXBvaW50IHplcm8gZGF0YQp0cy5hdmcyJHRyZWF0LkV4cCA8LSBwYXN0ZSh0cy5hdmcyJFRyZWF0bWVudCwgdHMuYXZnMiRFeHBlcmltZW50KQp0cy5hdmcyIDwtIGxhcHBseShzcGxpdCh0cy5hdmcyLCB0cy5hdmcyJHRyZWF0LkV4cCksIGZ1bmN0aW9uKHgpIHsKICBsYXBwbHkoc3BsaXQoeCwgeCRUeXBlKSwgdHAwLmYpCiAgfSkKdHMuYXZnMiA8LSBiaW5kX3Jvd3MobGFwcGx5KHRzLmF2ZzIsIGJpbmRfcm93cykpCgojIHJlc3RvcmUgY2xhc3Nlcwp0cy5hdmcyIDwtIGFzLmRhdGEuZnJhbWUobGFwcGx5KHRzLmF2ZzIsIHR5cGUuY29udmVydCkpCgojIHBsb3QKdHMuYXZnMiAlPiUKICBmaWx0ZXIoRXhwZXJpbWVudCAhPSAidG1lIikgJT4lCiAgZ2dwbG90KC4sIGFlcyh0aW1lX2RfY210dl9tZWFuLCBtZ0NPMi5DX2dDX2RfbWVhbikpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSA0LCBjb2xvcj0iZ3JheSIpICsKICBnZW9tX3JpYmJvbihhZXMoeW1pbiA9IHNlX3Nsb3BlX2wsIHltYXggPSBzZV9zbG9wZV91LCBmaWxsID0gVHlwZSwgbGluZXR5cGUgPSBUcmVhdG1lbnQsIGFscGhhID0gVHJlYXRtZW50KSkgKwogIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gVHlwZSwgc2hhcGUgPSBUcmVhdG1lbnQpKSArCiAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IFR5cGUsIGxpbmV0eXBlID0gVHJlYXRtZW50KSkgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoRXhwZXJpbWVudCksCiAgICAgICAgICAgICBsYWJlbGxlciA9IGxhYmVsbGVyKEV4cGVyaW1lbnQgPSBjKCJhcmMiID0gIjIwMTEiLCAicmV3ZXQiID0gIjIwMTkiKSkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDE4KSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gJ0Vjb3N5c3RlbScsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9YygnRic9JyNhMzU1MTMnLCdHJz0nIzEzNjFhMycpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCdGb3Jlc3QnLCdHcmFzc2xhbmQnKSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKG5hbWUgPSAnU3RkLiBFcnIuJywKICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPWMoJ0YnPScjYTM1NTEzJywnRyc9JyMxMzYxYTMnKSwKICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCdGb3Jlc3QnLCdHcmFzc2xhbmQnKSkgKwogIHNjYWxlX2FscGhhX21hbnVhbChuYW1lID0gJ1RyZWF0bWVudCcsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFpci1kcnkgKyBzdG9yYWdlIiA9IC4yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250cm9sIiA9IC40LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5IiA9IC4yKSkgKwogIHNjYWxlX2xpbmV0eXBlX21hbnVhbChuYW1lID0gJ1RyZWF0bWVudCcsCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFpci1kcnkgKyBzdG9yYWdlIiA9ICdkYXNoZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250cm9sIiA9J3NvbGlkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeSIgPSAiZGFzaGVkIikpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICdUcmVhdG1lbnQnLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhaXItZHJ5ICsgc3RvcmFnZSIgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250cm9sIiA9IDE2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5IiA9IDEpKSArCiAgeWxhYihleHByZXNzaW9uKCdSZXNwaXJhdGlvbiBSYXRlIChtZ0NPJ1syXSonLUMgZ0MnXi0xKidkJ14tMSonKScpKSArCiAgeGxhYigiVGltZSAoZGF5cykiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCgo+KipTdXBwbGVtZW50YWwgRmlnIGByIHsoc2ZpZy5uIDwtIDEpfWAuIFJlc3BpcmF0aW9uIHJhdGVzIGZvciBFeHBlcmltZW50IDEgYW5kIEV4cGVyaW1lbnQgMiBzaG93biB3aXRoIGFsbCBwcmUtaW5jdWJhdGlvbiBkYXRhIGNhbGN1bGF0ZWQgYXMgY3VtdWxhdGl2ZSBhdmVyYWdlcyoqCgo+KkNhcHRpb246KiBDT34yfiBjb25jZW50cmF0aW9ucyBmb3IgRXhwZXJpbWVudCAxIGNvbnRyb2wgc2FtcGxlcyB3ZXJlIG9ubHkgbWVhc3VyZWQgb25jZSBkdXJpbmcgdGhlIHByZS1pbmN1YmF0aW9uIHBlcmlvZCwgaW4gY29udHJhc3QgdG8gZGFpbHkgbWVhc3VyZW1lbnRzIGZvciBhbGwgb3RoZXIgc2FtcGxlcy4gUHJlLWluY3ViYXRpb24gcmVzcGlyYXRpb24gcmF0ZXMgYXJlIHNob3duIGhlcmUgY2FsY3VsYXRlZCBhcyBjdW11bGF0aXZlIGF2ZXJhZ2VzIGZvciB0aGUgcHVycG9zZSBvZiBmYWlyIGNvbXBhcmlzb24gYWNyb3NzIGFsbCB0cmVhdG1lbnRzLgoKCiMjIFJhZGlvY2FyYm9uIGRhdGEKCmBgYHtyIGxvYWQgYW1zLWplbmEtaW5nZXN0IGZ4fQojIDEuIFJlYWQgaW4gaXNvdG9wZSBkYXRhIGZyb20gdmFyaW91cyBzb3VyY2VzCiMgRmlyc3QgbG9hZCBoZWxwZXIgZnVuY3Rpb25zICdyZWFkX2plbmFfYW1zX3Jlc3VsdHMuUicsICdyZWFkX2plbmFfaXNvX3Jlc3VsdHMuUicgCnNvdXJjZSgiLi91dGlsaXRpZXMvamVuYV9hbXNfaW5nZXN0LlIiKQpzb3VyY2UoIi4vdXRpbGl0aWVzL2plbmFfaXNvX2luZ2VzdC5SIikKYGBgCgpgYGB7ciByZWFkIGlzbyBkYXRhfQojIDIuIE5leHQgcmVhZCBpbiBkYXRhIGZyb20gdGhlIGFwcHJvcHJpYXRlIGRpcmVjdG9yaWVzIGluICdkYXRhL3JhdycKIyAxNEMKIyBpZGVudGlmeSBzdWJkaXJlY3RvcmllcyBpbiAncmF3JyBkaXJlY3Rvcnkgd2l0aCAiYW1zX2plbmEiIGluIG5hbWUKYW1zX2plbmFfcmVzdWx0c19kaXJzIDwtIGxpc3QuZmlsZXMoIi4uL2RhdGEvcmF3IiwgcGF0dGVybiA9ICJhbXNfamVuYV9yZXN1bHRzIiwgZnVsbC5uYW1lcyA9IFRSVUUpCmFtc19yZXN1bHRzX2xzIDwtIGxhcHBseShzZXFfYWxvbmcoYW1zX2plbmFfcmVzdWx0c19kaXJzKSwgZnVuY3Rpb24oaSkgewogIHJlYWRfamVuYV9hbXNfcmVzdWx0cyhhbXNfamVuYV9yZXN1bHRzX2RpcnNbaV0pCn0pCm5hbWVzKGFtc19yZXN1bHRzX2xzKSA8LSBsaXN0LmZpbGVzKCIuLi9kYXRhL3JhdyIsIHBhdHRlcm4gPSAiYW1zX2plbmFfcmVzdWx0cyIpCgojIDEzQwojIGlkZW50aWZ5IHN1YmRpcmVjdG9yaWVzIGluICdyYXcnIGRpcmVjdG9yeSB3aXRoICJpc29famVuYSIgaW4gbmFtZQppc29famVuYV9yZXN1bHRzX2RpcnMgPC0gbGlzdC5maWxlcygiLi4vZGF0YS9yYXciLCBwYXR0ZXJuID0gImlzb19qZW5hX3Jlc3VsdHMiLCBmdWxsLm5hbWVzID0gVFJVRSkKaXNvX3Jlc3VsdHNfbHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhpc29famVuYV9yZXN1bHRzX2RpcnMpLCBmdW5jdGlvbihpKSB7CiAgcmVhZF9qZW5hX2lzb19yZXN1bHRzKGlzb19qZW5hX3Jlc3VsdHNfZGlyc1tpXSkKfSkKbmFtZXMoaXNvX3Jlc3VsdHNfbHMpIDwtIGxpc3QuZmlsZXMoIi4uL2RhdGEvcmF3IiwgcGF0dGVybiA9ICJpc29famVuYV9yZXN1bHRzIikKYGBgCgpgYGB7ciBhcmMgYW5kIHJld2V0IGV4cGVyaW1lbnQgdGVtcGxhdGV9CiMgMy4gQ3JlYXRlIGEgInRpZHkiIHN0eWxlIHRlbXBsYXRlIGZvciB0aGUgZGF0YSwgaS5lLiB2YXJpYWJsZXMgaW4gY29sdW1ucy4gCiMgS2V5IHZhcmlhYmxlcyBhcmUgYXMgZm9sbG93czoKIyAgICogU2FtcGxlTmFtZSAoaW5jb3Jwb3JhdGVzIGxhYiByZXAgYW5kIHRyZWF0bWVudCwgZS5nLiAiSEVHMTAtMV9kcnkiKQojICAgKiBJRCAocGxvdCBJRHMsIGUuZy4gZm9yICJIRUcxMCIgZm9yIEV4cGxvcmF0b3J5IHNhbXBsZXMpCiMgICAqIFRyZWF0bWVudCAoMyB0cmVhdG1lbnRzOiBhaXItZHJ5LCBhaXItZHJ5ICsgc3RvcmFnZSwgc3RvcmFnZSBkdXJhdGlvbjsgKyBjb250cm9scykKIyAgICogVHlwZSAoMiBsZXZlbHM6IEYgPSBmb3Jlc3QsIEcgPSBncmFzc2xhbmQpCiMgICAqIFBlcmlvZCAoaW5jdWJhdGlvbiBwZXJpb2QsIDIgbGV2ZWxzOiBwcmUgPSBwcmVpbmN1YmF0aW9uLCBpbmMgPSBlcXVpbGlicml1bSBpbmN1YmF0aW9uKQojICAgKiBFeHBlcmltZW50ICgzIGxldmVsczogYXJjID0gYWlyLWRyeSArIHN0b3JhZ2UsIHJld2V0ID0gYWlyLWRyeS9yZXdldCwgdGltZSA9IHN0b3JhZ2UgZHVyYXRpb24pCiMgCiMgKiBPYnNlcnZhdGlvbmFsIGNvbHVtbnMgaW5jbHVkZToKIyAgICogZDE0YyAoJFxEZWx0YSReMTReQy1DT34yfikKIyAgICogZDEzYyAoJFxkZWx0YSReMTNeQy1DT34yfikKIyAgICogQ19nX2tnIChDIGNvbnRlbnQpCiMgICAqIGR3X2cgKGRyeSB3ZWlnaHQpCiMgICAqIG1nQ08yLkNfZ1MgKG1nIENPfjJ+LUMgcmVzcGlyZWQgZ14tMV4gc29pbCBQZXJpb2ReLTFeKQojICAgKiB0aW1lX2QgKGRheXMgaW4gaW5jdWJhdGlvbiBwZXJpb2QgcHJpb3IgdG8gbWVhc3VyZW1lbnQpCiMgICAqIGRIMk9fZ3JhdiAocGVyY2VudCBjaGFuZ2UgaW4gZ3JhdmltZXRyaWMgd2F0ZXIgY29udGVudCBkdWUgdG8gbGFib3JhdG9yeSBtb2lzdHVyZSBhZGp1c3RtZW50KQojICAgKiBkSDJPX3doYyAocGVyY2VudCBjaGFuZ2UgaW4gd2F0ZXIgaG9sZGluZyBjYXBhY2l0eSBkdWUgdG8gbGFib3JhdG9yeSBtb2lzdHVyZSBhZGp1c3RtZW50KQogIAp1bmlxdWUuaWQubiA8LSBjKGxlbmd0aCh1bmlxdWUoYXJjaGl2ZS50c1thcmNoaXZlLnRzJFRyZWF0bWVudCA9PSAiY29udHJvbCIsICJTYW1wbGVOYW1lIl0pKSwKICAgICAgICAgICAgICAgICBsZW5ndGgodW5pcXVlKGFyY2hpdmUudHNbYXJjaGl2ZS50cyRUcmVhdG1lbnQgPT0gImFpci1kcnkgKyBzdG9yYWdlIiwgIlNhbXBsZU5hbWUiXSkpLAogICAgICAgICAgICAgICAgIGxlbmd0aCh1bmlxdWUocmV3ZXQuY3RsLnRzJFNhbXBsZU5hbWUpKSwKICAgICAgICAgICAgICAgICBsZW5ndGgodW5pcXVlKHJld2V0LmRyeS50cyRTYW1wbGVOYW1lKSkpCnByZS4xNGMgPC0gZGF0YS5mcmFtZShTYW1wbGVOYW1lID0gYyhhcy5jaGFyYWN0ZXIodW5pcXVlKGFyY2hpdmUudHNbYXJjaGl2ZS50cyRUcmVhdG1lbnQgPT0gImNvbnRyb2wiLCAiU2FtcGxlTmFtZSJdKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcy5jaGFyYWN0ZXIodW5pcXVlKGFyY2hpdmUudHNbYXJjaGl2ZS50cyRUcmVhdG1lbnQgPT0gImFpci1kcnkgKyBzdG9yYWdlIiwgIlNhbXBsZU5hbWUiXSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMuY2hhcmFjdGVyKHVuaXF1ZShyZXdldC5jdGwudHMkU2FtcGxlTmFtZSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMuY2hhcmFjdGVyKHVuaXF1ZShyZXdldC5kcnkudHMkU2FtcGxlTmFtZSkpKSkKcHJlLjE0YyRJRCA8LSBzdWJzdHIocHJlLjE0YyRTYW1wbGVOYW1lLCAxLCA1KQpwcmUuMTRjJFR5cGUgPC0gaWZlbHNlKGdyZXBsKCJHIiwgcHJlLjE0YyRJRCksICJHIiwgIkYiKQpwcmUuMTRjJEV4cGVyaW1lbnQgPC0gYyhyZXAoImFyYyIsIHVuaXF1ZS5pZC5uWzFdICsgdW5pcXVlLmlkLm5bMl0pLAogICAgICAgICAgICAgICAgICAgICAgIHJlcCgicmV3ZXQiLCB1bmlxdWUuaWQublszXSArIHVuaXF1ZS5pZC5uWzRdKSkKcHJlLjE0YyRUcmVhdG1lbnQgPC0gYyhyZXAoImNvbnRyb2wiLCB1bmlxdWUuaWQublsxXSksCiAgICAgICAgICAgICAgICAgICAgICAgcmVwKCJhaXItZHJ5ICsgc3RvcmFnZSIsIHVuaXF1ZS5pZC5uWzJdKSwKICAgICAgICAgICAgICAgICAgICAgICByZXAoImNvbnRyb2wiLCB1bmlxdWUuaWQublszXSksCiAgICAgICAgICAgICAgICAgICAgICAgcmVwKCJhaXItZHJ5IiwgdW5pcXVlLmlkLm5bNF0pKQpwcmUuMTRjJFBlcmlvZCA8LSAicHJlIgoKIyBjcmVhdGUgaW5jIHBlcmlvZCBkZiBhcyBkdXBsaWNhdGUgb2YgcHJlLWluYyBkZiwgYnV0IHRlc3QgdGhhdCBpdCBpcyB0aGUgcmlnaHQgc2hhcGUgZmlyc3QKaWYobnJvdyhwcmUuMTRjKSA9PSBzdW0odW5pcXVlLmlkLm4pICYgbmNvbChwcmUuMTRjKSA9PSA2KSB7CiAgaW5jLjE0YyA8LSBwcmUuMTRjCiAgaW5jLjE0YyRQZXJpb2QgPC0gImluYyIKfSBlbHNlIHsKICAicHJlLjE0YyBkYXRhIGZyYW1lIG1hbGZvcm1lZCIKfQphbGwuMTRjLnRlbXBsYXRlIDwtIHJiaW5kKHByZS4xNGMsIGluYy4xNGMpCmBgYAoKYGBge3IgdG1lIGV4cGVyaW1lbnQgdGVtcGxhdGV9CnVuaXF1ZS5pZC50bWUubiA8LSBjKGxlbmd0aCh1bmlxdWUodG1lLmN0bC5kdWskU2FtcGxlTmFtZSkpLAogICAgICAgICAgICAgICAgICAgICBsZW5ndGgodW5pcXVlKHRtZS5jdGwub3JubCRTYW1wbGVOYW1lKSksCiAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCh1bmlxdWUodG1lLmN0bC5mbHguc3JhJFNhbXBsZU5hbWUpKSwKICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKHVuaXF1ZSh0bWUubWlzYyRTYW1wbGVOYW1lKSksCiAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCh1bmlxdWUoYXJjaGl2ZS5jdGwudHMud2lkZVthcmNoaXZlLmN0bC50cy53aWRlJEV4cGVyaW1lbnQgPT0gInRtZSIsICJJRCJdKSksCiAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCh1bmlxdWUodG1lLnRydC50cyRTYW1wbGVOYW1lKSkpCnByZS50bWUuY3RsIDwtIGRhdGEuZnJhbWUoU2FtcGxlTmFtZSA9IGMoYXMuY2hhcmFjdGVyKHVuaXF1ZSh0bWUuY3RsLmR1ayRTYW1wbGVOYW1lKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMuY2hhcmFjdGVyKHVuaXF1ZSh0bWUuY3RsLm9ybmwkU2FtcGxlTmFtZSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLmNoYXJhY3Rlcih1bmlxdWUodG1lLmN0bC5mbHguc3JhJFNhbXBsZU5hbWUpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcy5jaGFyYWN0ZXIodW5pcXVlKHRtZS5taXNjJFNhbXBsZU5hbWUpKSwgICBhcy5jaGFyYWN0ZXIodW5pcXVlKGFyY2hpdmUuY3RsLnRzLndpZGVbYXJjaGl2ZS5jdGwudHMud2lkZSRFeHBlcmltZW50ID09ICJ0bWUiLCAiSUQiXSkpKSkKcHJlLnRtZS5jdGwkU2l0ZSA8LSBjKHJlcCgiRHVrZSIsIHVuaXF1ZS5pZC50bWUublsxXSksCiAgICAgICAgICAgICAgICAgICAgICByZXAoIk9STkwiLCB1bmlxdWUuaWQudG1lLm5bMl0pLAogICAgICAgICAgICAgICAgICAgICAgcmVwKCJTaWVycmEiLCB1bmlxdWUuaWQudG1lLm5bM10pLAogICAgICAgICAgICAgICAgICAgICAgcmVwKCJtaXNjIiwgdW5pcXVlLmlkLnRtZS5uWzRdKSwKICAgICAgICAgICAgICAgICAgICAgIHJlcCgiWHBsciIsIHVuaXF1ZS5pZC50bWUubls1XSkpCgoKIyBEdWtlLCBPUk5MLCBtaXNjLCBhbmQgWHBsciBJRHMKcHJlLnRtZS5jdGxbcHJlLnRtZS5jdGwkU2l0ZSA9PSAiRHVrZSIgfCAKICAgICAgICAgICAgcHJlLnRtZS5jdGwkU2l0ZSA9PSAiT1JOTCIgfAogICAgICAgICAgICBwcmUudG1lLmN0bCRTaXRlID09ICJtaXNjIiB8CiAgICAgICAgICAgIHByZS50bWUuY3RsJFNpdGUgPT0gIlhwbHIiLCAiSUQiXSA8LSBhcy5jaGFyYWN0ZXIocHJlLnRtZS5jdGxbcHJlLnRtZS5jdGwkU2l0ZSA9PSAiRHVrZSIgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlLnRtZS5jdGwkU2l0ZSA9PSAiT1JOTCIgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlLnRtZS5jdGwkU2l0ZSA9PSAibWlzYyIgfAogICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZS50bWUuY3RsJFNpdGUgPT0gIlhwbHIiLCAiU2FtcGxlTmFtZSJdKQoKIyBTaWVycmEgSURzCnByZS50bWUuY3RsW3ByZS50bWUuY3RsJFNpdGUgPT0gIlNpZXJyYSIsICJJRCJdIDwtCiAgc3Vic3RyKHByZS50bWUuY3RsW3ByZS50bWUuY3RsJFNpdGUgPT0gIlNpZXJyYSIsICJTYW1wbGVOYW1lIl0sIDEwLCAxMSkKCiMgc3ViZGl2aWRlIE9STkwgaW50byBXQiBhbmQgVFZBCnByZS50bWUuY3RsW3ByZS50bWUuY3RsJFNpdGUgPT0gIk9STkwiLCAiU2l0ZSJdIDwtIGlmZWxzZShncmVwbCgiVFZBIiwgcHJlLnRtZS5jdGxbcHJlLnRtZS5jdGwkU2l0ZSA9PSAiT1JOTCIsICJJRCJdKSwgIlRlbm5lc3NlZSBWYWxsZXkiLCAiV2Fsa2VyIEJyYW5jaCIpCgojIHN1YmRpdmlkZSBTaWVycmEgaW50byBNdXNpY2sgYW5kIFNoYXZlcgpwcmUudG1lLmN0bFtwcmUudG1lLmN0bCRTaXRlID09ICJTaWVycmEiLCAiU2l0ZSJdIDwtIGlmZWxzZShncmVwbCgiTSIsIHByZS50bWUuY3RsW3ByZS50bWUuY3RsJFNpdGUgPT0gIlNpZXJyYSIsICJJRCJdKSwgIk11c2ljayIsICJTaGF2ZXIiKQoKIyBhZGQgdHJlYXRtZW50IGNvbApwcmUudG1lLmN0bCRUcmVhdG1lbnQgPC0gImNvbnRyb2wiCgpwcmUudG1lLnRydCA8LSBkYXRhLmZyYW1lKFNhbXBsZU5hbWUgPSB1bmlxdWUodG1lLnRydC50cyRTYW1wbGVOYW1lKSkKcHJlLnRtZS50cnQkSUQgPC0gc3Vic3RyKHByZS50bWUudHJ0JFNhbXBsZU5hbWUsIDEsIG5jaGFyKGFzLmNoYXJhY3RlcihwcmUudG1lLnRydCRTYW1wbGVOYW1lKSktMikKcHJlLnRtZS50cnQgPC0gcmJpbmQocHJlLnRtZS50cnQsIHByZS50bWUuY3RsW3ByZS50bWUuY3RsJFNpdGUgPT0gIm1pc2MiLCBjKCJJRCIsICJTYW1wbGVOYW1lIildKQpwcmUudG1lLnRydCRUcmVhdG1lbnQgPC0gInN0b3JhZ2UgZHVyYXRpb24iCnByZS50bWUudHJ0JFNpdGUgPC0gcHJlLnRtZS5jdGxbbWF0Y2gocHJlLnRtZS50cnQkSUQsIHByZS50bWUuY3RsJElEKSwgIlNpdGUiXQoKcHJlLnRtZS4xNGMgPC0gcmJpbmQocHJlLnRtZS5jdGwsIHByZS50bWUudHJ0KQpwcmUudG1lLjE0YyRUeXBlIDwtIGlmZWxzZShncmVwbCgiRyIsIHByZS50bWUuMTRjJFNhbXBsZU5hbWUpLCAiRyIsICJGIikKcHJlLnRtZS4xNGMkUGVyaW9kIDwtICJwcmUiCnByZS50bWUuMTRjJEV4cGVyaW1lbnQgPC0gInRtZSIKCiMgY3JlYXRlIGluYyBwZXJpb2QgZGYKaW5jLnRtZS4xNGMgPC0gcHJlLnRtZS4xNGMKaW5jLnRtZS4xNGMkUGVyaW9kIDwtICJpbmMiCnRtZS4xNGMudGVtcGxhdGUgPC0gcmJpbmQocHJlLnRtZS4xNGMsIGluYy50bWUuMTRjKQpgYGAKCmBgYHtyIGNvbWJpbmUgc29pbCBvYnMgZGF0YX0KIyA0LiBTdW1tYXJpemUgb2JzZXJ2YXRpb25hbCBkYXRhIGZyb20gdGltZXNlcmllcyBkYXRhIGJ5IHVuaXF1ZSBJRHMgKFNhbXBsZU5hbWUpCiMgc3VtbWFyaXplIHRpbWUgYW5kIGNvMiBkYXRhIGJ5IGV4cGVyaW1lbnQsIHBlcmlvZCwgdHJlYXRtZW50LCBhbmQgc2FtcGxlIG5hbWUKdHMuZXBzbi5hdmcgPC0gdHMgJT4lCiAgc2VsZWN0KEV4cGVyaW1lbnQsIElELCBQZXJpb2QsIFRyZWF0bWVudCwgU2FtcGxlTmFtZSwgZ0NfZ1MsIGR3X2csIG1nQ08yLkNfZ0MsIHRpbWVfZCwgdGltZV9kX2NtdHYpICAlPiUKICBncm91cF9ieShFeHBlcmltZW50LCBJRCwgUGVyaW9kLCBUcmVhdG1lbnQsIFNhbXBsZU5hbWUpICU+JQogIHN1bW1hcmlzZV9hbGwobGlzdChtYXggPSBtYXgpLCBuYS5ybSA9IFRSVUUpCnRzLmVwc24uYXZnIDwtIHJlbmFtZV9hdCh0cy5lcHNuLmF2ZywgdmFycyhjb250YWlucygnbWF4JykpLCBsaXN0KH5zdWIoIl9tYXgiLCAiIiwgLikpKQpgYGAKCmBgYHtyIGNsZWFuIHVwIDE0QyBkYXRhfQojIDYuIENsZWFuIHVwIF4xNF5DIGRhdGEgYW5kIGFkZCBleHRlcm5hbCBkYXRhIHBvaW50cyAodG1lIGV4cGVyaW1lbnQsIFhwbHIgY29udHJvbCBzYW1wbGVzKQojIE5lZWQgdG8gYWRkIFNhbXBsZU5hbWUgY29sIGFuZCB2YXJpYWJsZSBjb2x1bW5zIFRyZWF0bWVudCwgUGVyaW9kLCBhbmQgRXhwZXJpbWVudCB0byBhbGwgZGF0YSBmcmFtZXMgaW4gYW1zX3Jlc3VsdHNfbHMgCgojIEZpcnN0IGFkZCAxNEMgYW5kIDEzQyBkYXRhIGZyb20gRXhwbG9yYXRvcmllcyBjb250cm9sIHNhbXBsZXMgdG8gYW1zX3Jlc3VsdHNfbHMKIyBub3RlIHRoYXQgbmVpdGhlciAxM0Mgbm9yIDE0QyB3YXMgbWVhc3VyZWQgZm9yIHRoZSBwcmUtaW5jdWJhdGlvbiBwZXJpb2QgZm9yIHRoZXNlIHNhbXBsZXMKIyBnZXQgbmFtZXMgZm9yIGFtc19yZXN1bHRzIGRhdGEgZnJhbWVzCnJlc3VsdHMuMTRjLm5tcyA8LSBuYW1lcyhhbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wMS0yOGAkYEJlZW0tTWlsbGVyXzkueGxzeGApCiMgZ2V0IG5hbWVzIGZvciByZWxldmFudCBFeHBlcmltZW50L1RyZWF0bWVudC9QZXJpb2QgY29tYmluYXRpb24KYXJjX2N0bF9pbmNfU04gPC0gYXMuY2hhcmFjdGVyKGFsbC4xNGMudGVtcGxhdGVbYWxsLjE0Yy50ZW1wbGF0ZSRFeHBlcmltZW50ID09ICJhcmMiICYgYWxsLjE0Yy50ZW1wbGF0ZSRUcmVhdG1lbnQgPT0gImNvbnRyb2wiICYgYWxsLjE0Yy50ZW1wbGF0ZSRQZXJpb2QgPT0gImluYyIsICJTYW1wbGVOYW1lIl0pCnRtZV9jdGxfaW5jX3hwbHJfU04gPC0gdW5saXN0KGxhcHBseShhbXNfcmVzdWx0c19sc1sxOjJdLCBmdW5jdGlvbih4KSB1bmxpc3QobGFwcGx5KHgsICJbWyIsICJQcm9iZSIpKSkpCnRtZV9jdGxfaW5jX3hwbHJfU04gPC0gdG1lX2N0bF9pbmNfeHBscl9TTltncmVwKCJIRSIsIHRtZV9jdGxfaW5jX3hwbHJfU04pXQppZihsZW5ndGgodG1lX2N0bF9pbmNfeHBscl9TTikgPT0gMTQpIHsKICB0bWVfY3RsX2luY194cGxyX1NOIDwtIHVuaXF1ZShzdWJzdHIodG1lX2N0bF9pbmNfeHBscl9TTiwgMSwgbmNoYXIodG1lX2N0bF9pbmNfeHBscl9TTiktMikpCn0KCiMgYWRkIHN1Ymxpc3QgZm9yIEV4cGxvcmF0b3JpZXMgMjAxMSAoY29udHJvbCkgZGF0YSBhbmQgZGF0YSBmcmFtZXMgZm9yIGFib3ZlIHN1YnNldHMKYW1zX3Jlc3VsdHNfbHMkZXhwbG9yYXRvcmllc19pc2Nob2VuaW5nXzE0Yy5jbzJfMjAxMSRhcmNfY3RsX2luYyA8LSBkYXRhLmZyYW1lKG1hdHJpeChucm93ID0gbGVuZ3RoKGFyY19jdGxfaW5jX1NOKSwgbmNvbCA9IGxlbmd0aChyZXN1bHRzLjE0Yy5ubXMpKSkKYW1zX3Jlc3VsdHNfbHMkZXhwbG9yYXRvcmllc19pc2Nob2VuaW5nXzE0Yy5jbzJfMjAxMSR0bWVfY3RsX2luY194cGxyIDwtIGRhdGEuZnJhbWUobWF0cml4KG5yb3cgPSBsZW5ndGgodG1lX2N0bF9pbmNfeHBscl9TTiksIG5jb2wgPSBsZW5ndGgocmVzdWx0cy4xNGMubm1zKSkpCgojIGFkZCBuYW1lcyBhbmQgZmlsbCBTYW1wbGVOYW1lcyBmb3IgbmV3IGRhdGEgZnJhbWVzCmFtc19yZXN1bHRzX2xzJGV4cGxvcmF0b3JpZXNfaXNjaG9lbmluZ18xNGMuY28yXzIwMTEgPC0gbGFwcGx5KGFtc19yZXN1bHRzX2xzJGV4cGxvcmF0b3JpZXNfaXNjaG9lbmluZ18xNGMuY28yXzIwMTEsIGZ1bmN0aW9uKHgpIHsKICBuYW1lcyh4KSA8LSByZXN1bHRzLjE0Yy5ubXMKICByZXR1cm4oeCkKICB9KSAKYW1zX3Jlc3VsdHNfbHMkZXhwbG9yYXRvcmllc19pc2Nob2VuaW5nXzE0Yy5jbzJfMjAxMSRhcmNfY3RsX2luY1sgLCBjKCJTYW1wbGVOYW1lIiwiUHJvYmUiKV0gPC0gYXJjX2N0bF9pbmNfU04KYW1zX3Jlc3VsdHNfbHMkZXhwbG9yYXRvcmllc19pc2Nob2VuaW5nXzE0Yy5jbzJfMjAxMSR0bWVfY3RsX2luY194cGxyWyAsIGMoIlNhbXBsZU5hbWUiLCJQcm9iZSIpXSA8LSB0bWVfY3RsX2luY194cGxyX1NOCgojIGZpbGwgMTRDIGRhdGEKYW1zX3Jlc3VsdHNfbHMkZXhwbG9yYXRvcmllc19pc2Nob2VuaW5nXzE0Yy5jbzJfMjAxMSA8LSBsYXBwbHkoYW1zX3Jlc3VsdHNfbHMkZXhwbG9yYXRvcmllc19pc2Nob2VuaW5nXzE0Yy5jbzJfMjAxMSwgZnVuY3Rpb24oZGYpIHsKICBkZiRg4oiGMTRDLijigLApYCA8LSB4cGxyLmN0bC5pc29bbWF0Y2goZGYkUHJvYmUsIHhwbHIuY3RsLmlzbyRFUF9QbG90aWQpLCAiMTRjX0NPMiJdCiAgZGYkVHJlYXRtZW50IDwtICJjb250cm9sIgogIGRmJFBlcmlvZCA8LSAiaW5jIgogIHJldHVybihkZikKfSkKCiMgYWRkIEV4cGVyaW1lbnQKYW1zX3Jlc3VsdHNfbHMkZXhwbG9yYXRvcmllc19pc2Nob2VuaW5nXzE0Yy5jbzJfMjAxMSRhcmNfY3RsX2luYyRFeHBlcmltZW50IDwtICJhcmMiCmFtc19yZXN1bHRzX2xzJGV4cGxvcmF0b3JpZXNfaXNjaG9lbmluZ18xNGMuY28yXzIwMTEkdG1lX2N0bF9pbmNfeHBsciRFeHBlcmltZW50IDwtICJ0bWUiCgoKIyBgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOC0xMC0xMmAgYW5kIGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDE4LTExLTA5YAojIGBCZWVtLU1pbGxlcl80Lnhsc3hgLCBgQmVlbS1NaWxsZXJfNS54bHN4YDsgYEJlZW0tTWlsbGVyXzYueGxzeGAsIGBCZWVtLU1pbGxlcl83Lnhsc3hgCiMgQWRkIHRyZWF0bWVudCwgZXhwZXJpbWVudCwgcGVyaW9kIGNvbHMKIyBFeHBlcmltZW50ID0gdG1lCiMgVHJlYXRtZW50ID0gc3RvcmFnZSBkdXJhdGlvbgojIFBlcmlvZCA9IGluYwphbXNfcmVzdWx0c19sc1sxOjJdIDwtIGxhcHBseShhbXNfcmVzdWx0c19sc1sxOjJdLCBmdW5jdGlvbihscykgbGFwcGx5KGxzLCBmdW5jdGlvbihkZikgewogIGRmJEV4cGVyaW1lbnQgPC0gInRtZSIKICBkZiRUcmVhdG1lbnQgPC0gInN0b3JhZ2UgZHVyYXRpb24iCiAgZGYkUGVyaW9kIDwtICJpbmMiCiAgcmV0dXJuKGRmKQogIH0pCikKCiMgYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMTktMDEtMjhgCiMgYEJlZW0tTWlsbGVyXzkueGxzeGAKIyBFeHBlcmltZW50ID0gYXJjCiMgVHJlYXRtZW50ID0gYWlyLWRyeSArIHN0b3JhZ2UKIyBQZXJpb2QgPSBwcmUKYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMTktMDEtMjhgJGBCZWVtLU1pbGxlcl85Lnhsc3hgJFNhbXBsZU5hbWUgPC0gYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMTktMDEtMjhgJGBCZWVtLU1pbGxlcl85Lnhsc3hgJFByb2JlCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDE5LTAxLTI4YCRgQmVlbS1NaWxsZXJfOS54bHN4YCRUcmVhdG1lbnQgPC0gImFpci1kcnkgKyBzdG9yYWdlIgphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wMS0yOGAkYEJlZW0tTWlsbGVyXzkueGxzeGAkUGVyaW9kIDwtICJwcmUiCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDE5LTAxLTI4YCRgQmVlbS1NaWxsZXJfOS54bHN4YCRFeHBlcmltZW50IDwtICJhcmMiCgojIGFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDE5LTAyLTI1YCQKIyBBcmNoaXZlZF9JbmN1YmF0aW9uc18zMC54bHN4CiMgRXhwZXJpbWVudCA9IGFyYwojIFRyZWF0bWVudCA9IGFpci1kcnkgKyBzdG9yYWdlCiMgUGVyaW9kID0gaW5jCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDE5LTAyLTI1YCRBcmNoaXZlZF9JbmN1YmF0aW9uc18zMC54bHN4JFNhbXBsZU5hbWUgPC0gc3Vic3RyKGFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDE5LTAyLTI1YCRBcmNoaXZlZF9JbmN1YmF0aW9uc18zMC54bHN4JFByb2JlLCAxLCA5KQphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wMi0yNWAkQXJjaGl2ZWRfSW5jdWJhdGlvbnNfMzAueGxzeCRUcmVhdG1lbnQgPC0gImFpci1kcnkgKyBzdG9yYWdlIgphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wMi0yNWAkQXJjaGl2ZWRfSW5jdWJhdGlvbnNfMzAueGxzeCRQZXJpb2QgPC0gImluYyIKYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMTktMDItMjVgJEFyY2hpdmVkX0luY3ViYXRpb25zXzMwLnhsc3gkRXhwZXJpbWVudCA8LSAiYXJjIgoKIyBhbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wNC0zMGAKIyBgUm9zdF8zMS0yLnhsc3hgCiMgRXhwZXJpbWVudCA9IGFyYwojIFRyZWF0bWVudCA9IGFpci1kcnkgKyBzdG9yYWdlCiMgUGVyaW9kID0gaW5jLCBwcmUgKFNFVzExLTItMikKYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMTktMDQtMzBgJGBSb3N0XzMxLTIueGxzeGAkU2FtcGxlTmFtZSA8LSBzdWJzdHIoYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMTktMDQtMzBgJGBSb3N0XzMxLTIueGxzeGAkUHJvYmUsIDEsIDkpCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDE5LTA0LTMwYCRgUm9zdF8zMS0yLnhsc3hgJFRyZWF0bWVudCA8LSAiYWlyLWRyeSArIHN0b3JhZ2UiCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDE5LTA0LTMwYCRgUm9zdF8zMS0yLnhsc3hgJEV4cGVyaW1lbnQgPC0gImFyYyIKYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMTktMDQtMzBgJGBSb3N0XzMxLTIueGxzeGBbMjo5LCAiUGVyaW9kIl0gPC0gImluYyIKYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMTktMDQtMzBgJGBSb3N0XzMxLTIueGxzeGBbMTAsICJQZXJpb2QiXSA8LSAicHJlIgoKIyBhbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAyMC0wMi0xM2AKIyBSb3N0XzQ3Lnhsc3ggCiMgRXhwZXJpbWVudCA9IHJld2V0CiMgVHJlYXRtZW50ID0gY29udHJvbAojIFBlcmlvZCA9IHByZQphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAyMC0wMi0xM2AkUm9zdF80Ny54bHN4JFNhbXBsZU5hbWUgPC0gc3Vic3RyKGFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDIwLTAyLTEzYCRSb3N0XzQ3Lnhsc3gkUHJvYmUsIDEsIDcpCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDIwLTAyLTEzYCRSb3N0XzQ3Lnhsc3gkVHJlYXRtZW50IDwtICJjb250cm9sIgphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAyMC0wMi0xM2AkUm9zdF80Ny54bHN4JEV4cGVyaW1lbnQgPC0gInJld2V0IgphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAyMC0wMi0xM2AkUm9zdF80Ny54bHN4JFBlcmlvZCA8LSAicHJlIgojIFJvc3RfNTAueGxzeAojIEV4cGVyaW1lbnQgPSByZXdldAojIFRyZWF0bWVudCA9IGNvbnRyb2wKIyBQZXJpb2QgPSBpbmMKYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMjAtMDItMTNgJFJvc3RfNTAueGxzeCRTYW1wbGVOYW1lIDwtIHN1YnN0cihhbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAyMC0wMi0xM2AkUm9zdF81MC54bHN4JFByb2JlLCAxLCA3KQphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAyMC0wMi0xM2AkUm9zdF81MC54bHN4JFRyZWF0bWVudCA8LSAiY29udHJvbCIKYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMjAtMDItMTNgJFJvc3RfNTAueGxzeCRFeHBlcmltZW50IDwtICJyZXdldCIKYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMjAtMDItMTNgJFJvc3RfNTAueGxzeCRQZXJpb2QgPC0gImluYyIKIyBSb3N0XzUyLnhsc3gKIyBFeHBlcmltZW50ID0gcmV3ZXQKIyBUcmVhdG1lbnQgPSBhaXItZHJ5CiMgUGVyaW9kID0gcHJlLCBpbmMKYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMjAtMDItMTNgJFJvc3RfNTIueGxzeCRTYW1wbGVOYW1lIDwtIHN1YnN0cihhbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAyMC0wMi0xM2AkUm9zdF81Mi54bHN4JFByb2JlLCAxLCAxMSkKcHJlLml4IDwtIHdoaWNoKGdyZXBsKCJQUkUiLCBhbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAyMC0wMi0xM2AkUm9zdF81Mi54bHN4JFByb2JlKSkKYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMjAtMDItMTNgJFJvc3RfNTIueGxzeCRUcmVhdG1lbnQgPC0gImFpci1kcnkiCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDIwLTAyLTEzYCRSb3N0XzUyLnhsc3gkRXhwZXJpbWVudCA8LSAicmV3ZXQiCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDIwLTAyLTEzYCRSb3N0XzUyLnhsc3hbcHJlLml4LCAiUGVyaW9kIl0gPC0gInByZSIKYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMjAtMDItMTNgJFJvc3RfNTIueGxzeFstcHJlLml4LCAiUGVyaW9kIl0gPC0gImluYyIKYGBgCgpgYGB7ciBjb21iaW5lIDE0QyBzb2lsIG9icyBkYXRhfQojIDcuIENvbWJpbmUgZGF0YS4KIyBmbGF0dGVuIGxpc3QgYW5kIHJlbW92ZSBBTVMgYmxhbmtzLCBOQSBzYW1wbGVzLCBhbmQgbm9uLUV4cGxvcmF0b3J5IGRhdGEKYW1zX3Jlc3VsdHNfYXJjX3Jld2V0IDwtIGxhcHBseShhbXNfcmVzdWx0c19sc1szOjddLCBmdW5jdGlvbih4KSBiaW5kX3Jvd3MoeCkpCmFtc19yZXN1bHRzX2FyY19yZXdldC5kZiA8LSBiaW5kX3Jvd3MobGFwcGx5KGFtc19yZXN1bHRzX2FyY19yZXdldCwgZnVuY3Rpb24oeCkgZXh0cmEuY2xlYW4uZngoeCkpKQoKIyBmbGF0dGVuIGV4dGVybmFsIGRhdGEgbGlzdAphbXNfcmVzdWx0c190bWUgPC0gbGFwcGx5KGFtc19yZXN1bHRzX2xzW2MoMToyLDcpXSwgZnVuY3Rpb24oeCkgbGFwcGx5KHgsIHRtZS4xNGMuZngpKQphbXNfcmVzdWx0c190bWUuZGYgPC0gYmluZF9yb3dzKGxhcHBseShhbXNfcmVzdWx0c190bWUsIGZ1bmN0aW9uKHgpIGJpbmRfcm93cyh4KSkpCgojIGN1dCBvdXQgbm9uLXJlbGV2YW50IEFNUyByZXN1bHRzIGNvbHVtbnMKbm1zLmFtcy52YXJzIDwtIGMoIkYxNEMiLCAiZXJyIiwgIuKIhjE0Qy4o4oCwKSIsICJlcnIuKOKAsCkiLAogICAgICAgICAgICAgICAgICJTYW1wbGVOYW1lIiwgIlRyZWF0bWVudCIsICJQZXJpb2QiLCAiRXhwZXJpbWVudCIpCmFtc19yZXN1bHRzX2FyY19yZXdldC5kZiA8LSBhbXNfcmVzdWx0c19hcmNfcmV3ZXQuZGZbICwgbm1zLmFtcy52YXJzXQpjb2xuYW1lcyhhbXNfcmVzdWx0c19hcmNfcmV3ZXQuZGYpIDwtIGMoImZtIiwgImZtX2VyciIsICJkMTRjIiwgImQxNGNfZXJyIiwgbm1zLmFtcy52YXJzWzU6OF0pCgphbXNfcmVzdWx0c190bWUuZGYgPC0gYW1zX3Jlc3VsdHNfdG1lLmRmWyAsIG5tcy5hbXMudmFyc10KY29sbmFtZXMoYW1zX3Jlc3VsdHNfdG1lLmRmKSA8LSBjKCJmbSIsICJmbV9lcnIiLCAiZDE0YyIsICJkMTRjX2VyciIsIG5tcy5hbXMudmFyc1s1OjhdKQphbXNfcmVzdWx0c190bWUuZGYkSUQgPC0gc3Vic3RyKGFtc19yZXN1bHRzX3RtZS5kZiRTYW1wbGVOYW1lLCAxLCBuY2hhcihhbXNfcmVzdWx0c190bWUuZGYkU2FtcGxlTmFtZSktMikKYW1zX3Jlc3VsdHNfdG1lLmRmJFR5cGUgPC0gaWZlbHNlKGdyZXBsKCJHIiwgYW1zX3Jlc3VsdHNfdG1lLmRmJElEKSwgIkciLCAiRiIpCgojIG1lcmdlIGFyYyBhbmQgcmV3ZXQgMTRDIGRhdGEgd2l0aCB0ZW1wbGF0ZQppZihucm93KG1lcmdlKGFsbC4xNGMudGVtcGxhdGUsIGFtc19yZXN1bHRzX2FyY19yZXdldC5kZiwgYWxsLnggPSBUUlVFKSkgPT0gbnJvdyhhbGwuMTRjLnRlbXBsYXRlKSkgewogIGFsbC4xNGMgPC0gbWVyZ2UoYWxsLjE0Yy50ZW1wbGF0ZSwgYW1zX3Jlc3VsdHNfYXJjX3Jld2V0LmRmLCBhbGwueCA9IFRSVUUpCn0gZWxzZSB7CiAgY2F0KCJkdXBsaWNhdGUgc2FtcGxlIG1lcmdlIGVycm9yIikKfQoKIyBtZXJnZSBzb2lsIG9icyBkYXRhIHdpdGggMTRjIGRhdGEKaWYobnJvdyhtZXJnZShhbGwuMTRjLCB0cy5lcHNuLmF2ZywgYnkgPSBjKCJTYW1wbGVOYW1lIiwgIlBlcmlvZCIpKSkgPT0gbnJvdyhhbGwuMTRjKSkgewogIGFsbC4xNGMgPC0gbWVyZ2UoYWxsLjE0YywgdHMuZXBzbi5hdmcsIGFsbC54ID0gVFJVRSkKfSBlbHNlIHsKICBjYXQoImR1cGxpY2F0ZSBzYW1wbGUgbWVyZ2UgZXJyb3IiKQp9CgojIG1lcmdlIHRtZSAxNEMgZGF0YSB3aXRoIHRlbXBsYXRlIGFuZCB0cy5lcHNuLmF2Zwp0bWUuMTRjIDwtIG1lcmdlKHRtZS4xNGMudGVtcGxhdGUsIGFtc19yZXN1bHRzX3RtZS5kZiwgYWxsLnggPSBUUlVFKQoKIyBhZGQgY3RsIHNhbXBsZSAxNEMgZGF0YSB0byB0bWUuMTRjCiMgZmlyc3QgcmVtb3ZlIE5BIHZhbHVlcwp0bWUuMTRjLmNsZWFuIDwtIHRtZS4xNGNbd2hpY2goIWlzLm5hKHRtZS4xNGMkZDE0YykgfCAhaXMubmEodG1lLjE0YyRmbSkpLCBdCiMgZGVmaW5lIG1lcmdlIGZ4CnRtZS5tcmcuZnggPC0gZnVuY3Rpb24oeCwgeSkgewogIG1yZy5ubXMgPC0gYygiU2FtcGxlTmFtZSIsICJJRCIsICJUcmVhdG1lbnQiLCAiUGVyaW9kIikKICB2YXIubm1zIDwtIGMoIlllYXJTYW1wbGVkIiwgIlNpdGUiLCAiSG9yaXpvbiIsICAiZDE0YyIsICJmbSIpCiAgaWYobGVuZ3RoKGdyZXAoImZtIiwgbmFtZXMoeSkpKSA+IDApIHsKICAgIGRmIDwtIG1lcmdlKHhbICwgbXJnLm5tc10sIHlbICwgYyhtcmcubm1zLCB2YXIubm1zKV0pCiAgfSBlbHNlIHsKICAgIGRmIDwtIG1lcmdlKHhbICwgbXJnLm5tc10sIHlbICwgYyhtcmcubm1zLCB2YXIubm1zWzE6NF0pXSkKICAgIGRmJGZtIDwtIE5BCiAgfQogIHJldHVybihkZikKfQoKdG1lLjE0Yy5kZiA8LSBiaW5kX3Jvd3MobGFwcGx5KGxpc3QodG1lLmN0bC5kdWssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bWUuY3RsLmZseC5zcmFbd2hpY2goIWlzLm5hKHRtZS5jdGwuZmx4LnNyYSRkMTRjKSksIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bWUuY3RsLm9ybmwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bWUubWlzYyksIGZ1bmN0aW9uKGkpIHRtZS5tcmcuZngodG1lLjE0YywgaSkpKQoKIyBhZGQgc3RvcmFnZSBkdXJhdGlvbiBkYXRhIGZvciB0cmVhdG1lbnQgc2FtcGxlcyBhbmFseXplZCBleHRlcm5hbGx5CnRtZS4xNGMuZGYkVHlwZSA8LSAiRiIKCiMgYWRkIFllYXJTYW1wbGVkIGZvciB0bWUuMTRjLmNsZWFuIHNhbXBsZXMKZm9yKGkgaW4gMTpucm93KHRtZS4xNGMuY2xlYW4pKSB7CiAgaWYodG1lLjE0Yy5jbGVhbltpLCAiU2l0ZSJdID09ICJEdWtlIikgewogICAgdG1lLjE0Yy5jbGVhbltpLCAiWWVhclNhbXBsZWQiXSA8LSAyMDA4CiAgfSBlbHNlIGlmKHRtZS4xNGMuY2xlYW5baSwgIlNpdGUiXSA9PSAiWHBsciIpIHsKICAgIHRtZS4xNGMuY2xlYW5baSwgIlllYXJTYW1wbGVkIl0gPC0gMjAxMQogIH0gZWxzZSBpZih0bWUuMTRjLmNsZWFuW2ksICJTaXRlIl0gPT0gIlNpZXJyYSIpIHsKICAgIHRtZS4xNGMuY2xlYW5baSwgIlllYXJTYW1wbGVkIl0gPC0gMjAwOQogIH0gZWxzZSB7CiAgICB0bWUuMTRjLmNsZWFuW2ksICJZZWFyU2FtcGxlZCJdIDwtIDIwMDQKICB9Cn0KCiMgQWRkIEhvcml6b24gdG8gdG1lLjE0Yy5jbGVhbgp0bWUuMTRjLmNsZWFuJEhvcml6b24gPC0gaWZlbHNlKHRtZS4xNGMuY2xlYW4kSUQgPT0gIk1CIiB8IHRtZS4xNGMuY2xlYW4kSUQgPT0gIlNCIiwgIkIiLCAiQSIpCgojIGNvbWJpbmUgdG1lIGRhdGEKdG1lLjE0YyA8LSBiaW5kX3Jvd3ModG1lLjE0Yy5jbGVhblsgLCBuYW1lcyh0bWUuMTRjLmRmKV0sIHRtZS4xNGMuZGYpCnRtZS4xNGMkRXhwZXJpbWVudCA8LSAidG1lIgoKIyByZW1vdmUgb3V0bGllciAoTUEtMSkKIyAqKiogTmVlZCB0byBjbGFyaWZ5IG1ldGhvZCBmb3IgZGV0ZXJtaW5pbmcgdGhhdCB0aGlzIGlzIGFuIG91dGxpZXIgKioqIAp0bWUuMTRjIDwtIHRtZS4xNGNbLXdoaWNoKHRtZS4xNGMkU2FtcGxlTmFtZSA9PSAiTUEtMSIgfCB0bWUuMTRjJFNhbXBsZU5hbWUgPT0gIkhFVzQ5LTEiIHwgdG1lLjE0YyRTYW1wbGVOYW1lID09ICJIRVcyNi0xIiksIF0KCgojIEFkZCBtaXNzaW5nIHZhcmlhYmxlIGNvbHVtbnMgdG8gYWxsLjE0YwojIGFkZCBZZWFyU2FtcGxlZCBjb2x1bW4KYWxsLjE0YyRZZWFyU2FtcGxlZCA8LSBpZmVsc2UoYWxsLjE0YyRFeHBlcmltZW50ID09ICJhcmMiLCAyMDExLCAyMDE5KQoKIyBhZGQgU2l0ZSBhbmQgSG9yaXpvbiBjb2x1bW5zCmFsbC4xNGMkU2l0ZSA8LSBpZmVsc2UoZ3JlcGwoIkhFIiwgYWxsLjE0YyRJRCksICJIYWluaWNoIiwgIlNjaG9yZmhlaWRlIikKYWxsLjE0YyRIb3Jpem9uIDwtICJBIgoKCiMgY29tYmluZSB0bWUuMTRjIGFuZCBhbGwuMTRjIGludG8gYSBsaXN0IGFuZCBjYWxjdWxhdGUgZnJhY3Rpb24gbW9kZXJuIGZyb20gZDE0QyBhcyBuZWVkZWQKYWxsLjE0Yy5scyA8LSBsYXBwbHkobGlzdCh0bWUuMTRjLCBhbGwuMTRjKSwgZnVuY3Rpb24oZGYpIHsKICBkZiRmbSA8LSBpZmVsc2UoaXMubmEoZGYkZm0pLAogICAgICAgICAgICAgICAgICBkMTRjLmZtLmZ4KGRmJFllYXJTYW1wbGVkLCBkZiRkMTRjKSwKICAgICAgICAgICAgICAgICAgZGYkZm0pCiAgZGYkZDE0Y19jb3JyIDwtIGRlY2F5LmNvcnIuZngoZGYkWWVhclNhbXBsZWQsIGRmJGZtKQogIHJldHVybihkZikKfSkKCmFsbC4xNGMuc3VtIDwtIGxhcHBseShhbGwuMTRjLmxzLCBmdW5jdGlvbihkZikgewogIGRmLnN1bSA8LSBzZWxlY3QoZGYsIC1TYW1wbGVOYW1lKSAlPiUKICAgIGdyb3VwX2J5KElELCBUeXBlLCBQZXJpb2QsIFRyZWF0bWVudCwgRXhwZXJpbWVudCwgU2l0ZSwgSG9yaXpvbiwgWWVhclNhbXBsZWQpICU+JQogICAgc3VtbWFyaXNlX2FsbChsaXN0KG1lYW4gPSBtZWFuLCBtYXggPSBtYXgsIG1pbiA9IG1pbiksIG5hLnJtID0gVFJVRSkKICBkZi5zdW1bbWFwcGx5KGlzLmluZmluaXRlLCBkZi5zdW0pXSA8LSBOQQogIHJldHVybihkZi5zdW0pCn0pCmFsbC4xNGMuc3VtIDwtIHJhcHBseShhbGwuMTRjLnN1bSwgZiA9IGZ1bmN0aW9uKHgpIGlmZWxzZShpcy5uYW4oeCksIE5BICwgeCksIGhvdyA9ICJyZXBsYWNlIikKYWxsLjE0Yy5zdW0uZGYgPC0gYmluZF9yb3dzKGFsbC4xNGMuc3VtKQpgYGAKCiMjICRcZGVsdGEkXjEzXkMKYGBge3IgcmVhZC1jYWxjLTEzY30KIyBDbGVhbiB1cCAxM0MgZGF0YQojIE5vdGUgdGhhdCBpc28gZGF0YSBJRHMgc2hvdWxkIGJlIHN0b3JlZCBhcyB0aGUgInByZXBhcmF0aW9uIiB2YXJpYWJsZQoKIyBmaXJzdCBjcmVhdGUgYSBsaWJyYXJ5IG9mIHBvc3NpYmxlIElEcwphbGwuaWRzIDwtIHVuaXF1ZShjKGFsbC4xNGMudGVtcGxhdGUkSUQsIHRtZS4xNGMudGVtcGxhdGUkSUQpKQoKIyBmdW5jdGlvbiB0byBzdHJpcCBvdXQgYWxsIHZhbHVlcyBub3QgY29ycmVzcG9uZGluZyB0byBrbm93biBJRHMgYW5kIHJldHVybiBtZWFuIG9mIGR1cGxpY2F0ZXMKY2xlYW4uaXNvIDwtIGZ1bmN0aW9uKGRmKSB7CiAgCiAgIyBzdHJpcCBvdXQgbm9uIGFyYy1pbmMgZGF0YQogIGl4IDwtIHZlY3RvcigpCiAgZm9yKGkgaW4gc2VxX2Fsb25nKGFsbC5pZHMpKSB7CiAgICBpZihhbnkoZ3JlcGwoYWxsLmlkc1tpXSwgZGYkcHJlcGFyYXRpb24pKSkgewogICAgICBpeCA8LSB1bmlxdWUoYyhpeCwgZ3JlcChhbGwuaWRzW2ldLCBkZiRwcmVwYXJhdGlvbikpKQogICAgfQogIH0KICBpZihucm93KGRmKSA9PSAwKSB7CiAgICBjYXQoIk5vIG1hdGNoaW5nIElEcyBmb3VuZCEiKQogIH0KICBkZiA8LSB0eXBlLmNvbnZlcnQoYXMuZGF0YS5mcmFtZShkZiA8LSBkZltpeCwgXSkpCiAgCiAgIyBhdmVyYWdlIGR1cGxpY2F0ZXMKICBkMTNjIDwtIHZlY3RvcigpCiAgZm9yKGkgaW4gc2VxX2Fsb25nKGRmJHByZXBhcmF0aW9uKSkgewogICAgICAgIGlmKGkgIT0gbnJvdyhkZikpIHsKICAgICAgICAgIGQxM2NbaV0gPC0gaWZlbHNlKGRmW2ksICJwcmVwYXJhdGlvbiJdID09IGRmW2kgKyAxLCAicHJlcGFyYXRpb24iXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYW4oZGZbaSwgIm9mZnNldCBjb3JyIHNhbXBsZSJdLCBkZltpKzEsICJvZmZzZXQgY29yciBzYW1wbGUiXSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BKQogICAgICB9CiAgfQogIHJldHVybihkYXRhLmZyYW1lKFNhbXBsZU5hbWUgPSB1bmlxdWUoZGYkcHJlcGFyYXRpb24pLAogICAgICAgICAgICAgICAgICAgIGQxM2MgPSBkMTNjW2NvbXBsZXRlLmNhc2VzKGQxM2MpXSkpCn0KCmlzb19yZXN1bHRzX2xzX2NsZWFuIDwtIGxhcHBseShpc29fcmVzdWx0c19scywgZnVuY3Rpb24oZGYpIHsKICBsYXBwbHkoZGYsIGNsZWFuLmlzbykKfSkKCiMgYWRkIGluIEV4cGVyaW1lbnQsIHRyZWF0bWVudCwgcGVyaW9kLCBldGMuCiMgMS4gaXNvX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wMS0yMgojIyAxM0NfYXJjaGl2ZWNJbmNfUHJlXzIwMTgxMjA3LTE0MTY5MS0xNDE3NTEueGxzCmlzb19yZXN1bHRzX2xzX2NsZWFuW1sxXV1bWzFdXVsiUGVyaW9kIl0gPC0gInByZSIKaXNvX3Jlc3VsdHNfbHNfY2xlYW5bWzFdXVtbMV1dWyJFeHBlcmltZW50Il0gPC0gImFyYyIKaXNvX3Jlc3VsdHNfbHNfY2xlYW5bWzFdXVtbMV1dWyJUcmVhdG1lbnQiXSA8LSAiYWlyLWRyeSArIHN0b3JhZ2UiCgojIyAxM0NfYXJjaGl2ZWRJbmNfMjAxOTAxMTYtMTQyMDEyLTE0MjA3Mi54bHMKaXNvX3Jlc3VsdHNfbHNfY2xlYW5bWzFdXVtbMl1dWyJQZXJpb2QiXSA8LSAiaW5jIgppc29fcmVzdWx0c19sc19jbGVhbltbMV1dW1syXV1bIkV4cGVyaW1lbnQiXSA8LSAiYXJjIgppc29fcmVzdWx0c19sc19jbGVhbltbMV1dW1syXV1bIlRyZWF0bWVudCJdIDwtICJhaXItZHJ5ICsgc3RvcmFnZSIKCiMgMi4gaXNvX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wMS0yMwojIyAyMDE5MDEyMi1NYW51ZWxSb3N0LTE0MjA4Mi0xNDE1NTMueGxzYAppc29fcmVzdWx0c19sc19jbGVhbltbMl1dW1sxXV1bIlBlcmlvZCJdIDwtICJpbmMiCmlzb19yZXN1bHRzX2xzX2NsZWFuW1syXV1bWzFdXVsiRXhwZXJpbWVudCJdIDwtICJhcmMiCmlzb19yZXN1bHRzX2xzX2NsZWFuW1syXV1bWzFdXVsiVHJlYXRtZW50Il0gPC0gImFpci1kcnkgKyBzdG9yYWdlIgoKIyAzLiBpc29famVuYV9yZXN1bHRzLWNvMl8yMDE5LTA5LTEwCiMjIDIwMTkwOTA5LTJXaC1KZWZmcmV5X0JlZW0tTWlsbGVyLTEzNjEzLTEzNjU4Lnhscwppc29fcmVzdWx0c19sc19jbGVhbltbM11dW1sxXV1bIlBlcmlvZCJdIDwtICJwcmUiCmlzb19yZXN1bHRzX2xzX2NsZWFuW1szXV1bWzFdXVsiRXhwZXJpbWVudCJdIDwtICJyZXdldCIKaXNvX3Jlc3VsdHNfbHNfY2xlYW5bWzNdXVtbMV1dWyJUcmVhdG1lbnQiXSA8LSAiY29udHJvbCIKCiMgNC4gaXNvX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wOS0xMQojIyAyMDE5MDkxMC1KZWZmcmV5X0JlZW0tTWlsbGVyLTEzNjY0LTEzNzAyLnhscwppc29fcmVzdWx0c19sc19jbGVhbltbNF1dW1sxXV1bIlBlcmlvZCJdIDwtICJpbmMiCmlzb19yZXN1bHRzX2xzX2NsZWFuW1s0XV1bWzFdXVsiRXhwZXJpbWVudCJdIDwtICJyZXdldCIKaXNvX3Jlc3VsdHNfbHNfY2xlYW5bWzRdXVtbMV1dWyJUcmVhdG1lbnQiXSA8LSAiY29udHJvbCIKCiMgNS4gaXNvX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0xMi0wNAojIyAyMDE5MTEyNi1NUm9zdC1CZWVtTWlsbGVyLTE3NTA5LTE3NTU1Lnhscwppc29fcmVzdWx0c19sc19jbGVhbltbNV1dW1sxXV1bIlBlcmlvZCJdIDwtICJpbmMiCmlzb19yZXN1bHRzX2xzX2NsZWFuW1s1XV1bWzFdXVsiRXhwZXJpbWVudCJdIDwtICJyZXdldCIKaXNvX3Jlc3VsdHNfbHNfY2xlYW5bWzVdXVtbMV1dWyJUcmVhdG1lbnQiXSA8LSAiYWlyLWRyeSIKCiMgNi4gaXNvX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0xMi0yMQojIyAyMDE5MDIxMy1NYW51ZWxSb3N0LTE0MzE5Mi0xNDMyOTQueGxzCmlzb19yZXN1bHRzX2xzX2NsZWFuW1s2XV1bWzFdXVsiUGVyaW9kIl0gPC0gImluYyIKaXNvX3Jlc3VsdHNfbHNfY2xlYW5bWzZdXVtbMV1dWyJFeHBlcmltZW50Il0gPC0gImFyYyIKaXNvX3Jlc3VsdHNfbHNfY2xlYW5bWzZdXVtbMV1dWyJUcmVhdG1lbnQiXSA8LSAiYWlyLWRyeSArIHN0b3JhZ2UiCgojIyAyMDE5MTEwNi1NUm9zdC0xNjkyNS0xNjk1Mi54bHMKaXNvX3Jlc3VsdHNfbHNfY2xlYW5bWzZdXVtbMl1dWyJQZXJpb2QiXSA8LSAiaW5jIgppc29fcmVzdWx0c19sc19jbGVhbltbNl1dW1syXV1bIkV4cGVyaW1lbnQiXSA8LSAicmV3ZXQiCmlzb19yZXN1bHRzX2xzX2NsZWFuW1s2XV1bWzJdXVsiVHJlYXRtZW50Il0gPC0gImNvbnRyb2wiCgojIyBBcmNJbmNfZHJ5XzEzQy54bHMKaXNvX3Jlc3VsdHNfbHNfY2xlYW5bWzZdXVtbM11dWyJQZXJpb2QiXSA8LSAicHJlIgppc29fcmVzdWx0c19sc19jbGVhbltbNl1dW1szXV1bIkV4cGVyaW1lbnQiXSA8LSAicmV3ZXQiCmlzb19yZXN1bHRzX2xzX2NsZWFuW1s2XV1bWzNdXVsiVHJlYXRtZW50Il0gPC0gImFpci1kcnkiCgojIEZsYXR0ZW4gbGlzdAppc29fZGYgPC0gc3VwcHJlc3NXYXJuaW5ncyhiaW5kX3Jvd3ModW5saXN0KGlzb19yZXN1bHRzX2xzX2NsZWFuLCByZWN1cnNpdmUgPSBGQUxTRSkpKQoKIyBleHRyYWN0IG9yaWdpbmFsIElEcwpvZy5zbiA8LSB2ZWN0b3IoKQpmb3IoaSBpbiBzZXFfYWxvbmcoaXNvX2RmJFNhbXBsZU5hbWUpKSB7CiAgb2cuc25baV0gPC0gaWZlbHNlKGdyZXBsKCJIRSIsIGlzb19kZiRTYW1wbGVOYW1lW2ldKSwKICAgICAgICAgICAgICAgICAgICAgc3Vic3RyKGlzb19kZiRTYW1wbGVOYW1lW2ldLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gdW5saXN0KGdyZWdleHByKCJIRSIsIGlzb19kZiRTYW1wbGVOYW1lW2ldKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcCA9IHVubGlzdChncmVnZXhwcigiSEUiLCBpc29fZGYkU2FtcGxlTmFtZVtpXSkpICsgNCksCiAgICAgICAgICAgICAgICAgICAgIHN1YnN0cihpc29fZGYkU2FtcGxlTmFtZVtpXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IHVubGlzdChncmVnZXhwcigiU0UiLCBpc29fZGYkU2FtcGxlTmFtZVtpXSkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3AgPSB1bmxpc3QoZ3JlZ2V4cHIoIlNFIiwgaXNvX2RmJFNhbXBsZU5hbWVbaV0pKSArIDQpKQp9Cmlzb19kZiRJRCA8LSBvZy5zbgppc29fZGYkVHlwZSA8LSBpZmVsc2UoZ3JlcGwoIkciLCBpc29fZGYkSUQpLCAiRyIsICJGIikKCiMgYWRkIGNvbnRyb2wgc2FtcGxlIDEzQyBmb3IgYXJjIGV4cGVyaW1lbnQKYXJjLmN0bC5pbmMuSURzIDwtIHVuaXF1ZShpc29fZGZbaXNvX2RmJEV4cGVyaW1lbnQgPT0gImFyYyIgJiBpc29fZGYkUGVyaW9kID09ICJpbmMiLCAiSUQiXSkKYXJjLmN0bC5pbmMuMTNjIDwtIGRhdGEuZnJhbWUoSUQgPSBhcmMuY3RsLmluYy5JRHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZU5hbWUgPSBhcmMuY3RsLmluYy5JRHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQxM2MgPSB4cGxyLmN0bC5pc29bd2hpY2goIWlzLm5hKG1hdGNoKHhwbHIuY3RsLmlzbyRFUF9QbG90aWQsIGFyYy5jdGwuaW5jLklEcykpKSwgIjEzY19DTzIiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwZXJpbWVudCA9ICJhcmMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJpb2QgPSAiaW5jIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJlYXRtZW50ID0gImNvbnRyb2wiKQppc29fZGYgPC0gcmJpbmQoaXNvX2RmLCBhcmMuY3RsLmluYy4xM2MpCiMgZ2dwbG90KGlzb19kZiwgYWVzKElELCBkMTNjLCBjb2xvciA9IFRyZWF0bWVudCwgc2hhcGUgPSBQZXJpb2QpKSArCiMgICAgIGdlb21fcG9pbnQoc2l6ZSA9IDMpICsKIyAgICAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhFeHBlcmltZW50KSkgKwojICAgICB0aGVtZV9idygpCmBgYAoKCmBgYHtyIGNvdW50cyBmb3IgY2hlY2tpbmcgcGxvdHMsIGluY2x1ZGUgPSBGQUxTRX0KIyA4LiBDb3VudCBudW1iZXIgb2YgXjE0XkMgb2JzZXJ2YXRpb25zIGZvciBjaGVja2luZyBwbG90cy4KIyBjb3VudCAhaXMubmEoMTRDKSBjYXNlcyBieSBTYW1wbGVOYW1lCmFsbC4xNGNbLXdoaWNoKGlzLm5hKGFsbC4xNGMkZDE0Y19jb3JyKSksXSAlPiUKICBncm91cF9ieShFeHBlcmltZW50LCBUcmVhdG1lbnQsIFBlcmlvZCwgVHlwZSkgJT4lCiAgY291bnQoKQojIGJ5IElECmFsbC4xNGNbLXdoaWNoKGlzLm5hKGFsbC4xNGMkZDE0Y19jb3JyKSksXSAlPiUKICBncm91cF9ieShFeHBlcmltZW50LCBUcmVhdG1lbnQsIFBlcmlvZCwgVHlwZSkgJT4lCiAgZGlzdGluY3QoSUQpICU+JQogIGNvdW50KCkKYGBgCgoqUHJlLWluY3ViYXRpb24gdmVyc3VzIGVxdWlsaWJyaXVtIHJlc3BpcmF0aW9uIF4xNF5DLUNPfjJ+KgoKRGVzcGl0ZSB0aGUgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZXMgaW4gcmVzcGlyYXRpb24sIGFuZCBpbiBjb250cmFzdCB0byBoeXBvdGhlc2lzIDEsIHdlIGRpZCBub3Qgb2JzZXJ2ZSBzaWduaWZpY2FudCBkaWZmZXJlbmNlcyBiZXR3ZWVuIF4xNF5DLUNPfjJ+IHJlc3BpcmVkIGR1cmluZyB0aGUgcHJlLWluY3ViYXRpb24gcGVyaW9kIGFuZCBeMTReQy1DT34yfiByZXNwaXJlZCBkdXJpbmcgdGhlIGVxdWlsaWJyaXVtIHJlc3BpcmF0aW9uIHBlcmlvZDogbmVpdGhlciBmb3IgdGhlIGFpci1kcnkgKyBzdG9yYWdlIHRyZWF0bWVudCBub3IgZm9yIHRoZSBhaXItZHJ5IHRyZWF0bWVudCBhbG9uZSAqKihGaWcuIDUpKiouIFRoZSBpbnRlcmFjdGlvbnMgd2l0aCBsYW5kIHVzZSB3YXMgbm90IHNpZ25pZmljYW50IG5vciB3YXMgdGhlIGludGVyYWN0aW9uIHdpdGggZXhwZXJpbWVudCwgc28gYWxsIGRhdGEgd2VyZSBwb29sZWQgZm9yIHN0YXRpc3RpY2FsIGFuYWx5c2lzLgoKYGBge3IgcHJlLWluYy0xNGMtcGxvdH0KYWxsLjE0Yy5wcmUuaW5jIDwtIG1lcmdlKGFsbC4xNGMuc3VtLmRmW2FsbC4xNGMuc3VtLmRmJFBlcmlvZCA9PSAicHJlIiwgYygiSUQiLCAiRXhwZXJpbWVudCIsICJUeXBlIiwgIlRyZWF0bWVudCIsICJkMTRjX2NvcnJfbWVhbiIsICJkMTRjX2NvcnJfbWluIiwgImQxNGNfY29ycl9tYXgiKV0sCiAgICAgICAgICAgICAgICAgICAgICAgICBhbGwuMTRjLnN1bS5kZlthbGwuMTRjLnN1bS5kZiRQZXJpb2QgPT0gImluYyIsIGMoIklEIiwgIkV4cGVyaW1lbnQiLCAiVHlwZSIsICJUcmVhdG1lbnQiLCAiZDE0Y19jb3JyX21lYW4iLCAiZDE0Y19jb3JyX21pbiIsICJkMTRjX2NvcnJfbWF4IildLAogICAgICAgICAgICAgICAgICAgICAgICAgYnkgPSBjKCJJRCIsICJFeHBlcmltZW50IiwgIlR5cGUiLCAiVHJlYXRtZW50IiksCiAgICAgICAgICAgICAgICAgICAgICAgICBzdWZmaXhlcyA9IGMoIl9wcmUiLCAiX2luYyIpKQphbGwuMTRjLnByZS5pbmMkdHJlYXQuYmkgPC0gaWZlbHNlKGFsbC4xNGMucHJlLmluYyRUcmVhdG1lbnQgPT0gImNvbnRyb2wiLCAiY29udHJvbCIsICJ0cmVhdG1lbnQiKQoKYWxsLjE0Yy5wcmUuaW5jICU+JQogIGZpbHRlcihFeHBlcmltZW50ICE9ICJ0bWUiKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKGQxNGNfY29ycl9tZWFuX3ByZSwgZDE0Y19jb3JyX21lYW5faW5jLCBjb2xvciA9IFR5cGUsIHNoYXBlID0gVHJlYXRtZW50KSkgKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGNvbG9yID0gImdyYXkiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgY29sb3IgPSAiZ3JheSIpICsKICBnZW9tX3BvaW50KHNpemUgPSAzKSArCiAgZ2VvbV9lcnJvcmJhcigKICAgIGFlcyh5bWluID0gZDE0Y19jb3JyX21pbl9pbmMsIAogICAgICAgIHltYXggPSBkMTRjX2NvcnJfbWF4X2luYywgCiAgICAgICAgY29sb3IgPSBUeXBlKSwgCiAgICB3aWR0aCA9IC4yNSkgKwogIGdlb21fZXJyb3JiYXJoKAogICAgYWVzKHhtaW4gPSBkMTRjX2NvcnJfbWluX3ByZSwgCiAgICAgICAgeG1heCA9IGQxNGNfY29ycl9tYXhfcHJlLCAKICAgICAgICBjb2xvciA9IFR5cGUpLCAKICAgIGhlaWdodCA9IC45KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAnRWNvc3lzdGVtJywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID1jKCdGJz0nI2EzNTUxMycsJ0cnPScjMTM2MWEzJyksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ0ZvcmVzdCcsJ0dyYXNzbGFuZCcpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAnVHJlYXRtZW50JywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiY29udHJvbCIgPSAxNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeSIgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5ICsgc3RvcmFnZSIgPSAwKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiY29udHJvbCIgPSAiY29udHJvbC0yIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeSIgPSAiYWlyLWRyeSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpci1kcnkgKyBzdG9yYWdlIiA9ICJhaXItZHJ5ICsgc3RvcmFnZSIpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoLTYwLCAxMTUpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLTYwLCAxMTUpKSArCiAgeGxhYihleHByZXNzaW9uKCdQcmUtaW5jdWJhdGlvbiAnKkRlbHRhKicnXjE0KidDICjigLApJykpICsKICB5bGFiKGV4cHJlc3Npb24oJ0VxdWlsaWJyaXVtIHJlc3BpcmF0aW9uICcqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLmtleS5oZWlnaHQ9dW5pdCguOCwgImNtIiksCiAgICAgICAgYXNwZWN0LnJhdGlvID0gMSkKYGBgCj4qKkZpZy4gYHIge2ZpZy5uICsgMn1gLiBQcmUtaW5jdWJhdGlvbiBwZXJpb2QgJFxEZWx0YSReMTReQyBhZ2FpbnN0IGVxdWlsaWJyaXVtIHJlc3BpcmF0aW9uIHBlcmlvZCAkXERlbHRhJF4xNF5DKioKCj4qQ2FwdGlvbjoqIFBvaW50cyBhcmUgbWVhbnMgb2YgbGFib3JhdG9yeSBkdXBsaWNhdGVzIGFuZCBlcnJvciBiYXJzIGFyZSB0aGUgbWluIGFuZCBtYXggKGV4Y2VwdCBmb3IgRXhwZXJpbWVudCAxIGNvbnRyb2wgc2FtcGxlcywgd2hpY2ggd2VyZSBub3QgcmVwbGljYXRlZCkuIE5vdGUgdGhhdCBwcmUtaW5jdWJhdGlvbiAkXERlbHRhJF4xNF5DIHdhcyBub3QgbWVhc3VyZWQgZm9yIHRoZSBFeHBlcmltZW50IDEgY29udHJvbCBzYW1wbGVzOyBhZGRpdGlvbmFsbHkgc2FtcGxlcyBmcm9tIHRocmVlIG9mIHRoZSBmb3Jlc3QgcGxvdHMgb2YgdGhlIEV4cGVyaW1lbnQgMSB0cmVhdG1lbnQgc2FtcGxlcyAoYWlyLWRyeSArIHN0b3JhZ2UpIGZhaWxlZCB0byBhY2N1bXVsYXRlIGVub3VnaCBDT34yfiBkdXJpbmcgdGhlIHByZS1pbmN1YmF0aW9uIHBlcmlvZCB0byBtZWFzdXJlICRcRGVsdGEkXjE0XkMuIFRoZSBvdXRsaWVyIHBvaW50IHdpdGggdGhlIHN1YnN0YW50aWFsbHkgZGVwbGV0ZWQgcHJlLWluY3ViYXRpb24gJFxEZWx0YSReMTReQyBpcyBmcm9tIEV4cGVyaW1lbnQgMiAoY29udHJvbCkuCgpOb3RlIHRoZSBvbmUgb3V0bGllciAoZm9yZXN0LCBjb250cm9sKSBmb3Igd2hpY2ggdGhlIHByZS1pbmN1YmF0aW9uIENPfjJ+IHdhcyBzdWJzdGFudGlhbGx5IGRlcGxldGVkIHJlbGF0aXZlIHRvIGVxdWlsaWJyaXVtIHBlcmlvZCByZXNwaXJhdGlvbi4gSG93ZXZlciwgZXZlbiB3aGVuIHRoaXMgb3V0bGllciB3YXMgaW5jbHVkZWQgaW4gdGhlIHN0YXRpc3RpY2FsIGFuYWx5c2lzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gcHJlLWluY3ViYXRpb24gXjE0XkMtQ09+Mn4gYW5kIGVxdWlsaWJyaXVtIF4xNF5DLUNPfjJ+IHdhcyBub3Qgc2lnbmlmaWNhbnQuIEZvciBjbGFyaXR5LCB0aGlzIHBvaW50IHdpbGwgYmUgZXhjbHVkZWQgZnJvbSB0aGUgZnV0dXJlIHBsb3RzLiBEdWUgdG8gbG93ZXIgcmVzcGlyYXRpb24gcmF0ZXMgZHVyaW5nIHByZS1pbmN1YmF0aW9uLCBvbmx5IHRocmVlIG9mIHRoZSBzaXggZm9yZXN0IHNhbXBsZXMgaW4gRXhwZXJpbWVudCAxIGdlbmVyYXRlZCBlbm91Z2ggQ09+Mn4gdG8gbWVhc3VyZSByYWRpb2NhcmJvbiwgYW5kIGFkZGl0aW9uYWxseSwgaXQgd2FzIG5vdCBwb3NzaWJsZSB0byBjb21wYXJlIHByZS1pbmN1YmF0aW9uIGFuZCBlcXVpbGlicml1bSByZXNwaXJhdGlvbiBeMTReQy1DT34yfiBmb3IgdGhlIGNvbnRyb2wgc2FtcGxlcyBpbiBFeHBlcmltZW50IDEgc2luY2UgcHJlLWluY3ViYXRpb24gXjE0XkMtQ09+Mn4gd2FzIG5vdCBtZWFzdXJlZCBmb3IgdGhlc2Ugc2FtcGxlcyBpbiAyMDExLgoKCmBgYHtyIHByZS1pbmMtMTNjLXBsb3QsIGluY2x1ZGUgPSBGQUxTRX0KaXNvLjEyLmF2ZyA8LSBpc29fZGYgJT4lCiAgc2VsZWN0KElELCBFeHBlcmltZW50LCBQZXJpb2QsIFRyZWF0bWVudCwgZDEzYykgJT4lCiAgZ3JvdXBfYnkoSUQsIEV4cGVyaW1lbnQsIFBlcmlvZCwgVHJlYXRtZW50KSAlPiUKICBhZGRfY291bnQoKSAlPiUKICBzdW1tYXJpemVfYWxsKGxpc3QobWVhbiA9IG1lYW4sIHNkID0gc2QpLCBuYS5ybSA9IFRSVUUpICU+JQogIG11dGF0ZShkMTNjX3NlID0gZDEzY19zZC9uX21lYW4sCiAgICAgICAgICBkMTNjX3UgPSBkMTNjX21lYW4gKyBkMTNjX3NlKjIsCiAgICAgICAgICBkMTNjX2wgPSBkMTNjX21lYW4gLSBkMTNjX3NlKjIpCgppc28uMTIuYXZnJFR5cGUgPC0gaWZlbHNlKGdyZXBsKCJHIiwgaXNvLjEyLmF2ZyRJRCksICJHIiwgIkYiKQoKIyBzdGF0cwojIGFpci1kcnkgKyBzdG9yYWdlCiMgZm9yZXN0CnQudGVzdChpc29fZGZbaXNvX2RmJFBlcmlvZCA9PSAiaW5jIiAmIGlzb19kZiRFeHBlcmltZW50ID09ICJhcmMiICYgaXNvX2RmJFRyZWF0bWVudCA9PSAiY29udHJvbCIgJiBpc29fZGYkVHlwZSA9PSAiRiIsICJkMTNjIl0sIAogICAgICAgaXNvX2RmW2lzb19kZiRQZXJpb2QgPT0gImluYyIgJiBpc29fZGYkRXhwZXJpbWVudCA9PSAiYXJjIiAmIGlzb19kZiRUcmVhdG1lbnQgPT0gImFpci1kcnkgKyBzdG9yYWdlIiAmIGlzb19kZiRUeXBlID09ICJGIiwgImQxM2MiXSwgdGFpbHMgPSAyKQoKIyBncmFzc2xhbmQKdC50ZXN0KGlzb19kZltpc29fZGYkUGVyaW9kID09ICJpbmMiICYgaXNvX2RmJEV4cGVyaW1lbnQgPT0gImFyYyIgJiBpc29fZGYkVHJlYXRtZW50ID09ICJjb250cm9sIiAmIGlzb19kZiRUeXBlID09ICJHIiwgImQxM2MiXSwgCiAgICAgICBpc29fZGZbaXNvX2RmJFBlcmlvZCA9PSAiaW5jIiAmIGlzb19kZiRFeHBlcmltZW50ID09ICJhcmMiICYgaXNvX2RmJFRyZWF0bWVudCA9PSAiYWlyLWRyeSArIHN0b3JhZ2UiICYgaXNvX2RmJFR5cGUgPT0gIkciLCAiZDEzYyJdLCB0YWlscyA9IDIpCgojIGFpci1kcnkgb25seQojIGZvcmVzdAp0LnRlc3QoaXNvX2RmW2lzb19kZiRQZXJpb2QgPT0gImluYyIgJiBpc29fZGYkRXhwZXJpbWVudCA9PSAicmV3ZXQiICYgaXNvX2RmJFRyZWF0bWVudCA9PSAiY29udHJvbCIgJiBpc29fZGYkVHlwZSA9PSAiRiIsICJkMTNjIl0sIAogICAgICAgaXNvX2RmW2lzb19kZiRQZXJpb2QgPT0gImluYyIgJiBpc29fZGYkRXhwZXJpbWVudCA9PSAicmV3ZXQiICYgaXNvX2RmJFRyZWF0bWVudCA9PSAiYWlyLWRyeSIgJiBpc29fZGYkVHlwZSA9PSAiRiIsICJkMTNjIl0sIHRhaWxzID0gMikKCiMgZ3Jhc3NsYW5kCnQudGVzdChpc29fZGZbaXNvX2RmJFBlcmlvZCA9PSAiaW5jIiAmIGlzb19kZiRFeHBlcmltZW50ID09ICJyZXdldCIgJiBpc29fZGYkVHJlYXRtZW50ID09ICJjb250cm9sIiAmIGlzb19kZiRUeXBlID09ICJHIiwgImQxM2MiXSwgCiAgICAgICBpc29fZGZbaXNvX2RmJFBlcmlvZCA9PSAiaW5jIiAmIGlzb19kZiRFeHBlcmltZW50ID09ICJyZXdldCIgJiBpc29fZGYkVHJlYXRtZW50ID09ICJhaXItZHJ5IiAmIGlzb19kZiRUeXBlID09ICJHIiwgImQxM2MiXSwgdGFpbHMgPSAyKQoKCgppc28uMTIucHJlLmluYyA8LSBtZXJnZShpc28uMTIuYXZnW2lzby4xMi5hdmckUGVyaW9kID09ICJwcmUiLCBjKCJJRCIsICJFeHBlcmltZW50IiwgIlR5cGUiLCAiVHJlYXRtZW50IiwgImQxM2NfbWVhbiIsICJkMTNjX3UiLCAiZDEzY19sIildLAogICAgICAgICAgICAgICAgICAgICAgICBpc28uMTIuYXZnW2lzby4xMi5hdmckUGVyaW9kID09ICJpbmMiLCBjKCJJRCIsICJFeHBlcmltZW50IiwgIlR5cGUiLCAiVHJlYXRtZW50IiwgImQxM2NfbWVhbiIsICJkMTNjX3UiLCAiZDEzY19sIildLAogICAgICAgICAgICAgICAgICAgICAgICAgYnkgPSBjKCJJRCIsICJFeHBlcmltZW50IiwgIlR5cGUiLCAiVHJlYXRtZW50IiksCiAgICAgICAgICAgICAgICAgICAgICAgICBzdWZmaXhlcyA9IGMoIl9wcmUiLCAiX2luYyIpKQppc28uMTIucHJlLmluYyR0cmVhdC5iaSA8LSBpZmVsc2UoaXNvLjEyLnByZS5pbmMkVHJlYXRtZW50ID09ICJjb250cm9sIiwgImNvbnRyb2wiLCAidHJlYXRtZW50IikKCiMgcmFuZ2UoYyhpc28uMTIucHJlLmluYyRkMTNjX2xfcHJlLCBpc28uMTIucHJlLmluYyRkMTNjX2xfaW5jLCBpc28uMTIucHJlLmluYyRkMTNjX3VfaW5jLCBpc28uMTIucHJlLmluYyRkMTNjX2xfaW5jKSwgbmEucm0gPSBUUlVFKQppc28uMTIucHJlLmluYyAlPiUKICBnZ3Bsb3QoLiwgYWVzKGQxM2NfbWVhbl9wcmUsIGQxM2NfbWVhbl9pbmMsIGNvbG9yID0gVHlwZSwgc2hhcGUgPSBUcmVhdG1lbnQpKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIGdlb21fZXJyb3JiYXIoCiAgICBhZXMoeW1pbiA9IGQxM2NfbF9pbmMsIAogICAgICAgIHltYXggPSBkMTNjX3VfaW5jLCAKICAgICAgICBjb2xvciA9IFR5cGUpLCAKICAgIHdpZHRoID0gLjI1KSArCiAgZ2VvbV9lcnJvcmJhcmgoCiAgICBhZXMoeG1pbiA9IGQxM2NfbF9wcmUsIAogICAgICAgIHhtYXggPSBkMTNjX3VfcHJlLAogICAgICAgIGNvbG9yID0gVHlwZSksIAogICAgaGVpZ2h0ID0gLjI1KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAnRWNvc3lzdGVtJywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID1jKCdGJz0nI2EzNTUxMycsJ0cnPScjMTM2MWEzJyksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ0ZvcmVzdCcsJ0dyYXNzbGFuZCcpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAnVHJlYXRtZW50JywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiY29udHJvbCIgPSAxNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeSIgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5ICsgc3RvcmFnZSIgPSAwKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiY29udHJvbCIgPSAiY29udHJvbC0xICgyMDExKSwgY29udHJvbC0yICgyMDE5KSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpci1kcnkiID0gImFpci1kcnkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5ICsgc3RvcmFnZSIgPSAiYWlyLWRyeSArIHN0b3JhZ2UiKSkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKC0yOS4xLCAtMjIuMjUpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLTI5LjEsIC0yMi4yNSkpICsKICB4bGFiKGV4cHJlc3Npb24oJ1ByZS1pbmN1YmF0aW9uICcqZGVsdGEqJydeMTMqJ0MgKOKAsCknKSkgKwogIHlsYWIoZXhwcmVzc2lvbignRXF1aWxpYnJpdW0gcmVzcGlyYXRpb24gJypkZWx0YSonJ14xMyonQyAo4oCwKScpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQua2V5LmhlaWdodD11bml0KC44LCAiY20iKSwKICAgICAgICBhc3BlY3QucmF0aW8gPSAxKQpgYGAKCmBgYHtyIHByZS1lcXUtMTRjLXN0YXRzLCBpbmNsdWRlID0gRkFMU0V9CiMgZ2F0aGVyIHByZSBhbmQgaW5jIGRhdGEgZnJvbSBhbGwgcmVwcywgYXJjIGFuZCByZXdldCBleHAgb25seQpqLnZhcnMgPC0gYygiU2FtcGxlTmFtZSIsICJJRCIsICJFeHBlcmltZW50IiwgIlRyZWF0bWVudCIsICJUeXBlIiwgImQxNGNfY29yciIsICJtZ0NPMi5DX2dDIikKYXJjLnJld2V0LnByZS4xNGMgPC0gYmluZF9yb3dzKGxhcHBseShhbGwuMTRjLmxzLCBmdW5jdGlvbihkZikgewogIGlmKCFpcy5udWxsKGRmJG1nQ08yLkNfZ0MpKSB7CiAgICAgIGRmIDwtIGRmW3doaWNoKGRmJFBlcmlvZCA9PSAicHJlIiAmIGRmJEV4cGVyaW1lbnQgIT0gInRtZSIpLCBqLnZhcnNdCiAgcmV0dXJuKGRmKQogIH0KfSkpCmFyYy5yZXdldC5pbmMuMTRjIDwtIGJpbmRfcm93cyhsYXBwbHkoYWxsLjE0Yy5scywgZnVuY3Rpb24oZGYpIHsKICBpZighaXMubnVsbChkZiRtZ0NPMi5DX2dDKSkgewogIGRmIDwtIGRmW3doaWNoKGRmJFBlcmlvZCA9PSAiaW5jIiAmIGRmJEV4cGVyaW1lbnQgIT0gInRtZSIpLCBqLnZhcnNdCiAgcmV0dXJuKGRmKQogIH0KfSkpCmFyYy5yZXdldC4xNGMgPC0gbWVyZ2UoYXJjLnJld2V0LnByZS4xNGMsIGFyYy5yZXdldC5pbmMuMTRjLCBieSA9IGoudmFyc1sxOjVdLCBzdWZmaXhlcyA9IGMoIl9wcmUiLCAiX2luYyIpKQoKYXJjLnJld2V0LjE0YyR0cmVhdC5iaSA8LSBpZmVsc2UoYXJjLnJld2V0LjE0YyRUcmVhdG1lbnQgPT0gImNvbnRyb2wiLCAiY29udHJvbCIsICJ0cmVhdG1lbnQiKQoKIyMgbG9vayBhdCBpbnRlcmFjdGlvbnMKIyBFeHBlcmltZW50IDEKIyBpbnRlcmFjdGlvbiB3aXRoIFR5cGUgbnMKc3VtbWFyeShsbShkMTRjX2NvcnJfaW5jIH4gZDE0Y19jb3JyX3ByZSAqIFR5cGUsIGFyYy5yZXdldC4xNGNbYXJjLnJld2V0LjE0YyRFeHBlcmltZW50ID09ICJhcmMiLCBdKSkKCiMgRXhwZXJpbWVudCAyCiMgaW50ZXJhY3Rpb24gd2l0aCBUeXBlICogVHJlYXRtZW50IHNpZ25pZmljYW50IGR1ZSB0byBvdXRsaWVyCnN1bW1hcnkobG0oZDE0Y19jb3JyX2luYyB+IGQxNGNfY29ycl9wcmUgKiBUeXBlICogVHJlYXRtZW50LCBhcmMucmV3ZXQuMTRjW2FyYy5yZXdldC4xNGMkRXhwZXJpbWVudCA9PSAicmV3ZXQiLCBdKSkKIyBidXQgZGlzYXBwZWFycyB3aGVuIGV4Y2x1ZGVkCnN1bW1hcnkobG0oZDE0Y19jb3JyX2luYyB+IGQxNGNfY29ycl9wcmUgKiBUeXBlICogVHJlYXRtZW50LCBhcmMucmV3ZXQuMTRjW3doaWNoKGFyYy5yZXdldC4xNGMkRXhwZXJpbWVudCA9PSAicmV3ZXQiICYgYXJjLnJld2V0LjE0YyRJRCAhPSAiSEVXMjIiKSwgXSkpCgojIGNvbWJpbmVkCnN1bW1hcnkobG0oZDE0Y19jb3JyX2luYyB+IGQxNGNfY29ycl9wcmUgKiBFeHBlcmltZW50ICogVHlwZSAqIHRyZWF0LmJpLCBhcmMucmV3ZXQuMTRjKSkgIyBvdXRsaWVyCnN1bW1hcnkobG0oZDE0Y19jb3JyX2luYyB+IGQxNGNfY29ycl9wcmUgKiBFeHBlcmltZW50ICogVHlwZSAqIHRyZWF0LmJpLCAKICAgICAgICAgICBhcmMucmV3ZXQuMTRjWy13aGljaChhcmMucmV3ZXQuMTRjJElEID09ICJIRVcyMiIpLCBdKSkgIyB3L28gSEVXMjIKCiMgdC50ZXN0CnQudGVzdChhcmMucmV3ZXQuMTRjJGQxNGNfY29ycl9wcmUsIGFyYy5yZXdldC4xNGMkZDE0Y19jb3JyX2luYykgIyB3LyBIRVcyMgp0LnRlc3QoYXJjLnJld2V0LjE0Y1std2hpY2goYXJjLnJld2V0LjE0YyRJRCA9PSAiSEVXMjIiKSwgImQxNGNfY29ycl9wcmUiXSwgCiAgICAgICBhcmMucmV3ZXQuMTRjWy13aGljaChhcmMucmV3ZXQuMTRjJElEID09ICJIRVcyMiIpLCAiZDE0Y19jb3JyX2luYyJdKSAjIHcvbyBIRVcyMgpybShqLnZhcnMpCmBgYAoKYGBge3IgcHJlLWVxdS0xM2Mtc3RhdHMsIGluY2x1ZGUgPSBGQUxTRX0KIyBnYXRoZXIgcHJlIGFuZCBpbmMgZGF0YSBmcm9tIGFsbCByZXBzLCBhcmMgYW5kIHJld2V0IGV4cCBvbmx5CmoudmFycyA8LSBjKCJTYW1wbGVOYW1lIiwgIklEIiwgIkV4cGVyaW1lbnQiLCAiVHJlYXRtZW50IiwgIlR5cGUiLCAiZDE0Y19jb3JyIiwgIm1nQ08yLkNfZ0MiKQphcmMucmV3ZXQucHJlLjE0YyA8LSBiaW5kX3Jvd3MobGFwcGx5KGFsbC4xNGMubHMsIGZ1bmN0aW9uKGRmKSB7CiAgaWYoIWlzLm51bGwoZGYkbWdDTzIuQ19nQykpIHsKICAgICAgZGYgPC0gZGZbd2hpY2goZGYkUGVyaW9kID09ICJwcmUiICYgZGYkRXhwZXJpbWVudCAhPSAidG1lIiksIGoudmFyc10KICByZXR1cm4oZGYpCiAgfQp9KSkKYXJjLnJld2V0LmluYy4xNGMgPC0gYmluZF9yb3dzKGxhcHBseShhbGwuMTRjLmxzLCBmdW5jdGlvbihkZikgewogIGlmKCFpcy5udWxsKGRmJG1nQ08yLkNfZ0MpKSB7CiAgZGYgPC0gZGZbd2hpY2goZGYkUGVyaW9kID09ICJpbmMiICYgZGYkRXhwZXJpbWVudCAhPSAidG1lIiksIGoudmFyc10KICByZXR1cm4oZGYpCiAgfQp9KSkKYXJjLnJld2V0LjE0YyA8LSBtZXJnZShhcmMucmV3ZXQucHJlLjE0YywgYXJjLnJld2V0LmluYy4xNGMsIGJ5ID0gai52YXJzWzE6NV0sIHN1ZmZpeGVzID0gYygiX3ByZSIsICJfaW5jIikpCgphcmMucmV3ZXQuMTRjJHRyZWF0LmJpIDwtIGlmZWxzZShhcmMucmV3ZXQuMTRjJFRyZWF0bWVudCA9PSAiY29udHJvbCIsICJjb250cm9sIiwgInRyZWF0bWVudCIpCgojIyBsb29rIGF0IGludGVyYWN0aW9ucwojIEV4cGVyaW1lbnQgMQojIGludGVyYWN0aW9uIHdpdGggVHlwZSBucwpzdW1tYXJ5KGxtKGQxNGNfY29ycl9pbmMgfiBkMTRjX2NvcnJfcHJlICogVHlwZSwgYXJjLnJld2V0LjE0Y1thcmMucmV3ZXQuMTRjJEV4cGVyaW1lbnQgPT0gImFyYyIsIF0pKQoKIyBFeHBlcmltZW50IDIKIyBpbnRlcmFjdGlvbiB3aXRoIFR5cGUgKiBUcmVhdG1lbnQgc2lnbmlmaWNhbnQgZHVlIHRvIG91dGxpZXIKc3VtbWFyeShsbShkMTRjX2NvcnJfaW5jIH4gZDE0Y19jb3JyX3ByZSAqIFR5cGUgKiBUcmVhdG1lbnQsIGFyYy5yZXdldC4xNGNbYXJjLnJld2V0LjE0YyRFeHBlcmltZW50ID09ICJyZXdldCIsIF0pKQojIGJ1dCBkaXNhcHBlYXJzIHdoZW4gZXhjbHVkZWQKc3VtbWFyeShsbShkMTRjX2NvcnJfaW5jIH4gZDE0Y19jb3JyX3ByZSAqIFR5cGUgKiBUcmVhdG1lbnQsIGFyYy5yZXdldC4xNGNbd2hpY2goYXJjLnJld2V0LjE0YyRFeHBlcmltZW50ID09ICJyZXdldCIgJiBhcmMucmV3ZXQuMTRjJElEICE9ICJIRVcyMiIpLCBdKSkKCiMgY29tYmluZWQKc3VtbWFyeShsbShkMTRjX2NvcnJfaW5jIH4gZDE0Y19jb3JyX3ByZSAqIEV4cGVyaW1lbnQgKiBUeXBlICogdHJlYXQuYmksIGFyYy5yZXdldC4xNGMpKSAjIG91dGxpZXIKc3VtbWFyeShsbShkMTRjX2NvcnJfaW5jIH4gZDE0Y19jb3JyX3ByZSAqIEV4cGVyaW1lbnQgKiBUeXBlICogdHJlYXQuYmksIAogICAgICAgICAgIGFyYy5yZXdldC4xNGNbLXdoaWNoKGFyYy5yZXdldC4xNGMkSUQgPT0gIkhFVzIyIiksIF0pKSAjIHcvbyBIRVcyMgoKIyB0LnRlc3QKdC50ZXN0KGFyYy5yZXdldC4xNGMkZDE0Y19jb3JyX3ByZSwgYXJjLnJld2V0LjE0YyRkMTRjX2NvcnJfaW5jKSAjIHcvIEhFVzIyCnQudGVzdChhcmMucmV3ZXQuMTRjWy13aGljaChhcmMucmV3ZXQuMTRjJElEID09ICJIRVcyMiIpLCAiZDE0Y19jb3JyX3ByZSJdLCAKICAgICAgIGFyYy5yZXdldC4xNGNbLXdoaWNoKGFyYy5yZXdldC4xNGMkSUQgPT0gIkhFVzIyIiksICJkMTRjX2NvcnJfaW5jIl0pICMgdy9vIEhFVzIyCnJtKGoudmFycykKYGBgCgoqVHJlYXRtZW50IGVmZmVjdHMgb24gb2JzZXJ2ZWQgZXF1aWxpYnJpdW0gcGVyaW9kIF4xNF5DLUNPfjJ+KgoKYGBge3IgY3RsLXRydC1kaWZzLCBpbmNsdWRlID0gRkFMU0V9CiMgYXZlcmFnZSBjb250cm9sIGFuZCB0cmVhdG1lbnQgZGF0YQojIHJlbW92ZSBIRVcyMiBjb250cm9sIHByZQojIG5vdGUgdGhhdCB1cHBlci9sb3dlciBsaW1pdHMgPSAyeFNFCmFsbC4xNGMuc3VtMiA8LSBhbGwuMTRjLmxzW1syXV0gJT4lCiAgbXV0YXRlKElELnRyZWF0LlBlcmlvZCA9IHBhc3RlKElELCBUcmVhdG1lbnQsIFBlcmlvZCkpICU+JQogIGZpbHRlcihJRC50cmVhdC5QZXJpb2QgIT0gIkhFVzIyIGNvbnRyb2wgcHJlIikgJT4lCiAgc2VsZWN0KFR5cGUsIFBlcmlvZCwgVHJlYXRtZW50LCBFeHBlcmltZW50LCBZZWFyU2FtcGxlZCwgZDE0Y19jb3JyLCBtZ0NPMi5DX2dDKSAlPiUKICBncm91cF9ieShUeXBlLCBQZXJpb2QsIFRyZWF0bWVudCwgRXhwZXJpbWVudCwgWWVhclNhbXBsZWQpICU+JQogIGFkZF9jb3VudCgpICU+JQogIHN1bW1hcml6ZV9hbGwobGlzdChtZWFuID0gbWVhbiwgc2QgPSBzZCksIG5hLnJtID0gVFJVRSkgJT4lCiAgbXV0YXRlKGQxNGNfY29ycl9zZSA9IGQxNGNfY29ycl9zZC9uX21lYW4sCiAgICAgICAgIGQxNGNfY29ycl91ID0gZDE0Y19jb3JyX21lYW4gKyBkMTRjX2NvcnJfc2UqMiwKICAgICAgICAgZDE0Y19jb3JyX2wgPSBkMTRjX2NvcnJfbWVhbiAtIGQxNGNfY29ycl9zZSoyLAogICAgICAgICBtZ0NPMi5DX2dDX3NlID0gbWdDTzIuQ19nQ19zZC9uX21lYW4sCiAgICAgICAgIG1nQ08yLkNfZ0NfdSA9IG1nQ08yLkNfZ0NfbWVhbiArIG1nQ08yLkNfZ0Nfc2UqMiwKICAgICAgICAgbWdDTzIuQ19nQ19sID0gbWdDTzIuQ19nQ19tZWFuIC0gbWdDTzIuQ19nQ19zZSoyKSAKCmFsbC4xNGMuc3VtMiR0cmVhdC5iaSA8LSBpZmVsc2UoYWxsLjE0Yy5zdW0yJFRyZWF0bWVudCA9PSAiY29udHJvbCIsICJjb250cm9sIiwidHJlYXRtZW50IikKCiMgYXZlcmFnZSAxM0MgZGF0YSBhbmQgYWRkIHRvIGFsbC4xNGMuc3VtMgppc28uMTIuYXZnMiA8LSBpc29fZGYgJT4lCiAgbXV0YXRlKFR5cGUgPSBpZmVsc2UoZ3JlcGwoIkciLCBpc29fZGYkSUQpLCAiRyIsICJGIikpICU+JQogIHNlbGVjdChUeXBlLCBQZXJpb2QsIFRyZWF0bWVudCwgRXhwZXJpbWVudCwgZDEzYykgJT4lCiAgZ3JvdXBfYnkoVHlwZSwgUGVyaW9kLCBUcmVhdG1lbnQsIEV4cGVyaW1lbnQpICU+JQogIGFkZF9jb3VudCgpICU+JQogIHN1bW1hcml6ZV9hbGwobGlzdChtZWFuID0gbWVhbiwgc2QgPSBzZCksIG5hLnJtID0gVFJVRSkgJT4lCiAgbXV0YXRlKGQxM2Nfc2UgPSBkMTNjX3NkL25fbWVhbiwKICAgICAgICAgZDEzY191ID0gZDEzY19tZWFuICsgZDEzY19zZSoyLAogICAgICAgICBkMTNjX2wgPSBkMTNjX21lYW4gLSBkMTNjX3NlKjIpIAoKYWxsLjE0Yy5zdW0yIDwtIG1lcmdlKGFsbC4xNGMuc3VtMiwgaXNvLjEyLmF2ZzJbICwgYygiRXhwZXJpbWVudCIsICJUeXBlIiwgIlRyZWF0bWVudCIsICJQZXJpb2QiLCAiZDEzY19tZWFuIiwgImQxM2Nfc2QiLCAiZDEzY19zZSIsICJkMTNjX3UiLCAiZDEzY19sIildLCAKICAgICAgICAgICAgICBieSA9IGMoIkV4cGVyaW1lbnQiLCAiVHlwZSIsICJUcmVhdG1lbnQiLCAiUGVyaW9kIiksIGFsbC54ID0gVFJVRSkKCgojIHN1bW1hcml6ZQp0cnQuY3RsLmRmIDwtIG1lcmdlKAogIGFsbC4xNGMuc3VtMlt3aGljaChhbGwuMTRjLnN1bTIkdHJlYXQuYmkgPT0gImNvbnRyb2wiICYgYWxsLjE0Yy5zdW0yJFBlcmlvZCA9PSAiaW5jIiksIGMoIlR5cGUiLCAiRXhwZXJpbWVudCIsICJkMTRjX2NvcnJfbWVhbiIsICJkMTRjX2NvcnJfc2QiLCAibl9tZWFuIiwgImQxM2NfbWVhbiIsICJkMTNjX3NkIildLAogIGFsbC4xNGMuc3VtMlt3aGljaChhbGwuMTRjLnN1bTIkdHJlYXQuYmkgIT0gImNvbnRyb2wiICYgYWxsLjE0Yy5zdW0yJFBlcmlvZCA9PSAiaW5jIiksIGMoIlR5cGUiLCAiRXhwZXJpbWVudCIsICJkMTRjX2NvcnJfbWVhbiIsICJkMTRjX2NvcnJfc2QiLCAibl9tZWFuIiwgImQxM2NfbWVhbiIsICJkMTNjX3NkIildLAogIGJ5ID0gYygiVHlwZSIsICJFeHBlcmltZW50IiksCiAgc3VmZml4ZXMgPSBjKCIuY3RsIiwgIi50cnQiKSkKIyAxNEMgZGlmcwp0cnQuY3RsLmRmJGRpZiA8LSB0cnQuY3RsLmRmJGQxNGNfY29ycl9tZWFuLmN0bCAtIHRydC5jdGwuZGYkZDE0Y19jb3JyX21lYW4udHJ0CnRydC5jdGwuZGYkZGlmLnNlIDwtIHNhcHBseShzcGxpdCh0cnQuY3RsLmRmLCAxOm5yb3codHJ0LmN0bC5kZikpLCBmdW5jdGlvbih4KSB7CiAgc3FydChzdW0oKHgkZDE0Y19jb3JyX3NkLmN0bCleMi9zcXJ0KHgkbl9tZWFuLmN0bCksCiAgICAgICh4JGQxNGNfY29ycl9zZC50cnQpXjIvc3FydCh4JG5fbWVhbi50cnQpKSkKICB9KQp0cnQuY3RsLmRmJGRpZi5zZCA8LSBzYXBwbHkoc3BsaXQodHJ0LmN0bC5kZiwgMTpucm93KHRydC5jdGwuZGYpKSwgZnVuY3Rpb24oeCkgewogIHNxcnQoc3VtKHgkZDE0Y19jb3JyX3NkLmN0bF4yL3gkbl9tZWFuLmN0bCwKICAgICAgICAgICB4JGQxNGNfY29ycl9zZC50cnReMi94JG5fbWVhbi50cnQpKQogIH0pCiMgMTNDIGRpZnMKdHJ0LmN0bC5kZiRkaWYuMTNjIDwtIHRydC5jdGwuZGYkZDEzY19tZWFuLmN0bCAtIHRydC5jdGwuZGYkZDEzY19tZWFuLnRydAp0cnQuY3RsLmRmJGRpZi5zZS4xM2MgPC0gc2FwcGx5KHNwbGl0KHRydC5jdGwuZGYsIDE6bnJvdyh0cnQuY3RsLmRmKSksIGZ1bmN0aW9uKHgpIHsKICBzcXJ0KHN1bSgoeCRkMTNjX3NkLmN0bCleMi9zcXJ0KHgkbl9tZWFuLmN0bCksCiAgICAgICh4JGQxM2Nfc2QudHJ0KV4yL3NxcnQoeCRuX21lYW4udHJ0KSkpCiAgfSkKdHJ0LmN0bC5kZiRkaWYuc2QuMTNjIDwtIHNhcHBseShzcGxpdCh0cnQuY3RsLmRmLCAxOm5yb3codHJ0LmN0bC5kZikpLCBmdW5jdGlvbih4KSB7CiAgc3FydChzdW0oeCRkMTNjX3NkLmN0bF4yL3gkbl9tZWFuLmN0bCwKICAgICAgICAgICB4JGQxM2Nfc2QudHJ0XjIveCRuX21lYW4udHJ0KSkKICB9KQoKCiMgIyBtZWFuIGRpZgojIG1lYW4oYWJzKHRydC5jdGwuZGZbdHJ0LmN0bC5kZiRUeXBlID09ICJGIiwgImRpZiJdKSkKIyBzcXJ0KHN1bSh0cnQuY3RsLmRmW3RydC5jdGwuZGYkVHlwZSA9PSAiRiIsICJkaWYuc2QiXV4yL3RydC5jdGwuZGZbdHJ0LmN0bC5kZiRUeXBlID09ICJGIiwgIm5fbWVhbi50cnQiXSkpCgojIGNhbGN1bGF0ZSBkaWZmZXJlbmNlcyB3aXRoaW4gdHJlYXRtZW50IGdyb3VwcywgaS5lLiBjdGwgMjAxMSAtIGN0bCAyMDE5LCBldGMuCiMgZm9yZXN0cwojIGNvbnRyb2wKZi5jdGwuZGlmIDwtIHRydC5jdGwuZGZbdHJ0LmN0bC5kZiRFeHBlcmltZW50ID09ICJhcmMiICYgdHJ0LmN0bC5kZiRUeXBlID09ICJGIiwgImQxNGNfY29ycl9tZWFuLmN0bCJdIC0gdHJ0LmN0bC5kZlt0cnQuY3RsLmRmJEV4cGVyaW1lbnQgPT0gInJld2V0IiAmIHRydC5jdGwuZGYkVHlwZSA9PSAiRiIsICJkMTRjX2NvcnJfbWVhbi5jdGwiXQoKZi5jdGwuZGlmLnNkIDwtIHNxcnQodHJ0LmN0bC5kZlt0cnQuY3RsLmRmJEV4cGVyaW1lbnQgPT0gImFyYyIgJiB0cnQuY3RsLmRmJFR5cGUgPT0gIkYiLCAiZDE0Y19jb3JyX3NkLmN0bCJdXjIvdHJ0LmN0bC5kZlt0cnQuY3RsLmRmJEV4cGVyaW1lbnQgPT0gImFyYyIgJiB0cnQuY3RsLmRmJFR5cGUgPT0gIkYiLCAibl9tZWFuLmN0bCJdICsgdHJ0LmN0bC5kZlt0cnQuY3RsLmRmJEV4cGVyaW1lbnQgPT0gInJld2V0IiAmIHRydC5jdGwuZGYkVHlwZSA9PSAiRiIsICJkMTRjX2NvcnJfc2QuY3RsIl1eMi90cnQuY3RsLmRmW3RydC5jdGwuZGYkRXhwZXJpbWVudCA9PSAicmV3ZXQiICYgdHJ0LmN0bC5kZiRUeXBlID09ICJGIiwgIm5fbWVhbi5jdGwiXSkKCiMgdHJlYXRtZW50CmYudHJ0LmRpZiA8LSB0cnQuY3RsLmRmW3RydC5jdGwuZGYkRXhwZXJpbWVudCA9PSAiYXJjIiAmIHRydC5jdGwuZGYkVHlwZSA9PSAiRiIsICJkMTRjX2NvcnJfbWVhbi50cnQiXSAtIHRydC5jdGwuZGZbdHJ0LmN0bC5kZiRFeHBlcmltZW50ID09ICJyZXdldCIgJiB0cnQuY3RsLmRmJFR5cGUgPT0gIkYiLCAiZDE0Y19jb3JyX21lYW4udHJ0Il0KCmYudHJ0LmRpZi5zZCA8LSBzcXJ0KHRydC5jdGwuZGZbdHJ0LmN0bC5kZiRFeHBlcmltZW50ID09ICJhcmMiICYgdHJ0LmN0bC5kZiRUeXBlID09ICJGIiwgImQxNGNfY29ycl9zZC50cnQiXV4yL3RydC5jdGwuZGZbdHJ0LmN0bC5kZiRFeHBlcmltZW50ID09ICJhcmMiICYgdHJ0LmN0bC5kZiRUeXBlID09ICJGIiwgIm5fbWVhbi50cnQiXSArIHRydC5jdGwuZGZbdHJ0LmN0bC5kZiRFeHBlcmltZW50ID09ICJyZXdldCIgJiB0cnQuY3RsLmRmJFR5cGUgPT0gIkYiLCAiZDE0Y19jb3JyX3NkLnRydCJdXjIvdHJ0LmN0bC5kZlt0cnQuY3RsLmRmJEV4cGVyaW1lbnQgPT0gInJld2V0IiAmIHRydC5jdGwuZGYkVHlwZSA9PSAiRiIsICJuX21lYW4udHJ0Il0pCgoKIyBncmFzc2xhbmRzCiMgY29udHJvbApnLmN0bC5kaWYgPC0gdHJ0LmN0bC5kZlt0cnQuY3RsLmRmJEV4cGVyaW1lbnQgPT0gImFyYyIgJiB0cnQuY3RsLmRmJFR5cGUgPT0gIkciLCAiZDE0Y19jb3JyX21lYW4uY3RsIl0gLSB0cnQuY3RsLmRmW3RydC5jdGwuZGYkRXhwZXJpbWVudCA9PSAicmV3ZXQiICYgdHJ0LmN0bC5kZiRUeXBlID09ICJHIiwgImQxNGNfY29ycl9tZWFuLmN0bCJdCgpnLmN0bC5kaWYuc2QgPC0gc3FydCh0cnQuY3RsLmRmW3RydC5jdGwuZGYkRXhwZXJpbWVudCA9PSAiYXJjIiAmIHRydC5jdGwuZGYkVHlwZSA9PSAiRyIsICJkMTRjX2NvcnJfc2QuY3RsIl1eMi90cnQuY3RsLmRmW3RydC5jdGwuZGYkRXhwZXJpbWVudCA9PSAiYXJjIiAmIHRydC5jdGwuZGYkVHlwZSA9PSAiRyIsICJuX21lYW4uY3RsIl0gKyB0cnQuY3RsLmRmW3RydC5jdGwuZGYkRXhwZXJpbWVudCA9PSAicmV3ZXQiICYgdHJ0LmN0bC5kZiRUeXBlID09ICJHIiwgImQxNGNfY29ycl9zZC5jdGwiXV4yL3RydC5jdGwuZGZbdHJ0LmN0bC5kZiRFeHBlcmltZW50ID09ICJyZXdldCIgJiB0cnQuY3RsLmRmJFR5cGUgPT0gIkciLCAibl9tZWFuLmN0bCJdKQoKIyB0cmVhdG1lbnQKZy50cnQuZGlmIDwtIHRydC5jdGwuZGZbdHJ0LmN0bC5kZiRFeHBlcmltZW50ID09ICJhcmMiICYgdHJ0LmN0bC5kZiRUeXBlID09ICJHIiwgImQxNGNfY29ycl9tZWFuLnRydCJdIC0gdHJ0LmN0bC5kZlt0cnQuY3RsLmRmJEV4cGVyaW1lbnQgPT0gInJld2V0IiAmIHRydC5jdGwuZGYkVHlwZSA9PSAiRyIsICJkMTRjX2NvcnJfbWVhbi50cnQiXQoKZy50cnQuZGlmLnNkIDwtIHNxcnQodHJ0LmN0bC5kZlt0cnQuY3RsLmRmJEV4cGVyaW1lbnQgPT0gImFyYyIgJiB0cnQuY3RsLmRmJFR5cGUgPT0gIkciLCAiZDE0Y19jb3JyX3NkLnRydCJdXjIvdHJ0LmN0bC5kZlt0cnQuY3RsLmRmJEV4cGVyaW1lbnQgPT0gImFyYyIgJiB0cnQuY3RsLmRmJFR5cGUgPT0gIkciLCAibl9tZWFuLnRydCJdICsgdHJ0LmN0bC5kZlt0cnQuY3RsLmRmJEV4cGVyaW1lbnQgPT0gInJld2V0IiAmIHRydC5jdGwuZGYkVHlwZSA9PSAiRyIsICJkMTRjX2NvcnJfc2QudHJ0Il1eMi90cnQuY3RsLmRmW3RydC5jdGwuZGYkRXhwZXJpbWVudCA9PSAicmV3ZXQiICYgdHJ0LmN0bC5kZiRUeXBlID09ICJHIiwgIm5fbWVhbi50cnQiXSkKCiMgYXRtCmF0bS5kaWYgPC0gRGF0bVtEYXRtJERhdGUgPT0gMjAxMS41LCAiTkhjMTQiXSAtIERhdG1bRGF0bSREYXRlID09IDIwMTkuNSwgIk5IYzE0Il0KCmRpZi50aW1lLmRmIDwtIGRhdGEuZnJhbWUoZGlmID0gYyhmLmN0bC5kaWYsIGYudHJ0LmRpZiwgZy5jdGwuZGlmLCBnLnRydC5kaWYsIGF0bS5kaWYpLAogICAgICAgICAgICAgICAgICAgICAgICAgIHNkID0gYyhmLmN0bC5kaWYuc2QsIGYudHJ0LmRpZi5zZCwgZy5jdGwuZGlmLnNkLCBnLnRydC5kaWYuc2QsIE5BKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlID0gYyhyZXAoYygiRiIsIkciKSwgZWFjaCA9IDIpLCAiYXRtIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgVHJlYXRtZW50ID0gYyhyZXAoYygiQ3RsIiwiVHJ0IiksIDIpLCAiTkEiKSkKYGBgCgpSZWxhdGl2ZSB0byB0aGUgY29udHJvbHMgdGhlIGFpci1kcnkgKyBzdG9yYWdlIHRyZWF0bWVudCAoRXhwZXJpbWVudCAxLCBvcGVuIHNxdWFyZXMgaW4gKipGaWcuIDQqKikgbGVkIHRvIGVucmljaG1lbnQgaW4gZ3Jhc3NsYW5kIHNhbXBsZXMsIGJ1dCBkZXBsZXRpb24gaW4gZm9yZXN0IHNhbXBsZXMuIEluIGNvbnRyYXN0LCB0aGUgYWlyLWRyeSBvbmx5IHRyZWF0bWVudCAoRXhwZXJpbWVudCAyLCBvcGVuIGNpcmNsZXMsICoqRmlnLiA0KiopIGxlZCB0byBlbnJpY2htZW50IGZvciBib3RoIGZvcmVzdCBhbmQgZ3Jhc3NsYW5kIHNhbXBsZXMgKDIwMTkgcG9pbnRzKS4gVHJlYXRtZW50IGVmZmVjdHMgb24gXjE0XkMtQ09+Mn4gd2VyZSBzaWduaWZjYW50IGZvciBib3RoIGZvcmVzdHMgYW5kIGdyYXNzbGFuZCBzb2lscyBpbiBFeHBlcmltZW50IDEgKDIwMTEgcG9pbnRzLCAqKkZpZy4gNCoqKSwgYW5kIHNpZ25pZmljYW50IGZvciBncmFzc2xhbmQgc2FtcGxlcyBidXQgbm90IGZvcmVzdCBzYW1wbGVzIGluIEV4cGVyaW1lbnQgMiAoMjAxOSBwb2ludHMsICoqRmlnLiA0KiopLiBUaGUgYWJzb2x1dGUgbWVhbiBkaWZmZXJlbmNlIGluIF4xNF5DLUNPfjJ+IGJldHdlZW4gY29udHJvbCBhbmQgdHJlYXRtZW50IHNhbXBsZXMgd2FzIGdyZWF0ZXIgaW4gZ3Jhc3NsYW5kIHNhbXBsZXMgKGByIHtyb3VuZChtZWFuKGFicyh0cnQuY3RsLmRmW3RydC5jdGwuZGYkVHlwZSA9PSAiRyIsICJkMTRjX2NvcnJfbWVhbi5jdGwiXSAtIHRydC5jdGwuZGZbdHJ0LmN0bC5kZiRUeXBlID09ICJHIiwgImQxNGNfY29ycl9tZWFuLnRydCJdKSksIDEpfWDigLApIHRoYW4gaW4gZm9yZXN0IHNhbXBsZXMgKGByIHtyb3VuZChtZWFuKGFicyh0cnQuY3RsLmRmW3RydC5jdGwuZGYkVHlwZSA9PSAiRiIsICJkMTRjX2NvcnJfbWVhbi5jdGwiXSAtIHRydC5jdGwuZGZbdHJ0LmN0bC5kZiRUeXBlID09ICJGIiwgImQxNGNfY29ycl9tZWFuLnRydCJdKSksIDEpfWDigLApIGZvciBib3RoIGV4cGVyaW1lbnRzLiAKCk1lYW4gXjE0XkMtQ09+Mn4gc2hvd2VkIGVucmljaG1lbnQgcmVsYXRpdmUgdG8gdGhlIGF0bW9zcGhlcmUgZm9yIGFsbCBzYW1wbGVzIGluIGJvdGggZXhwZXJpbWVudHMuIENvbnRyb2wgc2FtcGxlIF4xNF5DLUNPfjJ+IHJlc3BpcmVkIGZyb20gZ3Jhc3NsYW5kIHNvaWxzIHdhcyBnZW5lcmFsbHkgY2xvc2VyIHRvIHRoZSBhdG1vc3BoZXJlIHRoYW4gdGhhdCBmcm9tIGZvcmVzdCBzb2lsIGNvbnRyb2xzLCBidXQgdGhlIGRpZmZlcmVuY2UgZnJvbSB0aGUgYXRtb3NwaGVyZSAoJFxEZWx0YSQkXERlbHRhJF4xNF5DKSBpbmNyZWFzZWQgc2xpZ2h0bHkgYmV0d2VlbiAyMDExIGFuZCAyMDE5IGluIGdyYXNzbGFuZCBzb2lscyB3aGlsZSBpdCBzdGF5ZWQgYWJvdXQgdGhlIHNhbWUgaW4gZm9yZXN0IHNvaWxzLiAKCmBgYHtyIHRyZWF0bWVudCBlZmZlY3RzIGJ5IHRpbWV9CiMgZmlyc3QgbG9hZCBhdG1vc3BoZXJpYyBkYXRhIGZyb20gSVNSYUQgYW5kIGJpbmQgZnV0dXJlIHByb2plY3Rpb24KRGF0bSA8LSByYmluZChncmF2ZW4sIGZ1dHVyZTE0QykKRGF0bSA8LSBEYXRtW0RhdG0kRGF0ZSA+IDE5MDAsIGMoIkRhdGUiLCAiTkhjMTQiKV0KCiMgIyBjb2RlIGZvciBwbG90dGluZyBkYXRhIGJ5IElECiMgYWxsLjE0Yy5zdW0gJT4lCiMgICBmaWx0ZXIoUGVyaW9kID09ICJpbmMiKSAlPiUKIyAgIGZpbHRlcighZ3JlcGwoIlMiLCBJRCkpICU+JQojICAgbXV0YXRlKHllYXIuSUQgPSBwYXN0ZShZZWFyU2FtcGxlZCwgSUQpKSAlPiUKIyAgIGdncGxvdCguLCBhZXMoWWVhclNhbXBsZWQsIGQxNGNfY29ycl9tZWFuLCBjb2xvciA9IFR5cGUpKSArCiMgICBnZW9tX3BvaW50KGFlcyhzaGFwZSA9IFRyZWF0bWVudCksIHNpemUgPSAzKSArCiMgICBnZW9tX3BhdGgoYWVzKGdyb3VwID0geWVhci5JRCksIAojICAgICAgICAgICAgIGFycm93ID0gYXJyb3codHlwZSA9ICJvcGVuIiwgbGVuZ3RoID0gdW5pdCguMSwgImluY2hlcyIpLCBlbmRzID0gImxhc3QiKSwKIyAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiMgICBnZW9tX3BhdGgoZGF0YSA9IERhdG0sIGFlcyhEYXRlLCBOSGMxNCksIGNvbG9yID0gImRhcmtncmF5IikgKwojICAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAnTGFuZCB1c2UnLAojICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9YygnRic9JyNhMzU1MTMnLCdHJz0nIzEzNjFhMycpLAojICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ0ZvcmVzdCcsJ0dyYXNzbGFuZCcpKSArCiMgICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICdUcmVhdG1lbnQnLAojICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFpci1kcnkiID0gMSwgCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeSArIHN0b3JhZ2UiID0gMCwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250cm9sIiA9IDE2KSkgKwojICAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMjAxMCwgMjAyMCksIGJyZWFrcyA9IGMoMjAxMywgMjAxNiwgMjAxOSkpICsKIyAgIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKC0xNSwgMTAwKSkgKwojICAgeGxhYignWWVhciBzYW1wbGVkJykgKwojICAgeWxhYihleHByZXNzaW9uKCdtZWFuICcqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwojICAgZmFjZXRfd3JhcCh+IElELCBuY29sID0gMykgKwojICAgdGhlbWVfYncoKSArCiMgICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKQoKIyBwbG90IG92ZXIgdGltZSwgYXZlcmFnZWQgYnkgVHlwZQphbGwuMTRjLnN1bTIgJT4lCiAgZmlsdGVyKFBlcmlvZCA9PSAiaW5jIikgJT4lCiAgbXV0YXRlKHllYXIuVHlwZSA9IHBhc3RlKFllYXJTYW1wbGVkLCBUeXBlKSwKICAgICAgICAgRWNvID0gaWZlbHNlKFR5cGUgPT0gIkYiLCAiRm9yZXN0IiwgIkdyYXNzbGFuZCIpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKFllYXJTYW1wbGVkLCBkMTRjX2NvcnJfbWVhbiwgY29sb3IgPSBUeXBlKSkgKwogIGdlb21fcG9pbnQoYWVzKHNoYXBlID0gVHJlYXRtZW50KSwgc2l6ZSA9IDMsIHN0cm9rZSA9IDEuNSkgKwogIGdlb21fcGF0aChhZXMoZ3JvdXAgPSB5ZWFyLlR5cGUpLCAKICAgICAgICAgICAgYXJyb3cgPSBhcnJvdyh0eXBlID0gIm9wZW4iLCBsZW5ndGggPSB1bml0KC4xLCAiaW5jaGVzIiksIGVuZHMgPSAiZmlyc3QiKSwKICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGQUxTRSwKICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDIsIHByZXNlcnZlID0gInNpbmdsZSIpLAogICAgICAgICAgICBzaXplID0gMS4yKSArCiAgZ2VvbV9wYXRoKGRhdGEgPSBEYXRtLCBhZXMoRGF0ZSwgTkhjMTQpLCBjb2xvciA9ICJkYXJrZ3JheSIpICsKICBnZW9tX2Vycm9yYmFyKAogICAgYWVzKHltaW4gPSBkMTRjX2NvcnJfbCwgCiAgICAgICAgeW1heCA9IGQxNGNfY29ycl91LCAKICAgICAgICBjb2xvciA9IFR5cGUpLCAKICAgIHdpZHRoID0gLjUsCiAgICBhbHBoYSA9IC4zKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAnTGFuZCB1c2UnLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPWMoJ0YnPScjYTM1NTEzJywnRyc9JyMxMzYxYTMnKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnRm9yZXN0JywnR3Jhc3NsYW5kJykpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICdUcmVhdG1lbnQnLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhaXItZHJ5IiA9IDEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5ICsgc3RvcmFnZSIgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250cm9sIiA9IDE2KSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiYWlyLWRyeSIgPSAiYWlyLWRyeSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5ICsgc3RvcmFnZSIgPSAiYWlyLWRyeSArIHN0b3JhZ2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250cm9sIiA9ICJjb250cm9sLTEgKDIwMTEpLCBjb250cm9sLTIgKDIwMTkpIikpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygyMDEwLCAyMDIwKSwgYnJlYWtzID0gYygyMDEzLCAyMDE2LCAyMDE5KSkgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKC0xNSwgMTAwKSkgKwogIHhsYWIoJ1llYXIgc2FtcGxlZCcpICsKICB5bGFiKGV4cHJlc3Npb24oJ21lYW4gJypEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhFY28pKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKIyBGaWcuIDEgc2hvd3MgdGhlIGRpcmVjdGlvbiBvZiBtZWFuIHRyZWF0bWVudCBlZmZlY3RzIG92ZXIgdGltZSBpbiByZWZlcmVuY2UgdG8gdGhlIGF0bW9zcGhlcmUgKGdyYXkgbGluZSkuIFBvaW50cyBhcmUgbWVhbnMgKG4gPSAxMiBmb3IgMjAxMSB0cmVhdG1lbnQgcG9pbnRzLCBuID0gOSBmb3IgMjAxMSBjb250cm9sIHBvaW50czsgbiA9IDYgZm9yIGFsbCAyMDE5IHBvaW50cyk7IGVycm9yIGJhcnMgPSAyeCBzdGQuIGVyci4gb2YgdGhlIG1lYW4uCmBgYAo+KipGaWcgYHIge2ZpZy5uICsgM31gLiBUcmVhdG1lbnQgZWZmZWN0IG9uIG9ic2VydmVkICRcRGVsdGEkXjE0XkMtQ09+Mn4gb3ZlciB0aW1lIChFeHBlcmltZW50cyAxIGFuZCAyKSoqCgo+KkNhcHRpb246KiBGaWxsZWQgY2lyY2xlcyBzaG93ICRcRGVsdGEkXjE0XkMtQ09+Mn4gb2JzZXJ2ZWQgZm9yIGNvbnRyb2wgc2FtcGxlcywgd2hpbGUgb3BlbiBzeW1ib2xzIHNob3cgJFxEZWx0YSReMTReQy1DT34yfiBvYnNlcnZlZCBmb3IgdHJlYW1lbnQgc2FtcGxlcyAob3BlbiBzcXVhcmVzID0gYWlyLWRyeSArIHN0b3JhZ2UgdHJlYXRtZW50LCBFeHBlcmltZW50IDE7IG9wZW4gY2lyY2xlcyA9IGFpci1kcnkgb25seSB0cmVhdG1lbnQsIEV4cGVyaW1lbnQgMikuIEFycm93cyBzaG93IHRoZSBkaXJlY3Rpb24gb2YgY2hhbmdlIGluICRcRGVsdGEkXjE0XkMtQ09+Mn4gcmVsYXRpdmUgdG8gdGhlIGNvbnRyb2xzLiBQb2ludHMgYXJlIG1lYW5zIGFuZCBlcnJvciBiYXJzIHNob3cgMnggc3RhbmRhcmQgZXJyb3IuIFRoZSBncmF5IGxpbmUgc2hvd3MgJFxEZWx0YSReMTReQyBvZiB0aGUgYXRtb3NwaGVyZS4KCmBgYHtyIHNpZGUtYnktc2lkZSBwbG90LCBpbmNsdWRlID0gRkFMU0V9CiMgcGxvdCBhcyBzaWRlLWJ5LXNpZGUgbWVhbnMgdy8gMnhTRQojIHdpbGwgY2hhbmdlIHRvIDk1JUNJcyBhdCBzb21lIHBvaW50LCBidXQgbmVlZCB0byBjYWxjdWxhdGUgdGVzdCBzdGF0aXN0aWMgd2l0aCBhcHByb3ByaWF0ZSBkZgphbGwuMTRjLnN1bTIgJT4lCiAgZmlsdGVyKFBlcmlvZCA9PSAiaW5jIikgJT4lCiAgZ2dwbG90KC4sIGFlcyh0cmVhdC5iaSwgZDE0Y19jb3JyX21lYW4sIGNvbG9yID0gVHlwZSkpICsKICBnZW9tX3BvaW50KGFlcyhzaGFwZSA9IFRyZWF0bWVudCksIHNpemUgPSAzKSArCiAgZ2VvbV9lcnJvcmJhcigKICAgIGFlcyh5bWluID0gZDE0Y19jb3JyX3UsIAogICAgICAgIHltYXggPSBkMTRjX2NvcnJfbCwgCiAgICAgICAgY29sb3IgPSBUeXBlKSwgCiAgICB3aWR0aCA9IC4xKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAnTGFuZCB1c2UnLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPWMoJ0YnPScjYTM1NTEzJywnRyc9JyMxMzYxYTMnKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnRm9yZXN0JywnR3Jhc3NsYW5kJykpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICdUcmVhdG1lbnQnLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhaXItZHJ5IiA9IDEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5ICsgc3RvcmFnZSIgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250cm9sIiA9IDE2KSkgKwogIHlsYWIoZXhwcmVzc2lvbignbWVhbiAnKkRlbHRhKicnXjE0KidDICjigLApJykpICsKICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKFR5cGUpLCByb3dzID0gdmFycyhZZWFyU2FtcGxlZCkpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSkKCmBgYAoKYGBge3IgY3RsLXRydC1kaWZzLTEzY30KIyBhdmVyYWdlIGNvbnRyb2wgYW5kIHRyZWF0bWVudCBkYXRhCiMgbm90ZSB0aGF0IHVwcGVyL2xvd2VyIGxpbWl0cyA9IDJ4U0UKCiMgUGxvdCBzaWRlLWJ5LXNpZGUgdy8gMnhTRQppc28uMTIuYXZnMiAlPiUKICBmaWx0ZXIoUGVyaW9kID09ICJpbmMiKSAlPiUKICBtdXRhdGUoWWVhclNhbXBsZWQgPSBpZmVsc2UoRXhwZXJpbWVudCA9PSAiYXJjIiwgIjIwMTEiLCAiMjAxOSIpKSAlPiUKICBtdXRhdGUoRWNvID0gaWZlbHNlKFR5cGUgPT0gIkYiLCAiRm9yZXN0IiwgIkdyYXNzbGFuZCIpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKFllYXJTYW1wbGVkLCBkMTNjX21lYW4sIGNvbG9yID0gVHlwZSkpICsKICBnZW9tX3BvaW50KGFlcyhzaGFwZSA9IFRyZWF0bWVudCksIHNpemUgPSAzKSArCiAgZ2VvbV9lcnJvcmJhcigKICAgIGFlcyh5bWluID0gZDEzY191LCAKICAgICAgICB5bWF4ID0gZDEzY19sLCAKICAgICAgICBjb2xvciA9IFR5cGUpLCAKICAgIHdpZHRoID0gLjEpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICdFY29zeXN0ZW0nLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPWMoJ0YnPScjYTM1NTEzJywnRyc9JyMxMzYxYTMnKSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gJ1RyZWF0bWVudCcsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFpci1kcnkiID0gMSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpci1kcnkgKyBzdG9yYWdlIiA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRyb2wiID0gMTYpKSArCiAgeWxhYihleHByZXNzaW9uKCdtZWFuICcqZGVsdGEqJydeMTMqJ0MgKOKAsCknKSkgKwogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoRWNvKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpKQoKIyBpc28uMTIuYXZnMiAlPiUKIyAgIG11dGF0ZShZZWFyU2FtcGxlZCA9IGlmZWxzZShFeHBlcmltZW50ID09ICJhcmMiLCAiMjAxMSIsICIyMDE5IiksCiMgICAgICAgICAgdHJlYXQucGVyaW9kID0gcGFzdGUoVHJlYXRtZW50LCBQZXJpb2QsIHNlcCA9ICIuIiksCiMgICAgICAgICAgRWNvID0gaWZlbHNlKFR5cGUgPT0gIkYiLCAiRm9yZXN0IiwgIkdyYXNzbGFuZCIpKSAlPiUKIyAgIGdncGxvdCguLCBhZXMoWWVhclNhbXBsZWQsIGQxM2NfbWVhbiwgY29sb3IgPSBUeXBlKSkgKwojICAgZ2VvbV9wb2ludChhZXMoc2hhcGUgPSB0cmVhdC5wZXJpb2QpLCBzaXplID0gMykgKwojICAgZ2VvbV9lcnJvcmJhcigKIyAgICAgYWVzKHltaW4gPSBkMTNjX3UsCiMgICAgICAgICB5bWF4ID0gZDEzY19sLAojICAgICAgICAgY29sb3IgPSBUeXBlKSwKIyAgICAgd2lkdGggPSAuMSkgKwojICAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAnRWNvc3lzdGVtJywKIyAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCdGJz0nI2EzNTUxMycsJ0cnPScjMTM2MWEzJykpICsKIyAgIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gJ1RyZWF0bWVudCcsCiMgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYWlyLWRyeS5wcmUiID0gMiwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5LmluYyIgPSAxLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpci1kcnkgKyBzdG9yYWdlLmluYyIgPSAwLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpci1kcnkgKyBzdG9yYWdlLnByZSIgPSA2LAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRyb2wuaW5jIiA9IDE2LAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRyb2wucHJlIiA9IDE3KSkgKwojICAgeWxhYihleHByZXNzaW9uKCdtZWFuICcqZGVsdGEqJydeMTMqJ0MgKOKAsCknKSkgKwojICAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhFY28pKSArCiMgICB0aGVtZV9idygpICsKIyAgIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiMgICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCkpCmBgYAo+KipGaWcgYHIge2ZpZy5uICsgNH1gLiBUcmVhdG1lbnQgZWZmZWN0IG9uIG9ic2VydmVkICRcZGVsdGEkXjEzXkMtQ09+Mn4gZm9yIEV4cGVyaW1lbnRzIDEgYW5kIDIqKgoKPipDYXB0aW9uOiogRmlsbGVkIGNpcmNsZXMgc2hvdyAkXGRlbHRhJF4xM15DLUNPfjJ+IG9ic2VydmVkIGZvciBjb250cm9sIHNhbXBsZXMsIHdoaWxlIG9wZW4gc3ltYm9scyBzaG93ICRcZGVsdGEkXjEzXkMtQ09+Mn4gb2JzZXJ2ZWQgZm9yIHRyZWFtZW50IHNhbXBsZXMgKG9wZW4gc3F1YXJlcyA9IGFpci1kcnkgKyBzdG9yYWdlIHRyZWF0bWVudCwgRXhwZXJpbWVudCAxLCAyMDExOyBvcGVuIGNpcmNsZXMgPSBhaXItZHJ5IG9ubHkgdHJlYXRtZW50LCBFeHBlcmltZW50IDIsIDIwMTkpLiBQb2ludHMgYXJlIG1lYW5zIGFuZCBlcnJvciBiYXJzIHNob3cgMnggc3RhbmRhcmQgZXJyb3IuIAoKKkVmZmVjdCBvZiBjdW11bGF0aXZlIHJlc3BpcmVkIGNhcmJvbiBvbiBeMTReQy1DT34yfioKCmBgYHtyIGN0bC10cnQtc3RhdHMsIGluY2x1ZGUgPSBGQUxTRX0KIyBjYWxjdWxhdGUgZGlmcyBjdGwtdHJ0LCBsb29rIGF0IGVmZmVjdCBvZiBDIHJlc3AKYXJjLnJld2V0LmluYy4xNGMkdHJlYXQuYmkgPC0gaWZlbHNlKGFyYy5yZXdldC5pbmMuMTRjJFRyZWF0bWVudCA9PSAiY29udHJvbCIsICJjb250cm9sIiwgInRyZWF0bWVudCIpCmFyYy5yZXdldC5pbmMuMTRjLnN1bSA8LSBhcmMucmV3ZXQuaW5jLjE0YyAlPiUKICBncm91cF9ieShJRCwgRXhwZXJpbWVudCwgVHlwZSwgdHJlYXQuYmkpICU+JQogIGFkZF9jb3VudCgpICU+JQogIHN1bW1hcmlzZV9pZigucHJlZGljYXRlID0gZnVuY3Rpb24oeCkgaXMubnVtZXJpYyh4KSwKICAgICAgICAgICAgICAgLmZ1bnMgPSBsaXN0KG1lYW4gPSAibWVhbiIsIHNkID0gInNkIikpCiAgCmFyYy5yZXdldC5pbmMuMTRjLnN1bSRuX3NkIDwtIE5VTEwKCmoudmFycyA8LSBjKCJJRCIsICJFeHBlcmltZW50IiwgIlR5cGUiLCAiZDE0Y19jb3JyX21lYW4iLCAibWdDTzIuQ19nQ19tZWFuIiwgImQxNGNfY29ycl9zZCIsICJtZ0NPMi5DX2dDX3NkIikKYXJjLnJld2V0LjE0Yy5jdGwudHJ0IDwtIGxlZnRfam9pbigKICBhcmMucmV3ZXQuaW5jLjE0Yy5zdW1bYXJjLnJld2V0LmluYy4xNGMuc3VtJHRyZWF0LmJpID09ICJjb250cm9sIiwgai52YXJzXSwKICBhcmMucmV3ZXQuaW5jLjE0Yy5zdW1bYXJjLnJld2V0LmluYy4xNGMuc3VtJHRyZWF0LmJpICE9ICJjb250cm9sIiwgai52YXJzXSwKICBieSA9IGMoai52YXJzWzE6M10pLAogIHN1ZmZpeCA9IGMoIi5jdGwiLCAiLnRydCIpKQoKCmFyYy5yZXdldC4xNGMuY3RsLnRydCRkMTRjX2RpZiA8LSBhcmMucmV3ZXQuMTRjLmN0bC50cnQkZDE0Y19jb3JyX21lYW4uY3RsIC0gYXJjLnJld2V0LjE0Yy5jdGwudHJ0JGQxNGNfY29ycl9tZWFuLnRydAphcmMucmV3ZXQuMTRjLmN0bC50cnQkY19kaWYgPC0gYXJjLnJld2V0LjE0Yy5jdGwudHJ0JG1nQ08yLkNfZ0NfbWVhbi5jdGwgLSBhcmMucmV3ZXQuMTRjLmN0bC50cnQkbWdDTzIuQ19nQ19tZWFuLnRydAoKIyMgTG9vayBhdCBlZmZlY3Qgb2YgY19kaWYgYnkgZXhwZXJpbWVudCBhbmQgaW50ZXJhY3Rpb24gd2l0aCB0eXBlCiMgYWlyLWRyeSArIHN0b3JhZ2UKc3VtbWFyeShsbShkMTRjX2RpZiB+IGNfZGlmICogVHlwZSwgYXJjLnJld2V0LjE0Yy5jdGwudHJ0W2FyYy5yZXdldC4xNGMuY3RsLnRydCRFeHBlcmltZW50ID09ICJhcmMiLCBdKSkKIyBlZmZlY3Qgb2YgY19kaWYgb24gZDE0Y19kaWYgbnM7IGludGVyYWN0aW9uIGFsc28gbnMKCiMgcmV3ZXQKc3VtbWFyeShsbShkMTRjX2RpZiB+IGNfZGlmICogVHlwZSwgYXJjLnJld2V0LjE0Yy5jdGwudHJ0W2FyYy5yZXdldC4xNGMuY3RsLnRydCRFeHBlcmltZW50ID09ICJyZXdldCIsIF0pKQojIGVmZmVjdCBvZiBjX2RpZiBtYXJnaW5hbGx5IHNpZ25pZmljYW50IChwID0gMC4wNjMyKQoKIyBMb29rIGF0IGVmZmVjdCBvZiBjX2RpZiBhbmQgaW50ZXJhY3Rpb24gd2l0aCB0eXBlIG92ZXJhbGwKc3VtbWFyeShsbShkMTRjX2RpZiB+IFR5cGUgKiBjX2RpZiAqIEV4cGVyaW1lbnQsIGFyYy5yZXdldC4xNGMuY3RsLnRydCkpCiMgbm8gc2lnbmlmaWNhbmNlIG9mIGNfZGlmIG92ZXJhbGwKcm0oai52YXJzKQpgYGAKCmBgYHtyIHBsb3QtY2RpZi1kMTRjLCBpbmNsdWRlID0gRkFMU0V9CmdncGxvdChhcmMucmV3ZXQuMTRjLmN0bC50cnQsIGFlcyhjX2RpZiwgZDE0Y19kaWYsIGNvbG9yID0gVHlwZSwgc2hhcGUgPSBFeHBlcmltZW50KSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gJ0xhbmQgdXNlJywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID1jKCdGJz0nI2EzNTUxMycsJ0cnPScjMTM2MWEzJyksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ0ZvcmVzdCcsJ0dyYXNzbGFuZCcpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCgpbbWF5YmUgZXhwYW5kIHdpdGggc3RhdHMgZm9yIG90aGVyIGV4cGxhbmF0b3J5IGZhY3RvcnM/IGUuZy4gdGV4dHVyZSwgTiBjb250ZW50LCBjaGFuZ2UgaW4gbW9pc3R1cmUgdXBvbiByZXdldHRpbmcsIGV0Yy4uLl0KCldlIGxvb2tlZCBhdCB0aGUgcG9zc2libGUgZWZmZWN0IG9mIHRoZSBkaWZmZXJlbmNlIGluIHRoZSBhbW91bnQgb2YgY2FyYm9uIHJlc3BpcmVkIChtZyBDT34yfi1DIGcgc29pbCBDXi0xXikgb24gdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gY29udHJvbCBhbmQgdHJlYXRtZW50IF4xNF5DLUNPfjJ+IHVzaW5nIGEgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWwsIGJ1dCBpdCB3YXMgbm90IHNpZ25pZmljYW50IG92ZXJhbGwuIFdoZW4gZGF0YSBmcm9tIEV4cGVyaW1lbnQgMSBhbmQgRXhwZXJpbWVudCAyIHdlcmUgY29uc2lkZXJlZCBzZXBhcmF0ZWx5LCB3ZSBvYnNlcnZlZCBhIHNsaWdodCBwb3NpdGl2ZSB0cmVuZCBiZXR3ZWVuIHRoZSBkaWZmZXJlbmNlIGluIHJlc3BpcmVkIGNhcmJvbiBhbmQgdGhlIGRpZmZlcmVuY2UgaW4gXjE0XkMtQ09+Mn4gd2l0aGluIEV4cGVyaW1lbnQgMiwgYnV0IGl0IHdhcyBvbmx5IG1hcmdpbmFsbHkgc2lnbmlmaWNhbnQgKHAgPSBgciB7cm91bmQoc3VtbWFyeShsbShkMTRjX2RpZiB+IGNfZGlmICogVHlwZSwgYXJjLnJld2V0LjE0Yy5jdGwudHJ0W2FyYy5yZXdldC4xNGMuY3RsLnRydCRFeHBlcmltZW50ID09ICJyZXdldCIsIF0pKSRjb2VmWzIsNF0sMyl9YCkuIAoKYGBge3IgcGxvdC0xNGMtYnktYy1yZXNwfQojIDEwLiBQbG90ICRcRGVsdGEkXjE0XkMgYWdhaW5zdCBwcm9wb3J0aW9uIG9mIHNvaWwgQyByZXNwaXJlZCBieSBleHBlcmltZW50LCBsYW5kIGNvdmVyLCBhbmQgc2FtcGxpbmcgcGVyaW9kLgojIGNvbGxhcHNlIHRyZWF0bWVudCB2YXJpYWJsZSBpbnRvIGJpbmFyeSBjb250cm9sL3RyZWF0bWVudAphbGwuMTRjLnN1bS5kZiR0cmVhdC5iaSA8LSBpZmVsc2UoYWxsLjE0Yy5zdW0uZGYkVHJlYXRtZW50ID09ICJjb250cm9sIiwgImNvbnRyb2wiLCAidHJlYXRtZW50IikKCiMgSEVXMjIgY29udHJvbCBwcmUgcG9pbnQgZXhjbHVkZWQgdG8gbWFrZSBmaWd1cmUgbW9yZSByZWFkYWJsZSAKYWxsLjE0Yy5zdW0uZGYgJT4lCiAgZmlsdGVyKEV4cGVyaW1lbnQgIT0gInRtZSIpICU+JQogIG11dGF0ZShJRC50cmVhdCA9IHBhc3RlKElELCBUcmVhdG1lbnQpKSAlPiUKICBtdXRhdGUoSUQudHJlYXQuUGVyaW9kID0gcGFzdGUoSUQudHJlYXQsIFBlcmlvZCkpICU+JQogIGZpbHRlcihJRC50cmVhdC5QZXJpb2QgIT0gIkhFVzIyIGNvbnRyb2wgcHJlIikgJT4lCiAgbXV0YXRlKHRyZWF0LlBlcmlvZCA9IHBhc3RlKHRyZWF0LmJpLCBQZXJpb2QpLAogICAgICAgICBFY28gPSBpZmVsc2UoVHlwZSA9PSAiRiIsICJGb3Jlc3QiLCAiR3Jhc3NsYW5kIikpICU+JQogIGdncGxvdCguLCBhZXMobWdDTzIuQ19nQ19tZWFuLCBkMTRjX2NvcnJfbWVhbiwgY29sb3IgPSBUeXBlLCBzaGFwZSA9IHRyZWF0LlBlcmlvZCkpICsKICBnZW9tX3BvaW50KHNpemUgPSAzKSArCiAgZ2VvbV9wYXRoKGFlcyhncm91cCA9IElELnRyZWF0KSkgKwogIGdlb21fZXJyb3JiYXIoCiAgICBhZXMoeW1pbiA9IGQxNGNfY29ycl9taW4sIAogICAgICAgIHltYXggPSBkMTRjX2NvcnJfbWF4LCAKICAgICAgICBjb2xvciA9IFR5cGUpLCAKICAgIHdpZHRoID0gLjI1KSArCiAgZ2VvbV9lcnJvcmJhcmgoCiAgICBhZXMoeG1pbiA9IG1nQ08yLkNfZ0NfbWluLCAKICAgICAgICB4bWF4ID0gbWdDTzIuQ19nQ19tYXgsIAogICAgICAgIGNvbG9yID0gVHlwZSksIAogICAgaGVpZ2h0ID0gLjkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICdFY29zeXN0ZW0nLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPWMoJ0YnPScjYTM1NTEzJywnRyc9JyMxMzYxYTMnKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnRm9yZXN0JywnR3Jhc3NsYW5kJykpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICdTYW1wbGluZyBwZXJpb2QgKHRyZWF0bWVudCknLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPWMoMTYsIDE3LCAxLCAyKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiY29udHJvbCBwcmUiID0gJ3ByZS1pbmN1YmF0aW9uXG4oY29udHJvbCknLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udHJvbCBpbmMiID0gJ2VxdWlsaWJyaXVtIHJlc3BpcmF0aW9uXG4oY29udHJvbCknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmVhdG1lbnQgcHJlIiA9ICdwcmUtaW5jdWJhdGlvblxuKGFpci1kcnkvYWlyLWRyeSArIHN0b3JhZ2UpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJlYXRtZW50IGluYyIgPSAnZXF1aWxpYnJpdW0gcmVzcGlyYXRpb25cbihhaXItZHJ5L2Fpci1kcnkgKyBzdG9yYWdlKScpKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhFY28pLCByb3dzID0gdmFycyhZZWFyU2FtcGxlZCkpICsKICB4bGFiKGV4cHJlc3Npb24oJ1Jlc3BpcmVkIEMgKG1nIENPJ1syXSonLUMnKicgZyBzb2lsIEMnXi0xKicpJykpICsKICB5bGFiKGV4cHJlc3Npb24oJ21lYW4gJypEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQua2V5LmhlaWdodD11bml0KC44LCAiY20iKSkKYGBgCgo+KipTdXBwbGVtZW50YXJ5IEZpZy4gYHIge3NmaWcubiArIDF9YC4gQ2hhbmdlIGluIF4xNF5DLUNPfjJ+IGluIHJlbGF0aW9uIHRvIGN1bXVsYXRpdmUgc29pbCBjYXJib24gcmVzcGlyZWQqKgoKPipDYXB0aW9uOiogTm90ZSB0aGF0IHByZS1pbmN1YmF0aW9uICRcRGVsdGEkXjE0XkMgd2FzIG5vdCBtZWFzdXJlZCBmb3IgdGhlIDIwMTEgY29udHJvbCBzYW1wbGVzLiBMaW1pdHMgZXhjbHVkZSBvdXRsaWVyIHBvaW50IChIRVcyMiBjb250cm9sIHByZS1pbmN1YmF0aW9uKSBmb3IgaW1wcm92ZWQgbGVnaWJpbGl0eS4gW05vdCBwbGFubmluZyB0byBpbmNsdWRlIHRoaXMgZmlndXJlIGluIHRoZSBtYWluIHRleHQgYXMgSSB0aGluayBpdCBpcyBkaWZmaWN1bHQgdG8gaW50ZXJwcmV0XS4KCmBgYHtyIHBsb3QgQyByZXNwIHZzIDE0QyBhdmVyYWdlZCBieSBsYW5kIHVzZSBhbmQgdHJlYXRtZW50LCBpbmNsdWRlID0gRkFMU0V9CiMgQWx0ZXJuYXRlIEMtcmVzcCB4IDE0YyBmaWc6IGRhdGEgYXZlcmFnZWQgYnkgbGFuZCB1c2UgYW5kIHRyZWF0bWVudCB3aXRoaW4gc2FtcGxpbmcgcGVyaW9kcwphbGwuMTRjLnN1bTIgJT4lCiAgbXV0YXRlKHRyZWF0LlBlcmlvZCA9IHBhc3RlKHRyZWF0LmJpLCBQZXJpb2QpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKG1nQ08yLkNfZ0NfbWVhbiwgZDE0Y19jb3JyX21lYW4sIGNvbG9yID0gVHlwZSwgc2hhcGUgPSB0cmVhdC5QZXJpb2QpKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIGdlb21fcGF0aChhZXMoZ3JvdXAgPSBUcmVhdG1lbnQpKSArCiAgZ2VvbV9lcnJvcmJhcigKICAgIGFlcyh5bWluID0gZDE0Y19jb3JyX3UsIAogICAgICAgIHltYXggPSBkMTRjX2NvcnJfbCwgCiAgICAgICAgY29sb3IgPSBUeXBlKSwgCiAgICB3aWR0aCA9IC4yNSkgKwogIGdlb21fZXJyb3JiYXJoKAogICAgYWVzKHhtaW4gPSBtZ0NPMi5DX2dDX3UsIAogICAgICAgIHhtYXggPSBtZ0NPMi5DX2dDX2wsIAogICAgICAgIGNvbG9yID0gVHlwZSksIAogICAgaGVpZ2h0ID0gLjkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICdFY29zeXN0ZW0nLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPWMoJ0YnPScjYTM1NTEzJywnRyc9JyMxMzYxYTMnKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnRm9yZXN0JywnR3Jhc3NsYW5kJykpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICdTYW1wbGluZyBwZXJpb2QgKHRyZWF0bWVudCknLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPWMoMTYsIDE3LCAxLCAyKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiY29udHJvbCBwcmUiID0gJ3ByZS1pbmN1YmF0aW9uXG4oY29udHJvbCknLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udHJvbCBpbmMiID0gJ2VxdWlsaWJyaXVtIHJlc3BpcmF0aW9uXG4oY29udHJvbCknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmVhdG1lbnQgcHJlIiA9ICdwcmUtaW5jdWJhdGlvblxuKGFpci1kcnkvYWlyLWRyeSArIHN0b3JhZ2UpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJlYXRtZW50IGluYyIgPSAnZXF1aWxpYnJpdW0gcmVzcGlyYXRpb25cbihhaXItZHJ5L2Fpci1kcnkgKyBzdG9yYWdlKScpKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhUeXBlKSwgcm93cyA9IHZhcnMoWWVhclNhbXBsZWQpKSArCiAgeGxhYihleHByZXNzaW9uKCdSZXNwaXJlZCBDIChtZ0NPJ1syXSonLUMnKicgZyBzb2lsIEMnXi0xKicpJykpICsKICB5bGFiKGV4cHJlc3Npb24oJ21lYW4gJypEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQua2V5LmhlaWdodD11bml0KC44LCAiY20iKSkKYGBgCgpgYGB7ciBwbG90IDE0YyBieSBjIHJlc3Agd2l0aCBvdXRsaWVyLCBpbmNsdWRlID0gRkFMU0V9CiMgQ29kZSBmb3IgYSB0aGlyZCBwbG90IHdpdGggb3V0bGllciBkYXRhCiMgYXZlcmFnZSBjb250cm9sIGFuZCB0cmVhdG1lbnQgZGF0YQphbGwuMTRjLnN1bTMgPC0gc2VsZWN0KGFsbC4xNGMubHNbWzJdXSwgVHlwZSwgUGVyaW9kLCBUcmVhdG1lbnQsIEV4cGVyaW1lbnQsIFllYXJTYW1wbGVkLCBkMTRjX2NvcnIsIG1nQ08yLkNfZ0MpICU+JQogIGdyb3VwX2J5KFR5cGUsIFBlcmlvZCwgVHJlYXRtZW50LCBFeHBlcmltZW50LCBZZWFyU2FtcGxlZCkgJT4lCiAgYWRkX2NvdW50KCkgJT4lCiAgc3VtbWFyaXplX2FsbChsaXN0KG1lYW4gPSBtZWFuLCBzZCA9IHNkKSwgbmEucm0gPSBUUlVFKSAlPiUKICBtdXRhdGUoZDE0Y19jb3JyX3NlID0gZDE0Y19jb3JyX3NkL25fbWVhbiwKICAgICAgICAgZDE0Y19jb3JyX3UgPSBkMTRjX2NvcnJfbWVhbiArIGQxNGNfY29ycl9zZSoyLAogICAgICAgICBkMTRjX2NvcnJfbCA9IGQxNGNfY29ycl9tZWFuIC0gZDE0Y19jb3JyX3NlKjIsCiAgICAgICAgIG1nQ08yLkNfZ0Nfc2UgPSBtZ0NPMi5DX2dDX3NkL25fbWVhbiwKICAgICAgICAgbWdDTzIuQ19nQ191ID0gbWdDTzIuQ19nQ19tZWFuICsgbWdDTzIuQ19nQ19zZSoyLAogICAgICAgICBtZ0NPMi5DX2dDX2wgPSBtZ0NPMi5DX2dDX21lYW4gLSBtZ0NPMi5DX2dDX3NlKjIpIAoKYWxsLjE0Yy5zdW0zJHRyZWF0LmJpIDwtIGlmZWxzZShhbGwuMTRjLnN1bTMkVHJlYXRtZW50ID09ICJjb250cm9sIiwgImNvbnRyb2wiLCJ0cmVhdG1lbnQiKQphbGwuMTRjLnN1bTMgJT4lCiAgbXV0YXRlKHRyZWF0LlBlcmlvZCA9IHBhc3RlKHRyZWF0LmJpLCBQZXJpb2QpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKG1nQ08yLkNfZ0NfbWVhbiwgZDE0Y19jb3JyX21lYW4sIGNvbG9yID0gVHlwZSwgc2hhcGUgPSB0cmVhdC5QZXJpb2QpKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIGdlb21fcGF0aChhZXMoZ3JvdXAgPSBUcmVhdG1lbnQpKSArCiAgZ2VvbV9lcnJvcmJhcigKICAgIGFlcyh5bWluID0gZDE0Y19jb3JyX3UsIAogICAgICAgIHltYXggPSBkMTRjX2NvcnJfbCwgCiAgICAgICAgY29sb3IgPSBUeXBlKSwgCiAgICB3aWR0aCA9IC4yNSkgKwogIGdlb21fZXJyb3JiYXJoKAogICAgYWVzKHhtaW4gPSBtZ0NPMi5DX2dDX3UsIAogICAgICAgIHhtYXggPSBtZ0NPMi5DX2dDX2wsIAogICAgICAgIGNvbG9yID0gVHlwZSksIAogICAgaGVpZ2h0ID0gLjkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICdFY29zeXN0ZW0nLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPWMoJ0YnPScjYTM1NTEzJywnRyc9JyMxMzYxYTMnKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnRm9yZXN0JywnR3Jhc3NsYW5kJykpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICdTYW1wbGluZyBwZXJpb2QgKHRyZWF0bWVudCknLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPWMoMTYsIDE3LCAxLCAyKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiY29udHJvbCBwcmUiID0gJ3ByZS1pbmN1YmF0aW9uXG4oY29udHJvbCknLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udHJvbCBpbmMiID0gJ2VxdWlsaWJyaXVtIHJlc3BpcmF0aW9uXG4oY29udHJvbCknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmVhdG1lbnQgcHJlIiA9ICdwcmUtaW5jdWJhdGlvblxuKGFpci1kcnkvYWlyLWRyeSArIHN0b3JhZ2UpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJlYXRtZW50IGluYyIgPSAnZXF1aWxpYnJpdW0gcmVzcGlyYXRpb25cbihhaXItZHJ5L2Fpci1kcnkgKyBzdG9yYWdlKScpKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhUeXBlKSwgcm93cyA9IHZhcnMoWWVhclNhbXBsZWQpKSArCiAgeGxhYihleHByZXNzaW9uKCdSZXNwaXJlZCBDIChtZ0NPJ1syXSonLUMnKicgZyBzb2lsIEMnXi0xKicpJykpICsKICB5bGFiKGV4cHJlc3Npb24oJ21lYW4gJypEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQua2V5LmhlaWdodD11bml0KC44LCAiY20iKSkKYGBgCgojIyBUcmVhdG1lbnQgZWZmZWN0IG9uIF4xNF5DLUNPfjJ+IGZvciBhbGwgc2FtcGxlcyAoRXhwZXJpbWVudHMgMSwgMiwgYW5kIDMpCgpEaWZmZXJlbmNlIGJldHdlZW4gY29udHJvbCBhbmQgdHJlYXRtZW50IHNhbXBsZXMgZnJvbSBhbGwgZXhwZXJpbWVudHMgc2hvdyB0aGF0IHRyZWF0bWVudCBlZmZlY3RzLCBpLmUuIGFpci1kcnlpbmcgZm9sbG93ZWQgYnkgcmV3ZXR0aW5nIG9yIGFpci1kcnlpbmcgZm9sbG93ZWQgYnkgc3RvcmFnZSBhbmQgc3Vic2VxdWVudCByZXdldHRpbmcsIHR5cGljYWxseSByZXN1bHQgaW4gY2hhbmdlcyBpbiBeMTReQy1DT34yfiBiZXR3ZWVuIMKxMjDigLAgdG8gwrE0MOKAsCwgd2l0aCB0aGUgbWFqb3JpdHkgd2l0aGluIMKxMjDigLAuIFRoZXNlIGRpZmZlcmVuY2UgYXJlIGVxdWl2YWxlbnQgdG8gdGhlIGRlY2xpbmUgaW4gYXRtb3NwaGVyaWMgcmFkaW9jYXJib24gb3ZlciA1IGFuZCAxMCB5ZWFycywgcmVzcGVjdGl2ZWx5LCBkdXJpbmcgdGhlIHBlcmlvZCBvZiAyMDAwIHRvIDIwMjAuIFRoZSBzYW1wbGVzIGZyb20gVGVubmVzc2VlIChtYWdlbnRhIHBvaW50cykgYXJlIGFuIGV4Y2VwdGlvbi4gSG93ZXZlciwgdGhlc2UgcG9pbnRzIGRvIG5vdCBzaG93IG9ubHkgYm9tYi1DIGVucmljaG1lbnQsIGJ1dCByYXRoZXIgdGhlIHJlc3VsdHMgb2YgZXhwb3N1cmUgdG8gYSBsb2NhbGl6ZWQgcGx1bWUgb2YgXjE0XkMgZW5yaWNoZWQgQ09+Mn4gZnJvbSBhIG5lYXJieSBpbmNpbmVyYXRvciBmb3VyIHllYXJzIHByaW9yIHRvIHNhbXBsZSBjb2xsZWN0aW9uIChUcnVtYm9yZSBldCBhbC4sIDIwMDIpLiBUcmVhdG1lbnQgXjE0XkMtQ09+Mn4gZm9yIHRoZXNlIGhpZ2hseSBlbnJpY2hlZCBzYW1wbGVzIHdlcmUgbW9yZSBkZXBsZXRlZCByZWxhdGl2ZSB0byB0aGUgY29udHJvbHMgdGhhbiB3ZXJlIHRoZSBzYW1wbGVzIG9ubHkgbGFiZWxlZCB3aXRoIGJvbWItQy4KCkdyYXNzbGFuZCBzYW1wbGVzIHRlbmQgdG8gYmUgYWJvdmUgMToxIGxpbmUsIHdoaWxlIGZvcmVzdCBzYW1wbGVzIGFyZSBnZW5lcmFsbHkgYmVsb3csIHJlZ2FyZGxlc3Mgb2Ygb3JpZ2luLiBPbmUgZXhjZXB0aW9uIHRvIHRoaXMgdHJlbmQgaXMgdGhlIHRocmVlIEdlcm1hbiBmb3Jlc3Qgc2FtcGxlcyB0aGF0IGFyZSBhYm92ZSAxOjEgbGluZSwgd2hpY2ggd2VyZSBhbmFseXplZCBpbiAyMDE5IChhaXItZHJ5IG9ubHkgdHJlYXRtZW50KS4KYGBge3IgcGxvdCBjdGwgdnMgdHJ0fQojIEZpbHRlciBkYXRhIHRvICJpbmMiLCBzcGxpdCBieSBiaW5hcnkgdHJlYXRtZW50IHZhcmlhYmxlLCB0aGVuIG1lcmdlCmFsbC4xNGMuY3RsIDwtIGFsbC4xNGMuc3VtLmRmW2FsbC4xNGMuc3VtLmRmJHRyZWF0LmJpID09ICJjb250cm9sIiAmIGFsbC4xNGMuc3VtLmRmJFBlcmlvZCA9PSAiaW5jIiwgXQphbGwuMTRjLmN0bCA8LSByZW5hbWVfYXQoYWxsLjE0Yy5jdGwsIHZhcnMoY29udGFpbnMoJ2QxNGMnKSksIGxpc3QofnBhc3RlMCguLCAiX2N0bCIpKSkKYWxsLjE0Yy50cnQgPC0gYWxsLjE0Yy5zdW0uZGZbYWxsLjE0Yy5zdW0uZGYkdHJlYXQuYmkgPT0gInRyZWF0bWVudCIgJiBhbGwuMTRjLnN1bS5kZiRQZXJpb2QgPT0gImluYyIsIF0KYWxsLjE0Yy50cnQgPC0gcmVuYW1lX2F0KGFsbC4xNGMudHJ0LCB2YXJzKGNvbnRhaW5zKCdkMTRjJykpLCBsaXN0KH5wYXN0ZTAoLiwgIl90cnQiKSkpCmFsbC4xNGMuY3RsLnRydCA8LSBpbm5lcl9qb2luKGRhdGEuZnJhbWUoYWxsLjE0Yy5jdGwpICU+JSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QoSUQsIEV4cGVyaW1lbnQsIFR5cGUsIFNpdGUsIEhvcml6b24sIGNvbnRhaW5zKCJkMTRjX2NvcnIiKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZnJhbWUoYWxsLjE0Yy50cnQpICU+JSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QoSUQsIEV4cGVyaW1lbnQsIFR5cGUsIFNpdGUsIEhvcml6b24sIGNvbnRhaW5zKCJkMTRjX2NvcnIiKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gYygiSUQiLCAiRXhwZXJpbWVudCIsICJUeXBlIiwgIlNpdGUiLCAiSG9yaXpvbiIpKQoKIyBGaXJzdCBhZGQgWWVhclNhbXBsZWQgYW5kIFllYXJNZWFzdXJlZCBjb2x1bW5zCmFsbC4xNGMuY3RsLnRydCRZZWFyU2FtcGxlZCA8LSB1bmxpc3QoYWxsLjE0Yy5zdW0uZGZbbWF0Y2goYWxsLjE0Yy5jdGwudHJ0JElELCBhbGwuMTRjLnN1bS5kZiRJRCksICJZZWFyU2FtcGxlZCJdKQojIGNvcnJlY3QgYXJjaGl2ZSBzYW1wbGUgWWVhclNhbXBsZWQKYWxsLjE0Yy5jdGwudHJ0W2FsbC4xNGMuY3RsLnRydCRFeHBlcmltZW50ID09ICJhcmMiICYgYWxsLjE0Yy5jdGwudHJ0JFNpdGUgPT0gIkhhaW5pY2giLCAiWWVhclNhbXBsZWQiXSA8LSAyMDExCgojIGFkZCB5ZWFyIG1lYXN1cmVkIGNvbHVtbiwgbW9kaWZ5IGZvciB0bWUubWlzYyBzYW1wbGVzLCByZXdldCBzYW1wbGVzCmFsbC4xNGMuY3RsLnRydCRZZWFyTWVhc3VyZWQgPC0gMjAxOAphbGwuMTRjLmN0bC50cnRbYWxsLjE0Yy5jdGwudHJ0JEV4cGVyaW1lbnQgPT0gInJld2V0IiwgIlllYXJNZWFzdXJlZCJdIDwtIDIwMTkKYWxsLjE0Yy5jdGwudHJ0W3doaWNoKGFsbC4xNGMuY3RsLnRydCRJRCAlaW4lIHRtZS5taXNjJElEKSwgIlllYXJNZWFzdXJlZCJdIDwtIDIwMDkKCiMgY2FsY3VsYXRlIHN0b3JhZ2UgZHVyYXRpb24gbnVtZXJpY2FsbHkgYW5kIGFzIGZhY3RvcgphbGwuMTRjLmN0bC50cnQkdG1lIDwtIHVubGlzdChhbGwuMTRjLmN0bC50cnQkWWVhck1lYXN1cmVkIC0gYWxsLjE0Yy5jdGwudHJ0JFllYXJTYW1wbGVkKQphbGwuMTRjLmN0bC50cnQkdG1lLmYgPC0gZmFjdG9yKGFsbC4xNGMuY3RsLnRydCR0bWUpCgojIGFkZCBkaWZmZXJlbmNlIGNvbHVtbgojIChleHByZXNzZWQgYXMgZGlmZmVyZW5jZSBvZiBtZWFucykKYWxsLjE0Yy5jdGwudHJ0JGN0bC50cnQuZDE0IDwtIGFsbC4xNGMuY3RsLnRydCRkMTRjX2NvcnJfbWVhbl9jdGwgLSBhbGwuMTRjLmN0bC50cnQkZDE0Y19jb3JyX21lYW5fdHJ0CiMgdHJ0LWN0bCBtYWtlcyBGaWcuIDQgKDE6MSBsaW5lKSBhbmQgRmlnLiA1IChzdG9yYWdlIGR1cmF0aW9uKSBtb3JlIGNvbXBhdGlibGUKYWxsLjE0Yy5jdGwudHJ0JHRydC5jdGwuZDE0IDwtIGFsbC4xNGMuY3RsLnRydCRkMTRjX2NvcnJfbWVhbl90cnQgLSBhbGwuMTRjLmN0bC50cnQkZDE0Y19jb3JyX21lYW5fY3RsCgojIGxpc3Qgb2YgbG9jYXRpb25zIGZvciByZWNvZGluZwpsb2MgPC0gbGlzdCgKICAgICJEdWtlIiA9ICJEdWtlLCBOQyIsCiAgICAiSG93bGFuZCIgPSAiSG93bGFuZCwgTUUiLAogICAgIkhhcnZhcmQiID0gIkhhcnZhcmQsIE1BIiwKICAgICJIYWluaWNoIiA9ICJDZW50cmFsIEdlcm1hbnkiLAogICAgIlNjaG9yZmhlaWRlIiA9ICJDZW50cmFsIEdlcm1hbnkiLAogICAgIk11c2ljayIgPSAiU2llcnJhIE5ldmFkYSwgQ0EiLAogICAgIlNoYXZlciIgPSAiU2llcnJhIE5ldmFkYSwgQ0EiLAogICAgIldhbGtlciBCcmFuY2giID0gIk9hayBSaWRnZSwgVE4iLAogICAgIlRlbm5lc3NlZSBWYWxsZXkiID0gIk9hayBSaWRnZSwgVE4iKQoKIyAjIGFkZCBhdG0gMTRDIGZvciB5ZWFyIHNhbXBsZWQgYW5kIGNhbGN1bGF0ZSBkZWx0YS1kZWx0YQojIGFsbC4xNGMuY3RsLnRydCRhdG0ueXIuc2FtcGxlZCA8LSBEYXRtW21hdGNoKGFsbC4xNGMuY3RsLnRydCRZZWFyU2FtcGxlZCwgZmxvb3IoRGF0bSREYXRlKSksICJOSGMxNCJdCiMgYWxsLjE0Yy5jdGwudHJ0JGRkLmN0bCA8LSBhbGwuMTRjLmN0bC50cnQkZDE0Y19jb3JyX21lYW5fY3RsIC0gYWxsLjE0Yy5jdGwudHJ0JGF0bS55ci5zYW1wbGVkCiMgYWxsLjE0Yy5jdGwudHJ0JGRkLnRydCA8LSBhbGwuMTRjLmN0bC50cnQkZDE0Y19jb3JyX21lYW5fdHJ0IC0gYWxsLjE0Yy5jdGwudHJ0JGF0bS55ci5zYW1wbGVkCiMgYWxsLjE0Yy5jdGwudHJ0JGN0bC50cnQuZGQxNCA8LSBhbGwuMTRjLmN0bC50cnQkZGQuY3RsIC0gYWxsLjE0Yy5jdGwudHJ0JGRkLnRydAojIFBsb3Qgb24gMToxIGxpbmUgdy8gZGlhZ29uYWwgbGluZXMgc2hvd2luZyDigLAgb2Zmc2V0cwojIGZpcnN0IGNvbGxhcHNlIHNpdGVzIGZvciBiZXR0ZXIgdmlzdWFscwphbGwuMTRjLmN0bC50cnQgJT4lCiAgZmlsdGVyKEhvcml6b24gPT0gIkEiKSAlPiUKICBmaWx0ZXIoRXhwZXJpbWVudCAhPSAicmV3ZXQiKSAlPiUKICBtdXRhdGUoTG9jYXRpb24gPSByZWNvZGUoU2l0ZSwgISEhbG9jKSkgJT4lCiAgZ2dwbG90KC4sIGFlcyhkMTRjX2NvcnJfbWVhbl9jdGwsIGQxNGNfY29ycl9tZWFuX3RydCwgY29sb3IgPSBMb2NhdGlvbiwgc2hhcGUgPSBUeXBlKSkgKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCkgKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gLTIwLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAyMCwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gLTQwLCBsaW5ldHlwZSA9ICJkb3R0ZWQiKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSA0MCwgbGluZXR5cGUgPSAiZG90dGVkIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGNvbG9yID0gImdyYXkiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgY29sb3IgPSAiZ3JheSIpICsKICBnZW9tX3BvaW50KHNpemUgPSAzKSArCiAgZ2VvbV9lcnJvcmJhcigKICAgIGFlcyh5bWluID0gZDE0Y19jb3JyX21pbl90cnQsIAogICAgICAgIHltYXggPSBkMTRjX2NvcnJfbWF4X3RydCwgCiAgICAgICAgY29sb3IgPSBMb2NhdGlvbiksIAogICAgd2lkdGggPSAuMjUpICsKICBnZW9tX2Vycm9yYmFyaCgKICAgIGFlcyh4bWluID0gZDE0Y19jb3JyX21pbl9jdGwsIAogICAgICAgIHhtYXggPSBkMTRjX2NvcnJfbWF4X2N0bCwgCiAgICAgICAgY29sb3IgPSBMb2NhdGlvbiksIAogICAgaGVpZ2h0ID0gLjkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygnRHVrZSwgTkMnID0gJyMwMUJCOTcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTaWVycmEgTmV2YWRhLCBDQScgPSAnI0ZGQzEwNycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NlbnRyYWwgR2VybWFueScgPSAnYmxhY2snLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdIYXJ2YXJkLCBNQScgPSAnIzFFODhFNScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ09hayBSaWRnZSwgVE4nID0gJyNEODFCNjAnKSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gJ0xhbmQgdXNlJywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygnRic9IDE3LCdHJyA9IDE2KSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnRm9yZXN0JywnR3Jhc3NsYW5kJykpICsKICB4bGFiKGV4cHJlc3Npb24oJ0NvbnRyb2wgJypEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgeWxhYihleHByZXNzaW9uKCdBaXItZHJ5ICsgc3RvcmFnZSAnKkRlbHRhKicnXjE0KidDICjigLApJykpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC5rZXkuaGVpZ2h0PXVuaXQoLjgsICJjbSIpLAogICAgICAgIGFzcGVjdC5yYXRpbyA9IDEpCgojIGZvciBwbG90dGluZyB3aXRoIGNvbG9yID0gVHlwZSAoY3VycmVudGx5IHN1cHByZXNzZWQpCiMgYWxsLjE0Yy5jdGwudHJ0ICU+JQojICAgZmlsdGVyKEhvcml6b24gPT0gIkEiKSAlPiUKIyAgIG11dGF0ZShMb2NhdGlvbiA9IGZhY3RvcihyZWNvZGUoU2l0ZSwgISEhbG9jKSwgZXhjbHVkZSA9IFRSVUUpKSAlPiUKIyAgIGdncGxvdCguLCBhZXMoZDE0Y19jb3JyX21lYW5fY3RsLCBkMTRjX2NvcnJfbWVhbl90cnQsIGNvbG9yID0gVHlwZSwgc2hhcGUgPSBMb2NhdGlvbikpICsKIyAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCkgKwojICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAtMjAsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKIyAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMjAsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKIyAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gLTQwLCBsaW5ldHlwZSA9ICJkb3RkYXNoIikgKwojICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSA0MCwgbGluZXR5cGUgPSAiZG90ZGFzaCIpICsKIyAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGNvbG9yID0gImdyYXkiKSArCiMgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBjb2xvciA9ICJncmF5IikgKwojICAgZ2VvbV9wb2ludChzaXplID0gMykgKwojICAgZ2VvbV9lcnJvcmJhcigKIyAgICAgYWVzKHltaW4gPSBkMTRjX2NvcnJfbWluX3RydCwgCiMgICAgICAgICB5bWF4ID0gZDE0Y19jb3JyX21heF90cnQsIAojICAgICAgICAgY29sb3IgPSBUeXBlKSwgCiMgICAgIHdpZHRoID0gLjI1KSArCiMgICBnZW9tX2Vycm9yYmFyaCgKIyAgICAgYWVzKHhtaW4gPSBkMTRjX2NvcnJfbWluX2N0bCwgCiMgICAgICAgICB4bWF4ID0gZDE0Y19jb3JyX21heF9jdGwsIAojICAgICAgICAgY29sb3IgPSBUeXBlKSwgCiMgICAgIGhlaWdodCA9IC45KSArCiMgICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICdMYW5kIHVzZScsCiMgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID1jKCdGJz0nI2EzNTUxMycsJ0cnPScjMTM2MWEzJyksCiMgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnRm9yZXN0JywnR3Jhc3NsYW5kJykpICsKIyAgIHhsYWIoZXhwcmVzc2lvbignQ29udHJvbCAnKkRlbHRhKicnXjE0KidDICjigLApJykpICsKIyAgIHlsYWIoZXhwcmVzc2lvbignVHJlYXRtZW50ICcqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwojICAgdGhlbWVfYncoKSArCiMgICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgbGVnZW5kLmtleS5oZWlnaHQ9dW5pdCguOCwgImNtIiksCiMgICAgICAgICBhc3BlY3QucmF0aW8gPSAxKQpgYGAKPioqRmlnLiBgciB7ZmlnLm4gKyA0fWAuIEVmZmVjdCBvZiBhaXItZHJ5aW5nIGFuZCByZXdldHRpbmcgKyBzdG9yYWdlIG9uIF4xNF5DLUNPfjJ+KioKCj4qQ2FwdGlvbjoqIFBvaW50cyBzaG93IGRhdGEgZnJvbSB0aGUgRXhwZXJpbWVudHMgMSBhbmQgMyAoYWlyLWRyeSArIHN0b3JhZ2UgdHJlYXRtZW50KS4gUG9pbnRzIGFyZSB0aGUgbWVhbiBvZiBsYWJvcmF0b3J5IHJlcGxpY2F0ZXMgKGZvciByZXBsaWNhdGVkIHNhbXBsZXMpOyBlcnJvciBiYXJzIGFyZSAyeCBzdGFuZGFyZCBlcnJvciBvZiB0aGUgbWVhbi4gU29saWQgbGluZSBpcyAxOjEsIHdoaWxlIHRoZSBkYXNoZWQgYW5kIGRvdHRlZCBsaW5lcyBzaG93IGRpZmZlcmVuY2VzIG9mIMKxMjDigLAgYW5kIMKxJDQw4oCwLCBlcXVpdmFsZW50IHRvIHRoZSBkZWNsaW5lIGluIGF0bW9zcGhlcmljIENPfjJ+IG92ZXIgNSBhbmQgMTAgeWVhcnMgcmVzcGVjdGl2ZWx5IGR1cmluZyB0aGUgcGVyaW9kIG9mIDIwMDAgdG8gMjAyMC4KCiMjIFN0b3JhZ2UgZHVyYXRpb24gZWZmZWN0IG9uIF4xNF5DLUNPfjJ+IChFeHBlcmltZW50IDMpCgpUaGVyZSBkb2VzIG5vdCBzZWVtIHRvIGJlIGV2aWRlbmNlIGZvciBhIHN0b3JhZ2UgZHVyYXRpb24gZWZmZWN0IGluIHRoZSBzYW1wbGVzIHRoYXQgb25seSBjb250YWluIGJvbWItQywgYWx0aG91Z2ggdGhlIHRyZW5kIGluIHRoZSBkaWZmZXJlbmNlcyBkdWUgdG8gdHJlYXRtZW50IGZvciB0aGUgaGlnaGx5IGVucmljaGVkIHNhbXBsZXMgZnJvbSBPYWsgUmlkZ2UsIFROIHN1Z2dlc3QgbG9zc2VzIG9mIHRoZSBtb3N0IHJlY2VudGx5IGZpeGVkIGNhcmJvbiBvdmVyIHRoZSBkdXJhdGlvbiBvZiBzdG9yYWdlLiBUaGVzZSBzYW1wbGVzIHdlcmUgaW5jbHVkZWQgcHJpbWFyaWx5IGJlY2F1c2UgaXQgd2FzIGFzc3VtZWQgdGhhdCB0aGV5IHdvdWxkIGJlIG1vcmUgc2Vuc2l0aXZlIHRvIHBvdGVudGlhbCBsb3NzZXMgb2YgcmVjZW50bHkgZml4ZWQgY2FyYm9uLCBhcyB0aGUgbGFiZWwgc2hvdWxkIG9ubHkgYmUgcHJlc2VudCBpbiB0aGlzIHBvb2wgb2Ygc29pbCBDLiAKYGBge3IgcGxvdC1kdXItc3Rvcn0KIyBQbG90IHN0b3JhZ2UgZHVyYXRpb24Kc3VwcHJlc3NXYXJuaW5ncygKICBhbGwuMTRjLmN0bC50cnQgJT4lCiAgZmlsdGVyKEhvcml6b24gPT0gIkEiKSAlPiUKICBmaWx0ZXIoRXhwZXJpbWVudCAhPSAicmV3ZXQiKSAlPiUKICBzZWxlY3QoVHlwZSwgdG1lLmYsIFNpdGUsIHRydC5jdGwuZDE0LCB0bWUpICU+JQogIGdyb3VwX2J5KFR5cGUsIHRtZS5mLCBTaXRlKSAlPiUKICBhZGRfdGFsbHkoKSAlPiUKICBzdW1tYXJpc2VfYWxsKGxpc3QobWVhbiA9IG1lYW4sIHNkID0gc2QpLCBuYS5ybSA9IFRSVUUpICU+JQogIG11dGF0ZShkaWZfc2UgPSB0cnQuY3RsLmQxNF9zZC9uX21lYW4sCiAgICAgICAgIGRpZl91ID0gdHJ0LmN0bC5kMTRfbWVhbiArIGRpZl9zZSoyLAogICAgICAgICBkaWZfbCA9IHRydC5jdGwuZDE0X21lYW4gLSBkaWZfc2UqMikgJT4lCiAgbXV0YXRlKExvY2F0aW9uID0gZmFjdG9yKHJlY29kZShTaXRlLCAhISFsb2MpLCBleGNsdWRlID0gVFJVRSkpICU+JQogIGdncGxvdCguLCBhZXModG1lX21lYW4sIHRydC5jdGwuZDE0X21lYW4sIGNvbG9yID0gTG9jYXRpb24sIHNoYXBlID0gVHlwZSkpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTIwLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMjAsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSA0MCwgbGluZXR5cGUgPSAiZG90dGVkIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC00MCwgbGluZXR5cGUgPSAiZG90dGVkIikgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDMsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UyKHdpZHRoID0gLjcsIHByZXNlcnZlID0gInNpbmdsZSIpKSArCiAgZ2VvbV9lcnJvcmJhcigKICAgIGFlcyh5bWluID0gZGlmX2wsCiAgICAgICAgeW1heCA9IGRpZl91LCAKICAgICAgICBjb2xvciA9IExvY2F0aW9uKSwKICAgIHdpZHRoID0gLjcsCiAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlMih3aWR0aCA9IC43LCBwcmVzZXJ2ZSA9ICJzaW5nbGUiKSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCdEdWtlLCBOQycgPSAnIzAxQkI5NycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1NpZXJyYSBOZXZhZGEsIENBJyA9ICcjRkZDMTA3JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ2VudHJhbCBHZXJtYW55JyA9ICdibGFjaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0hhcnZhcmQsIE1BJyA9ICcjMUU4OEU1JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnT2FrIFJpZGdlLCBUTicgPSAnI0Q4MUI2MCcpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAnTGFuZCB1c2UnLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCdGJz0gMTcsJ0cnID0gMTYpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCdGb3Jlc3QnLCdHcmFzc2xhbmQnKSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoNSwxMywyKSkgKwogIHlsYWIoZXhwcmVzc2lvbignVHJlYXRtZW50IC0gQ29udHJvbCAnKkRlbHRhKicnXjE0KidDICjigLApJykpICsKICB4bGFiKCJTdG9yYWdlIGR1cmF0aW9uICh5ZWFycykiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKICApCmBgYAoKPioqRmlnLiBgciB7ZmlnLm4gKyA1fWAuIENoYW5nZSBpbiBeMTReQy1DT34yfiBpbiByZWxhdGlvbiB0byBzdG9yYWdlIGR1cmF0aW9uKioKCj4qQ2FwdGlvbjoqIFBvaW50cyBzaG93IGRhdGEgZnJvbSBib3RoIEV4cGVyaW1lbnQgMSAoaW4gYmxhY2spIGFuZCBFeHBlcmltZW50IDMgKGFsbCBvdGhlciBwb2ludHMpLiBEYXNoZWQgYW5kIGRvdHRlZCBsaW5lcyBzaG93IGEgZGlmZmVyZW5jZSBvZiAyMOKAsCBhbmQgNDDigLAsIGVxdWl2YWxlbnQgdG8gdGhlIGF0bW9zcGhlcmljIGRlY2xpbmUgb3ZlciBmaXZlIGFuZCAxMCB5ZWFycyByZXNwZWN0aXZlbHkgZm9yIHRoZSBwZXJpb2QgMjAwMCB0byAyMDIwLiBQb3NpdGlvbiBvZiBwb2ludHMgaml0dGVyZWQgdG8gYXZvaWQgb3ZlcnBsb3R0aW5nOyBzdG9yYWdlIGR1cmF0aW9uIGhhcyBiZWVuIHJvdW5kZWQgZG93biB0byB0aGUgbmVhcmVzdCB3aG9sZSB5ZWFyLgoKVGhlIHRyZW5kIGluIHRoZSBkaWZmZXJlbmNlcyBkdWUgdG8gdHJlYXRtZW50IGZvciB0aGUgaGlnaGx5IGVucmljaGVkIHNhbXBsZXMgZnJvbSBPYWsgUmlkZ2UsIFROIHN1Z2dlc3QgbG9zc2VzIG9mIHRoZSBtb3N0IHJlY2VudGx5IGZpeGVkIGNhcmJvbiBvdmVyIHRoZSBkdXJhdGlvbiBvZiBzdG9yYWdlLiBUaGUgVE4gc2FtcGxlcyB3ZXJlIGluY2x1ZGVkIHByaW1hcmlseSBiZWNhdXNlIGl0IHdhcyBhc3N1bWVkIHRoYXQgdGhleSB3b3VsZCBiZSBtb3JlIHNlbnNpdGl2ZSB0byBwb3RlbnRpYWwgbG9zc2VzIG9mIHJlY2VudGx5IGZpeGVkIGNhcmJvbiwgYXMgdGhlIGxhYmVsIHNob3VsZCBvbmx5IGJlIHByZXNlbnQgaW4gdGhpcyBwb29sIG9mIHNvaWwgQy4gSG93ZXZlciwgaW4gY29udHJhc3QsIHRoZXJlIGRvZXMgbm90IHNlZW0gdG8gYmUgZXZpZGVuY2UgZm9yIGEgc3RvcmFnZSBkdXJhdGlvbiBlZmZlY3QgaW4gdGhlIHNhbXBsZXMgdGhhdCBvbmx5IGNvbnRhaW4gYm9tYi1DLgoKCiMgRGlzY3Vzc2lvbgoKKlJhbmRvbSBub3RlcyBoZXJlLi4uKgoKKkVmZmVjdCBvZiBDIHJlc3BpcmVkKgpgYGB7ciBzb20tMTRjLWNhbGNzLCBpbmNsdWRlID0gRkFMU0V9CiMgcmVhZCAxNEMgU09NIGRhdGEKZXhwLnNvbTE0YyA8LSByZWFkLnhsc3goIi4uL2RhdGEvZXh0ZXJuYWwvZXhwbG9yYXRvcmllc19pc2Nob2VuaW5nXzE0Yy1zb21fMjAxMS8xNzAyMjhfMTRDX1NPTS54bHN4IikKZXhwLnNvbTE0YyAlPiUgCiAgZmlsdGVyKEV4cGxvcmF0b3J5ICE9ICJBIikgJT4lCiAgZ3JvdXBfYnkoRXhwbG9yYXRvcnksIFR5cGUpICU+JQogIHN1bW1hcml6ZShtZWFuID0gbWVhbihgMTRDX1NPTWApKQpgYGAKCgpXaGF0IGlzIHRoZSBlZmZlY3Qgb2YgMTNDPyBDYW4gd2UgZXhwbGFpbiB0aGUgcGF0dGVybnMgaW4gMTRDIG9yIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGdyYXNzbGFuZHMgYW5kIGZvcmVzdHMgd2l0aCAxM0MgZGF0YT8KCk5vdGUgdGhhdCAxM0MgY2FuIGdpdmUgaW5zaWdodCBpbnRvIHRoZSB0eXBlIG9mIGNvbXBvdW5kLCBhcyB3ZWxsIGFzIHRoZSBkZWdyZWUgb2YgcHJvY2Vzc2luZywgY2YuIEJ1emVrIGV0IGFsIDIwMDkuIE94aWRhdGlvbiBvZiBtaWNyb2JpYWwgQ0h+NH4gdG8gQ09+Mn4gY2FuIGxlYWQgdG8gZXh0cmVtZWx5IG5lZ2F0aXZlICRcZGVsdGEkXjEzXkMuIENPfjJ+IGRlcml2ZWQgZnJvbSB1bnByb2Nlc3NlZCBtYXRlcmlhbCBzaG91bGQgaGF2ZSAkXGRlbHRhJF4xM15DIHZhbHVlcyBjbG9zZXIgdG8gdGhhdCBvZiBwbGFudHMsIHdoaWxlIGhpZ2hseSBwcm9jZXNzZWQgbWF0ZXJpYWwgd291bGQgYmUgaGVhdmllci4KCgpgYGB7ciBzdGF0cy0xM2N9CgpgYGAKCiMgV2l0aGluIHJlcCB2YXJpYWJpbGl0eQoKQ29tcGFyZSB0aGUgdmFyaWFiaWxpdHkgaW4gJFxEZWx0YSReMTReQyBhbW9uZyBsYWJvcmF0b3J5IHJlcGxpY2F0ZXMgdG8gdGhhdCBiZXR3ZWVuIHRyZWF0bWVudCBhbmQgY29udHJvbC4KCkNhbGN1bGF0ZSBieSBzaXRlLCBieSBlY29zeXN0ZW0uIE5vdGUgdGhhdCBtZWFucyBhbmQgc3RhbmRhcmQgZXJyb3JzIGZvciB0aGUgRXhwZXJpbWVudCAyIHNhbXBsZXMgKCJyZXdldCIpIGFyZSBjYWxjdWxhdGVkIGFzIHRoZSBtZWFuIG9mIHRoZSBtZWFuIGRpZmZlcmVuY2VzIG9ic2VydmVkIGZvciBjb250cm9sIGR1cGxpY2F0ZXMgYW5kIGZvciB0cmVhdG1lbnQgZHVwbGljYXRlcywgYW5kIHRoZSBzdGFuZGFyZCBlcnJvciBpcyBlcXVhbCB0byB0aGUgc3F1YXJlIHJvb3Qgb2YgdGhlIHN1bSBvZiB0aGUgdmFyaWFuY2VzIGZvciBlYWNoIHNldC4KCmBgYHtyIHJlcC12YXJ9CiMgY2FsYyBkaWZmZXJlbmNlIGJldHdlZW4gcmVwcyBhbmQgY29tcGFyZSB0byBkaWYgYmV0d2VlbiBjdGwgYW5kIHRyZWF0CmUxMi5kMTQgPC0gYWxsLjE0Yy5sc1tbMl1dCmUxMi5kMTQuaW5jIDwtIGUxMi5kMTRbZTEyLmQxNCRQZXJpb2QgPT0gImluYyIsIF0KCiMgY2FsY3VsYXRlIGRkMTRjCmRkMTRjLnN1bSA8LSBlMTIuZDE0LmluYwpkZDE0Yy5zdW0kYXRtMTRjIDwtIGlmZWxzZShkZDE0Yy5zdW0kWWVhclNhbXBsZWQgPT0gMjAxMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRtW3doaWNoKERhdG0kRGF0ZSA9PSAyMDExLjUpLCAiTkhjMTQiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRtW3doaWNoKERhdG0kRGF0ZSA9PSAyMDE5LjUpLCAiTkhjMTQiXSkKZGQxNGMuc3VtJGRkMTRjIDwtIGRkMTRjLnN1bSRkMTRjX2NvcnIgLSBkZDE0Yy5zdW0kYXRtMTRjCmRkMTRjLnN1bSA8LSBkZDE0Yy5zdW0gJT4lIAogIHNlbGVjdChFeHBlcmltZW50LCBUcmVhdG1lbnQsIFR5cGUsIGRkMTRjKSAlPiUKICBncm91cF9ieShFeHBlcmltZW50LCBUcmVhdG1lbnQsIFR5cGUpICU+JQogIGFkZF90YWxseSgpICU+JQogIHN1bW1hcml6ZV9hbGwobGlzdChtZWFuID0gbWVhbiwgc2QgPSBzZCksIG5hLnJtID0gVFJVRSkgJT4lCiAgbXV0YXRlKGRkMTRjX3NlID0gZGQxNGNfc2Qvbl9tZWFuKQoKZGQxNGMuc3VtICU+JQogIG11dGF0ZSh0cmVhdC5iaSA9IGlmZWxzZShUcmVhdG1lbnQgIT0gImNvbnRyb2wiLCAidHJlYXRtZW50IiwgImNvbnRyb2wiKSwKICAgICAgICAgZGQxNGNfbWluID0gZGQxNGNfbWVhbiAtIGRkMTRjX3NlKjIsCiAgICAgICAgIGRkMTRjX21heCA9IGRkMTRjX21lYW4gKyBkZDE0Y19zZSoyKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHRyZWF0LmJpLCBkZDE0Y19tZWFuLCBjb2xvciA9IFR5cGUpKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIGdlb21fZXJyb3JiYXIoCiAgICBhZXMoeW1pbiA9IGRkMTRjX21pbiwgCiAgICAgICAgeW1heCA9IGRkMTRjX21heCwgCiAgICAgICAgY29sb3IgPSBUeXBlKSwgCiAgICB3aWR0aCA9IC4xKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAnRWNvc3lzdGVtJywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID1jKCdGJz0nI2EzNTUxMycsJ0cnPScjMTM2MWEzJyksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ0ZvcmVzdCcsJ0dyYXNzbGFuZCcpKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhFeHBlcmltZW50KSkgKyAKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQoKIyBzcGxpdCBieSBFeHBlcmltZW50IGFuZCBUeXBlIHRvIGNvbXBhcmUgd2l0aCBjdGwtdHJ0IGRpZnMKZTEyLmQxNC5pbmMubHMgPC0gbGFwcGx5KHNwbGl0KGUxMi5kMTQuaW5jLCBlMTIuZDE0LmluYyRFeHBlcmltZW50KSwgZnVuY3Rpb24oeCkgewogICAgbGFwcGx5KHNwbGl0KHgsIHgkVHlwZSksIGZ1bmN0aW9uKHkpIHsKICAgICAgeSA8LSBsYXBwbHkoc3BsaXQoeSwgeSRUcmVhdG1lbnQpLCBmdW5jdGlvbih6KSB7CiAgICAgICAgeiA8LSBsYXBwbHkoc3BsaXQoeiwgeiRJRCksIGZ1bmN0aW9uKG0pIHsKICAgICAgICAgIGlmKG5yb3cobSkgPiAxKSB7CiAgICAgICAgICAgIG0gPC0gYWJzKG1bMiwgImQxNGMiXSAtIG1bMSwgImQxNGMiXSkKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG0gPC0gTkEKICAgICAgICAgIH0KICAgICAgICB9KQogICAgICAgIG1lYW4gPC0gbWVhbih1bmxpc3QoeikpCiAgICAgICAgc2QgPC0gc2QodW5saXN0KHopKQogICAgICAgIHZhciA8LSB2YXIodW5saXN0KHopKQogICAgICAgIG4gPC0gbGVuZ3RoKHopCiAgICAgICAgei5scyA8LSBsaXN0KG1lYW4gPSBtZWFuLAogICAgICAgICAgICAgICAgICAgICBzZCA9IHNkLAogICAgICAgICAgICAgICAgICAgICB2YXIgPSB2YXIsCiAgICAgICAgICAgICAgICAgICAgIG4gPSBuLAogICAgICAgICAgICAgICAgICAgICBzZSA9IHNkL3NxcnQobikpCiAgICAgICAgfSkKICB9KQp9KQoKIyByZWR1Y2UgbGlzdAp2YXIubmFtZXMgPC0gYygiRXhwZXJpbWVudCIsICJUeXBlIiwgIlRyZWF0bWVudCIsICJkaXNwZXJzaW9uIikKdmFsdWVzIDwtIHVubGlzdChlMTIuZDE0LmluYy5scykKZTEyLmQxNC5zZGlmLm1hdCA8LSBtYXRyaXgobmNvbCA9IGxlbmd0aCh2YXIubmFtZXMpICsgMSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG5yb3cgPSBsZW5ndGgodmFsdWVzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZGltbmFtZXMgPSBsaXN0KE5VTEwsIGModmFyLm5hbWVzLCAidmFsdWUiKSkpCmZvcihpIGluIHNlcV9hbG9uZyh2YXIubmFtZXMpKSB7CiAgZTEyLmQxNC5zZGlmLm1hdFssIGldIDwtIHVubGlzdChsYXBwbHkoc3Ryc3BsaXQobmFtZXModmFsdWVzKSwgIlxcLiIpLCAiW1siLCBpKSkKfQoKZTEyLmQxNC5zZGlmIDwtIGRhdGEuZnJhbWUoZTEyLmQxNC5zZGlmLm1hdCkKZTEyLmQxNC5zZGlmJHZhbHVlIDwtIHZhbHVlcwogCiMgd2lkZW4gYW5kIHJlbW92ZSBOQXMKZTEyLmQxNC5zZGlmIDwtIHBpdm90X3dpZGVyKGUxMi5kMTQuc2RpZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzX2Zyb20gPSAiZGlzcGVyc2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNfZnJvbSA9ICJ2YWx1ZSIpCmUxMi5kMTQuc2RpZiA8LSBlMTIuZDE0LnNkaWZbIWlzLm5hKGUxMi5kMTQuc2RpZiRtZWFuKSwgXQoKIyBtYWtlIGZ1cnRoZXIgcmVkdWNlZCBkZiAoY29sbGFwc2UgdHJlYXRtZW50KQplMTIuZDE0LnNkaWYyIDwtIGRhdGEuZnJhbWUoRXhwZXJpbWVudCA9IHJlcChjKCJhcmMiLCAicmV3ZXQiKSwgZWFjaCA9IDIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSA9IHJlcChjKCJGIiwgIkciKSwgMikpCmUxMi5kMTQuc2RpZjIkbWVhbiA8LSB1bmxpc3QoYyhlMTIuZDE0LnNkaWZbZTEyLmQxNC5zZGlmJEV4cGVyaW1lbnQgPT0gImFyYyIgJmUxMi5kMTQuc2RpZiRUeXBlID09ICJGIiwgIm1lYW4iXSwKICAgICAgICAgICAgICAgICAgICAgICAgZTEyLmQxNC5zZGlmW2UxMi5kMTQuc2RpZiRFeHBlcmltZW50ID09ICJhcmMiICZlMTIuZDE0LnNkaWYkVHlwZSA9PSAiRyIsICJtZWFuIl0sCiAgICAgICAgICAgICAgICAgICAgICAgIG1lYW4odW5saXN0KGUxMi5kMTQuc2RpZltlMTIuZDE0LnNkaWYkRXhwZXJpbWVudCA9PSAicmV3ZXQiICZlMTIuZDE0LnNkaWYkVHlwZSA9PSAiRiIsICJtZWFuIl0pKSwKICAgICAgICAgICAgICAgICAgICAgICAgbWVhbih1bmxpc3QoZTEyLmQxNC5zZGlmW2UxMi5kMTQuc2RpZiRFeHBlcmltZW50ID09ICJyZXdldCIgJmUxMi5kMTQuc2RpZiRUeXBlID09ICJHIiwgIm1lYW4iXSkpKSkKCiMgZnVuY3Rpb24gZm9yIGNhbGN1bGF0aW5nIHN0ZCBlcnIgb2YgZGlmcwpzdGQuZXJyLmRpZiA8LSBmdW5jdGlvbihzZHMsIG5zKSB7c3FydChzZHNbMV1eMi9uc1sxXSArIHNkc1syXV4yL25zWzJdKX0KIyBmdW5jdGlvbiBmb3IgY2FsY3VsYXRpbmcgbWVhbiBzdGQgZGV2CnN0ZC5kZXYubWVhbiA8LSBmdW5jdGlvbih2YXJzKSB7c3FydChtZWFuKHZhcnMpKX0KCmUxMi5kMTQuc2RpZjIkc2UgPC0gdW5saXN0KGMoZTEyLmQxNC5zZGlmW2UxMi5kMTQuc2RpZiRFeHBlcmltZW50ID09ICJhcmMiICZlMTIuZDE0LnNkaWYkVHlwZSA9PSAiRiIsICJzZSJdLAogICAgICAgICAgICAgICAgICAgICAgICBlMTIuZDE0LnNkaWZbZTEyLmQxNC5zZGlmJEV4cGVyaW1lbnQgPT0gImFyYyIgJmUxMi5kMTQuc2RpZiRUeXBlID09ICJHIiwgInNlIl0sCiAgICAgICAgICAgICAgICAgICAgICBzdGQuZXJyLmRpZih1bmxpc3QoZTEyLmQxNC5zZGlmW2UxMi5kMTQuc2RpZiRFeHBlcmltZW50ID09ICJyZXdldCIgJmUxMi5kMTQuc2RpZiRUeXBlID09ICJGIiwgInNkIl0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5saXN0KGUxMi5kMTQuc2RpZltlMTIuZDE0LnNkaWYkRXhwZXJpbWVudCA9PSAicmV3ZXQiICZlMTIuZDE0LnNkaWYkVHlwZSA9PSAiRiIsICJuIl0pKSwKICAgICAgICAgICAgICAgICAgICAgIHN0ZC5lcnIuZGlmKHVubGlzdChlMTIuZDE0LnNkaWZbZTEyLmQxNC5zZGlmJEV4cGVyaW1lbnQgPT0gInJld2V0IiAmZTEyLmQxNC5zZGlmJFR5cGUgPT0gIkciLCAic2QiXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmxpc3QoZTEyLmQxNC5zZGlmW2UxMi5kMTQuc2RpZiRFeHBlcmltZW50ID09ICJyZXdldCIgJmUxMi5kMTQuc2RpZiRUeXBlID09ICJHIiwgIm4iXSkpKSkKCiMgY2FsYyBtZWFuIHZhcmlhbmNlCmUxMi5kMTQuc2RpZjIkdmFyIDwtIHVubGlzdChjKGUxMi5kMTQuc2RpZltlMTIuZDE0LnNkaWYkRXhwZXJpbWVudCA9PSAiYXJjIiAmZTEyLmQxNC5zZGlmJFR5cGUgPT0gIkYiLCAidmFyIl0sCiAgICAgICAgICAgICAgICAgICAgICAgIGUxMi5kMTQuc2RpZltlMTIuZDE0LnNkaWYkRXhwZXJpbWVudCA9PSAiYXJjIiAmZTEyLmQxNC5zZGlmJFR5cGUgPT0gIkciLCAidmFyIl0sCiAgICAgICAgICAgICAgICAgICAgICBtZWFuKHVubGlzdChlMTIuZDE0LnNkaWZbZTEyLmQxNC5zZGlmJEV4cGVyaW1lbnQgPT0gInJld2V0IiAmZTEyLmQxNC5zZGlmJFR5cGUgPT0gIkYiLCAidmFyIl0pKSwKICAgICAgICAgICAgICAgICAgICAgIG1lYW4odW5saXN0KGUxMi5kMTQuc2RpZltlMTIuZDE0LnNkaWYkRXhwZXJpbWVudCA9PSAicmV3ZXQiICZlMTIuZDE0LnNkaWYkVHlwZSA9PSAiRyIsICJ2YXIiXSkpKSkKCiMgbWVhbiBzdGQgZGV2IGZvciBmb3Jlc3RzCnN0ZC5kZXYubWVhbihjKGUxMi5kMTQuc2RpZjJbZTEyLmQxNC5zZGlmMiRUeXBlID09ICJGIiwgInZhciJdKSkKIyBtZWFuIHN0ZCBkZXYgZm9yIGdyYXNzbGFuZHMKc3RkLmRldi5tZWFuKGMoZTEyLmQxNC5zZGlmMltlMTIuZDE0LnNkaWYyJFR5cGUgPT0gIkciLCAidmFyIl0pKQoKIyBjb21wYXJlIHRvIGN0bCB0cmVhdCBkaWYKZTEyLjE0Yy5jdGwudHJ0IDwtIGFsbC4xNGMuY3RsLnRydCAlPiUKICBzZWxlY3QoRXhwZXJpbWVudCwgVHlwZSwgY3RsLnRydC5kMTQpICU+JQogIGdyb3VwX2J5KEV4cGVyaW1lbnQsIFR5cGUpICU+JQogIGFkZF90YWxseSgpICU+JQogIHN1bW1hcml6ZV9hbGwobGlzdChtZWFuID0gbWVhbiwgc2QgPSBzZCwgdmFyID0gdmFyKSwgbmEucm0gPSBUUlVFKSAlPiUKICBtdXRhdGUoY3RsLnRydC5zZSA9IGN0bC50cnQuZDE0X3NkL25fbWVhbikKCiMgY29tYmluZQp2YXIuY2YgPC0gY2JpbmQuZGF0YS5mcmFtZShlMTIuMTRjLmN0bC50cnRbMTo0LCBdLCBlMTIuZDE0LnNkaWYyWyAsIGMoIm1lYW4iLCAic2UiKV0pCmtuaXRyOjprYWJsZSh2YXIuY2ZbLCBjKCJFeHBlcmltZW50IiwgIlR5cGUiLCAiY3RsLnRydC5kMTRfbWVhbiIsICJjdGwudHJ0LnNlIiwgIm1lYW4iLCAic2UiKV0sCiAgICAgICAgICAgICBjb2wubmFtZXMgPSBjKCJFeHBlcmltZW50IiwgIlR5cGUiLCAiQ3RsLVRydCBtZWFuIGRpZiIsICJDdGwtVHJ0IFNFIiwgIlJlcGxpY2F0ZSBtZWFuIGRpZiIsICJSZXBsaWNhdGUgU0UiKSwKICAgICAgICAgICAgIGNhcHRpb24gPSAiQ29tcGFyaXNvbiBvZiB0cmVhdG1lbnQgZGlmZmVyZW5jZXMgdmVyc3VzIHZhcmlhYmlsaXR5IGFtb25nIHJlcGxpY2F0ZXMiLAogICAgICAgICAgICAgYWxpZ24gPSAiYyIsCiAgICAgICAgICAgICBkaWdpdHMgPSAxKQpgYGAKCiMgQ2hhbmdlIGluIHNvaWwgbW9pc3R1cmUgY29udGVudCB3aXRoIG1vaXN0dXJlIGFkanVzdG1lbnQKClRoZSBtYWluIHRyZWF0bWVudCBlZmZlY3QgaW4gYWxsIHRocmVlIGV4cGVyaW1lbnRzIGlzIHRoZSBkZWdyZWUgb2YgbW9pc3R1cmUgYWRqdXN0bWVudCBvZiB0aGUgc29pbCBzYW1wbGUgcHJpb3IgdG8gaW5jdWJhdGlvbi4gSW4gdGhlIGNhc2Ugb2YgdGhlIGNvbnRyb2wgc2FtcGxlcyB0aGUgY2hhbmdlIGluIG1vaXN0dXJlIGNvbnRlbnQgaXMgbGVzcyBleHRyZW1lIHRoYW4gdGhlIHRyZWF0bWVudCBzYW1wbGVzIHNpbmNlIHRoZSBzYW1wbGVzIGFyZSBzdGlsbCBmaWVsZC1tb2lzdCByYXRoZXIgdGhhbiBhaXItZHJpZWQuIFRoZSBtYWduaXR1ZGUgb2YgdGhlIHRyZWF0bWVudCBlZmZlY3QgbWF5IHRoZXJlZm9yZSBkZXBlbmQgb24gd2hhdCB0aGUgZmllbGQgbW9pc3R1cmUgY29udGVudCBvZiB0aGUgY29udHJvbCBzb2lscyB3YXMuCgpgYGB7ciBkZWx0YS1tb2lzdHVyZS1jYWxjfQojIGNvbXBhcmUgdGhlIGNoYW5nZSBpbiBtb2lzdHVyZSB3aXRoIGNvbnRyb2wgc2FtcGxlcyB2ZXJzdXMgdHJlYXRtZW50IHNhbXBsZXMKd2hjRnJlc2ggPC0gbWVyZ2UoYXJjaGl2ZS5jdGwudHMud2lkZVthcmNoaXZlLmN0bC50cy53aWRlJEV4cGVyaW1lbnQgPT0gImFyYyIsIGMoIklEIiwgIndoY0ZyZXNoIildLAogICAgICAgICAgICAgICAgICBqYXJpbmZvLnJld2V0W2phcmluZm8ucmV3ZXQkVHJlYXRtZW50ID09ICJjb250cm9sIiwgYygiSUQiLCAid2hjRnJlc2giKV0sCiAgICAgICAgICAgICAgICAgIGJ5ID0gIklEIiwKICAgICAgICAgICAgICAgICAgYWxsLnggPSBUUlVFLAogICAgICAgICAgICAgICAgICBzdWZmaXhlcyA9IGMoIl8yMDExIiwgIl8yMDE5IikpCndoY0ZyZXNoJGRlbHRhV0hDXzIwMTEgPC0gLjYtd2hjRnJlc2gkd2hjRnJlc2hfMjAxMQp3aGNGcmVzaCRkZWx0YVdIQ18yMDE5IDwtIC42LXdoY0ZyZXNoJHdoY0ZyZXNoXzIwMTkKd2hjRnJlc2gkVHlwZSA8LSBpZmVsc2UoZ3JlcGwoIkciLCB3aGNGcmVzaCRJRCksICJHIiwgIkYiKQoKIyBzdW1hbXJpemUKd2hjRnJlc2hfc3VtIDwtIHdoY0ZyZXNoICU+JQogIHNlbGVjdChUeXBlLCBkZWx0YVdIQ18yMDExLCBkZWx0YVdIQ18yMDE5LCB3aGNGcmVzaF8yMDExLCB3aGNGcmVzaF8yMDE5KSAlPiUKICBncm91cF9ieShUeXBlKSAlPiUKICBhZGRfdGFsbHkoKSAlPiUKICBzdW1tYXJpemVfYWxsKGxpc3QobWVhbiA9IG1lYW4sIHNkID0gc2QpLCBuYS5ybSA9IFRSVUUpICU+JQogIG11dGF0ZShkZWx0YV9zZV8xMSA9IGRlbHRhV0hDXzIwMTFfc2Qvbl9tZWFuLAogICAgICAgICBkZWx0YV9zZV8xOSA9IGRlbHRhV0hDXzIwMTlfc2Qvbl9tZWFuLAogICAgICAgICBmcmVzaF9zZV8xMSA9IHdoY0ZyZXNoXzIwMTFfc2Qvbl9tZWFuLAogICAgICAgICBmcmVzaF9zZV8xOSA9IHdoY0ZyZXNoXzIwMTlfc2Qvbl9tZWFuKQoKIyBzd2l0Y2ggd2hjRnJlc2ggdG8gbG9uZwp3aGNGcmVzaC4yMDExIDwtIHdoY0ZyZXNoWyAsIGMoIklEIiwgIndoY0ZyZXNoXzIwMTEiLCAiZGVsdGFXSENfMjAxMSIpXQpuYW1lcyh3aGNGcmVzaC4yMDExKSA8LSBjKCJJRCIsICJ3aGNGcmVzaCIsICJkZWx0YVdIQyIpCndoY0ZyZXNoLjIwMTEkRXhwZXJpbWVudCA8LSAiYXJjIgp3aGNGcmVzaC4yMDE5IDwtIHdoY0ZyZXNoWyAsIGMoIklEIiwgIndoY0ZyZXNoXzIwMTkiLCAiZGVsdGFXSENfMjAxOSIpXQpuYW1lcyh3aGNGcmVzaC4yMDE5KSA8LSBjKCJJRCIsICJ3aGNGcmVzaCIsICJkZWx0YVdIQyIpCndoY0ZyZXNoLjIwMTkkRXhwZXJpbWVudCA8LSAicmV3ZXQiCndoY0ZyZXNoLjIwMTkgPC0gd2hjRnJlc2guMjAxOVt3aGljaChjb21wbGV0ZS5jYXNlcyh3aGNGcmVzaC4yMDE5KSksIF0Kd2hjRnJlc2gubG9uZyA8LSByYmluZCh3aGNGcmVzaC4yMDExLCB3aGNGcmVzaC4yMDE5KQoKIyBzdGF0cwp3aGMuY3RsLnRydCA8LSBtZXJnZShhcmMucmV3ZXQuMTRjLmN0bC50cnQsIHdoY0ZyZXNoLmxvbmcsIGJ5ID0gYygiSUQiLCAiRXhwZXJpbWVudCIpKQpnZ3Bsb3Qod2hjLmN0bC50cnQsIGFlcyh3aGNGcmVzaCwgZDE0Y19kaWYsIGNvbG9yID0gVHlwZSwgc2hhcGUgPSBFeHBlcmltZW50KSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKICBnZW9tX3BvaW50KHNpemUgPSAzKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAnRWNvc3lzdGVtJywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID1jKCdGJz0nI2EzNTUxMycsJ0cnPScjMTM2MWEzJyksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ0ZvcmVzdCcsJ0dyYXNzbGFuZCcpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKCiMgc3VtbWFyeShsbShkMTRjX2RpZiB+IHdoY0ZyZXNoICogVHlwZSwgd2hjLmN0bC50cnQpKQoKIyAjIGNhbGN1bGF0ZSBhdG0gMTRDIGNoYW5nZQojIHNsb3BlcyA8LSBkYXRhLmZyYW1lKERhdG1bRGF0bSREYXRlID4gMjAwMCAmIERhdG0kRGF0ZSA8IDIwMTYsIF0sCiMgICAgICAgICAgICAgICAgICAgICAgc2xvcGUgPSBOQSkKIyBmb3IoaSBpbiBzZXFfYWxvbmcoRGF0bVtEYXRtJERhdGUgPiAyMDAwICYgRGF0bSREYXRlIDwgMjAxNiwgIkRhdGUiXSkpIHsKIyAgIGlmKGkgIT0gbnJvdyhzbG9wZXMpKSB7CiMgICAgIHNsb3BlcyRzbG9wZVtpXSA8LSAoRGF0bVtEYXRtJERhdGUgPiAyMDAwLCAiTkhjMTQiXVtpKzFdLURhdG1bRGF0bSREYXRlID4gMjAwMCwgIk5IYzE0Il1baV0pLyhEYXRtW0RhdG0kRGF0ZSA+IDIwMDAsICJEYXRlIl1baSsxXS1EYXRtW0RhdG0kRGF0ZSA+IDIwMDAsICJEYXRlIl1baV0pCiMgICB9CiMgfQojIG1lYW4oc2xvcGVzJHNsb3BlLCBuYS5ybSA9IFQpCmBgYAo=