Notes

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

note that the text below was left because statistics were calculated on the fly

Experiment 1 (air-dry + storage treatment)

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 7.1 mg CO2 g soil C-1 d-1 after 0.7 d, followed by a sharp decline. Mean respiration rates in forest sites peaked at 1.5 mg CO2 g soil C-1 d-1 after 6.9 d, 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 4.8 d for grassland and forest soils, respectively.

Experiment 2 (air-dry treatment, 2019 samples)

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. 1).

Fig. 1. Respiration rates for Experiment 1 (air-dry + storage treatment, 2011) and Experiment 2 (air-dry only treatment, 2019)

Caption: Top panel shows data from samples collected in 2011 for Experiment 1 (air-dry + storage treatment), bottom panel shows data from samples collected in 2019 for Experiment 2 (air-dry only treatment). Vertical gray line at day 4 demarcates the end of the pre-incubation period and the start of the equilibrium respiration period. Points show measurements and lines show trends in mean respiration rate. Shaded ribbons represent one 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 headspace CO2 concentrations for Experiment 1 control samples were only measured once during the pre-incubation period (day 4) in contrast to daily measurements for all other samples. Consequently the respiration rate for those samples is the cumulative average rate over the first 4 d.

Experiment 3 (storage duration)

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.

Control-3 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.

Radiocarbon data

no non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Inf

Pre-incubation versus equilibrium respiration 14C-CO2

Fig. 2. \(\Delta\)14C-CO2 of the rewetting pulse and the equilibrium respiration period

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 rewetting pulse \(\Delta\)14C was not measured for control-1 samples; additionally samples from three of the forest plots of the air-dry + storage samples from Experiment 1 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).

Treatment effect on \(\Delta\)14C-CO2 for all samples (Experiments 1, 2, and 3)

no non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Inf

Fig. 3. Overall treatment effect on \(\Delta\)14C-CO2

Caption: Points show data from Experiments 1 and 3 (air-dry + storage treatment) and Experiment 2 (air-dry only treatment). Points are the mean of laboratory replicates (for replicated samples); error bars are 2x standard error. Solid line is 1:1. For context, the dashed and dotted lines show differences of ±20‰ and ±$40‰, equivalent to the decline in \(\Delta\)14C in atmospheric CO2 over 4 and 8 y respectively, during the period of 2000 to 2020 (Graven et al. 2017).

Storage duration effect on 14C-CO2 (Experiment 3)

Fig. 4. Change in 14C-CO2 in relation to storage duration

Caption: Data are from both Experiment 1 (in black) and Experiment 3 (all other points), averaged by site and ecosystem type. Points are the mean, error bars are 2x standard error. For context, the dashed and dotted lines are the same is in Fig. 4 and show a difference of 20‰ and 40‰, equivalent to the decline in \(\Delta\)14C in atmospheric CO2 over 4 and 8 y respectively, during the period of 2000 to 2020 (Graven et al. 2017). Position of points jittered to avoid overplotting; storage duration has been rounded down to the nearest whole year.

Fig 5. Time series of control and treatment \(\Delta\)14C-CO2 (Experiments 1 and 2) Caption: Filled circles show \(\Delta\)14C-CO2 observed for both control-1 and control-2 samples (2011 and 2019 points, respectively). 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. Points are means and error bars show the pooled standard deviation. The black line shows \(\Delta\)14C of the atmosphere.

Supplemental Fig 3. Time series of control and treatment \(\delta\)13C-CO2 (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 standard deviations.

Effect of cumulative respired carbon on 14C-CO2

Supplementary Fig. 4. Change in 14C-CO2 in relation to cumulative soil carbon respired

Caption: Note that pre-incubation \(\Delta\)14C was not measured for the control-1 samples in 2011. Limits exclude outlier point (HEW22 control-2, pre-incubation) for improved legibility. Points are means, error bars show min and max of duplicate samples.

Discussion

Fig 6a. Trajectories of \(\Delta\)14C over time in soil C and respired CO2 for a 2-pool model fit to the Hainich-Dün forest sites in relation to atmospheric \(\Delta\)14C

Caption: Modeled curves derived from a two-pool parallel model parameterized with data from Schrumpf et al. (2015): (kfast = 1/4) and a more slowly cycling pool (kslow = 1/115). Gold points show observed \(\Delta\)14C-CO2 from this study. Solid symbols show control samples, open symbols show treatment samples. 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 radiocarbon data is for the northern hemisphere (zone 2).

Fig 6b. Potential shifts in \(\Delta\)14C of respired CO2 in response to treatment

Caption: Zooming in on the study period, we can see that the treatment sample \(\Delta\)14C-CO2 shifts in the direction of the slowly cycling soil C pool (blue line), indicating increased contribution from this pool to respiration following air-drying and rewetting. Note that the increased contribution from the slow cycling pool leads to depletion in \(\Delta\)14C-CO2 relative to the controls in 2011, but enrichment in 2019 due to the crossing of the slow and fast cycling pool curves in 2016. Shaded ribbon around the respiration curve shows the model parameterized with the 75th quartile estimates for kfast (1/7) and kslow (1/200).

Change in soil moisture content with moisture adjustment

Supplemental Fig 5. Change in \(\Delta\)14C-CO2 (control - treatment) relative to field moisture

Caption: Data are from Experiment 1 (“arc”) and Experiment 2 (“rewet”). All samples were moisture-adjusted prior to incubation, but control samples were adjusted from field moisture, “whcFresh” (percent of WHC), whereas treatment samples were moisture adjusted after air-drying, i.e. at approximately 0% of WHC.

LS0tCnRpdGxlOiAiQXJjaGl2ZWQgU29pbCBJbmN1YmF0aW9ucyBNYW51c2NyaXB0IEZpZ3VyZXMiCmF1dGhvcjogIkouIEJlZW0tTWlsbGVyIgpkYXRlOiAiMDggT2N0IDIwMjAiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiAnMicKICBodG1sX25vdGVib29rOgogICAgY3NzOiAiY3VzdG9tLmNzcyIKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDIKICBwZGZfZG9jdW1lbnQ6CiAgICBsYXRleF9lbmdpbmU6IHhlbGF0ZXgKaGVhZGVyX2luY2x1ZGVzOgotIFx1c2VwYWNrYWdlW3V0Zjhde2lucHV0ZW5jfQotIFx1c2VwYWNrYWdle2Zsb2F0fQotLS0KYGBge3IgZ2xvYmFsX29wdGlvbnMsIGluY2x1ZGUgPSBGQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICBmaWcuYWxpZ24gPSAnY2VudGVyJywgZGV2ID0gYygnY2Fpcm9fcGRmJywgJ3BuZycpLCBmaWcud2lkdGggPSA2LjUpCmBgYAoKYGBge3Igc2V0dXAsIGluY2x1ZGUgPSBGQUxTRX0KbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHRpZHlyKQpsaWJyYXJ5KFNvaWxSKQpsaWJyYXJ5KGNvcnJwbG90KQpsaWJyYXJ5KG9wZW54bHN4KQpsaWJyYXJ5KElTUmFEKQpsaWJyYXJ5KHV0aWxpdGllcykKYGBgCiMjIE5vdGVzCiogVGhpcyB3b3JrYm9vayBpcyBpbnRlbmRlZCB0byBsb2FkIGFuZCBwcmVwYXJlIHRoZSBrZXkgZGF0YSBmb3IgYW5hbHlzaXMgZm9yIHRoZSBhcmNoaXZlIGluY3ViYXRpb24gcHJvamVjdC4KKiBUaGlzIGlzIGFuIHVwZGF0ZWQgdmVyc2lvbiBvZiBSTUQgZmlsZSAiLi9zcmMvYXJjX2luY19kYXRhLXdyYW5nbGluZ18yMDIwLTA0LTIwLlJtZCIgd2l0aCB0aGUgZXhwbGFuYXRvcnkgdGV4dCByZW1vdmVkCiogYWxsIGNvZGUgY2h1bmsgb3B0aW9ucyBhcmUgc2V0IHRvICJlY2hvID0gRkFMU0UiOyBzZWUgcmF3IC5SbWQgZmlsZSBmb3IgZGF0YSB3cmFuZ2xpbmcgY29kZS4KCiMgTWV0aG9kcyBhbmQgbWF0ZXJpYWxzCgoqUmFkaW9jYXJib24gY29ycmVjdGlvbnMqCgpBbHRob3VnaCBkaWZmZXJlbmNlcyB3ZXJlIHNtYWxsLCByYWRpb2NhcmJvbiBkYXRhIGZvciBhcmNoaXZlZCBzYW1wbGVzIHdlcmUgZmlyc3QgY29ycmVjdGVkIGZvciBkZWNheSBzaW5jZSB0aGUgeWVhciBvZiBjb2xsZWN0aW9uIGJlZm9yZSBhc3Nlc3NpbmcgdHJlYXRtZW50IGVmZmVjdHMuCgpEZWNheSBjb3JyZWN0aW9uIGZvcm11bGE6CiQkMTAwMCBcY2RvdCBcbGVmdCggKEZNIFxjZG90IGVee1xmcmFjey15ZWFyX3tzYW1wbGVkfSArIDE5NTB9ezgyNjd9fSkgLSAxIFxyaWdodCkkJAoKd2hlcmUgRk0gaXMgdGhlIGZyYWN0aW9uIG1vZGVybiwgYW5kIDgyNjcgaXMgdGhlIGludmVyc2Ugb2YgdGhlIHByb2R1Y3Qgb2YgdGhlIG5hdHVyYWwgbG9nIG9mIHR3byBhbmQgdGhlIHRydWUgaGFsZiBsaWZlIG9mIF4xNF5DICg1NzMwIHkpLgoKYGBge3IgMTRDIGhlbHBlciBmeHN9CiMgNS4gQ3JlYXRlIGhlbHBlciBmdW5jdGlvbnMKIyBkZWNheSBjb3JyZWN0aW9uIGZ1bmN0aW9uICAKZGVjYXkuY29yci5meCA8LSBmdW5jdGlvbih5ZWFyX3NhbXBsZWQsIGZyYWN0aW9uX21vZGVybikgewogIGlmZWxzZShpcy5uYShmcmFjdGlvbl9tb2Rlcm4pLCBOQSwgMTAwMCooKGZyYWN0aW9uX21vZGVybipleHAoKC15ZWFyX3NhbXBsZWQgKyAxOTUwKS84MjY3KSktMSkpCn0KCiMgZDE0QyB0byBmcmFjdGlvbiBtb2Rlcm4gZnVuY3Rpb24KZDE0Yy5mbS5meCA8LSBmdW5jdGlvbih5ZWFyX3NhbXBsZWQsIGQxNGMpIHsKICAoKGQxNGMgLyAxMDAwKSArIDEpIC8gZXhwKDAuMDAwMTIwOTcgKiAoMTk1MCAtIHllYXJfc2FtcGxlZCkpCiAgfQoKIyBkZWZpbmUgaGVscGVyIGZ1bmN0aW9uIGZvciBzdHJpcHBpbmcgb3V0ICJOQSIgYW5kIG5vbi1FeHBsb3JhdG9yaWVzIGRhdGEKZXh0cmEuY2xlYW4uZnggPC0gZnVuY3Rpb24oZGYpIHsKICBkZiA8LSBkZlt3aGljaChncmVwbCgiSEVHIiwgZGYkUHJvYmUpIHwKICAgICAgICAgICAgICAgICAgIGdyZXBsKCJIRVciLCBkZiRQcm9iZSkgfAogICAgICAgICAgICAgICAgICAgZ3JlcGwoIlNFRyIsIGRmJFByb2JlKSB8CiAgICAgICAgICAgICAgICAgICBncmVwbCgiU0VXIiwgZGYkUHJvYmUpKSwgXQogIGlmKGxlbmd0aChncmVwKCJFeHBlcmltZW50IiwgbmFtZXMoZGYpKSkgPiAwKSB7CiAgICAgZGYgPC0gZGZbd2hpY2goZGYkRXhwZXJpbWVudCAhPSAidG1lIiksIF0gCiAgfQogIGl4IDwtIHdoaWNoKGlzLm5hKGRmJEYxNEMpICYgaXMubmEoZGYkYFguMTRDLi4uLmApKQogIGlmKGxlbmd0aChpeCkgPiAxKSB7CiAgICBkZiA8LSBkZlstaXgsIF0KICB9CiAgcmV0dXJuKGRmKQp9CgojIGV4dHJhY3Qgc3RvcmFnZSBkdXJhdGlvbiBkYXRhIHNlcGFyYXRlbHkKdG1lLjE0Yy5meCA8LSBmdW5jdGlvbihkZikgewogIGRmJFNhbXBsZU5hbWUgPC0gZGYkUHJvYmUKICBkZiRQZXJpb2QgPC0gImluYyIKICBpZihsZW5ndGgoZ3JlcCgiRXhwZXJpbWVudCIsIG5hbWVzKGRmKSkpID4gMCkgewogICAgIGRmIDwtIGRmW3doaWNoKGRmJEV4cGVyaW1lbnQgPT0gInRtZSIpLCBdIAogIH0KICByZXR1cm4oZGYpCn0KYGBgCgpgYGB7ciByZWFkIHdpZGUgdHMgZGF0YX0KIyAxLiBMb2FkIGZsdXggZGF0YSBmcm9tIGFpci1kcnkgKyBzdG9yYWdlIChleHBlcmltZW50IDEpIGFuZCBzdG9yYWdlIGR1cmF0aW9uIChleHBlcmltZW50IDMpIGNvbnRyb2wgc2FtcGxlcywgYW5kIGNvbnZlcnQgZnJvbSAid2lkZSIgdG8gImxvbmciIGZvcm1hdCBzbyBhcyB0byBtYXRjaCBvdGhlciBkYXRhLiAKIyBSZWFkIGFpci1kcnkgKyBzdG9yYWdlIHJlc3BpcmF0aW9uIGNvbnRyb2wgZGF0YQphcmNoaXZlLmN0bC50cy53aWRlIDwtIHJlYWQuY3N2KCIuLi9kYXRhL2Rlcml2ZWQvYXJjLXN0b3JhZ2UtdDEtZmx1eC9hcmMtaW5jX3hwbHJfYXJjLXN0b3JhZ2UtdDEtZmx1eF8yMDIwLTA3LTAzLmNzdiIpCgojIENvbnZlcnQgdGltZSBkYXRhIGZyb20gd2lkZSB0byBsb25nCmFyY2hpdmUuY3RsLnRzLmQgPC0gc2VsZWN0KGFyY2hpdmUuY3RsLnRzLndpZGUsIHN0YXJ0c193aXRoKCJpbmNfdGltZV9kIikpICU+JQogIHBpdm90X2xvbmdlcihldmVyeXRoaW5nKCksCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gInRpbWVwb2ludF9jbXR2IiwKICAgICAgICAgICAgICAgbmFtZXNfcHJlZml4ID0gImluY190aW1lX2RfIiwKICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gInRpbWVfZCIpCiMgc29ydCBieSB0aW1lcG9pbnRfY210dgphcmNoaXZlLmN0bC50cy5kIDwtIGRhdGEuZnJhbWUoYXJjaGl2ZS5jdGwudHMuZFtvcmRlcihhcmNoaXZlLmN0bC50cy5kJHRpbWVwb2ludF9jbXR2KSxdKQoKIyBDb252ZXJ0IG1nQ08yIGRhdGEgZnJvbSB3aWRlIHRvIGxvbmcKYXJjaGl2ZS5jdGwudHMuY28yIDwtIHNlbGVjdChhcmNoaXZlLmN0bC50cy53aWRlLCBzdGFydHNfd2l0aCgiaW5jX21nQ08yX2phcl8iKSkgJT4lCiAgcGl2b3RfbG9uZ2VyKGV2ZXJ5dGhpbmcoKSwKICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAidGltZXBvaW50X2NtdHYiLAogICAgICAgICAgICAgICBuYW1lc19wcmVmaXggPSAiaW5jX21nQ08yX2phcl8iLAogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAibWdDTzJfamFyIikKIyBzb3J0IGJ5IHRpbWVwb2ludF9jbXR2CmFyY2hpdmUuY3RsLnRzLmNvMiA8LSBhcmNoaXZlLmN0bC50cy5jbzJbb3JkZXIoYXJjaGl2ZS5jdGwudHMuY28yJHRpbWVwb2ludF9jbXR2KSxdCgojIGFzc2VtYmxlIGluIGxvbmcgZGF0YWZyYW1lIAphcmNoaXZlLmN0bC50cyA8LSBkYXRhLmZyYW1lKElEID0gcmVwKHVuaXF1ZShhcmNoaXZlLmN0bC50cy53aWRlJElEKSwgNCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyaW9kID0gImluYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXBvaW50X2NtdHYgPSByZXAoc2VxKGZyb20gPSAyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gPSA1KSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFjaCA9IGxlbmd0aChhcmNoaXZlLmN0bC50cy53aWRlJElEKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZV9kID0gYXJjaGl2ZS5jdGwudHMuZCR0aW1lX2QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWdDTzJfamFyID0gYXJjaGl2ZS5jdGwudHMuY28yJG1nQ08yX2phcikKCiMgYWRkIHByZWluY3ViYXRpb24gZGF0YQphcmNoaXZlLmN0bC50cy5wcmUgPC0gYXJjaGl2ZS5jdGwudHMud2lkZVsxOmxlbmd0aCh1bmlxdWUoYXJjaGl2ZS5jdGwudHMud2lkZSRJRCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCJJRCIsICJwcmVpbmNfdGltZV9kIiwgInByZWluY19tZ0NPMl9qYXIiKV0KYXJjaGl2ZS5jdGwudHMucHJlIDwtIHJlbmFtZShhcmNoaXZlLmN0bC50cy5wcmUsIHRpbWVfZCA9IHByZWluY190aW1lX2QsIG1nQ08yX2phciA9IHByZWluY19tZ0NPMl9qYXIpCmFyY2hpdmUuY3RsLnRzLnByZSR0aW1lcG9pbnRfY210diA8LSAxCmFyY2hpdmUuY3RsLnRzLnByZSRQZXJpb2QgPC0gInByZSIKYXJjaGl2ZS5jdGwudHMucHJlJHRpbWVfZF9jbXR2IDwtIGFyY2hpdmUuY3RsLnRzLnByZSR0aW1lX2QKICAKIyBDYWxjdWxhdGUgdGltZV9kX2NtdHYKYXJjaGl2ZS5jdGwudHMgPC0gYmluZF9yb3dzKAogIGxhcHBseSgKICAgIHNwbGl0KGFyY2hpdmUuY3RsLnRzLCBhcmNoaXZlLmN0bC50cyR0aW1lcG9pbnRfY210diksCiAgICBmdW5jdGlvbih4KSB7CiAgICAgIHgkdGltZV9kX2NtdHYgPC0geCR0aW1lX2QgKyAKICAgICAgICBhcmNoaXZlLmN0bC50cy5wcmVbbWF0Y2goeCRJRCwgYXJjaGl2ZS5jdGwudHMucHJlJElEKSwgInRpbWVfZCJdCiAgICAgIHJldHVybih4KQogICAgfQogICAgKQogICkKCiMgcmJpbmQgcHJlaW5jIGFuZCBpbmMgZGF0YQphcmNoaXZlLmN0bC50cyA8LSByYmluZChhcmNoaXZlLmN0bC50cy5wcmUsIGFyY2hpdmUuY3RsLnRzKQoKIyBhZGQgU2FtcGxlTmFtZSBjb2x1bW4gYW5kIHJlc3RvcmUgRXhwZXJpbWVudCBjb2x1bW4KYXJjaGl2ZS5jdGwudHMkU2FtcGxlTmFtZSA8LSBhcmNoaXZlLmN0bC50cyRJRAphcmNoaXZlLmN0bC50cyRFeHBlcmltZW50IDwtIGFyY2hpdmUuY3RsLnRzLndpZGVbbWF0Y2goYXJjaGl2ZS5jdGwudHMkSUQsIGFyY2hpdmUuY3RsLnRzLndpZGUkSUQpLCAiRXhwZXJpbWVudCJdCgojIHJlbW92ZSBpbnRlcm1lZGlhdGUgZmlsZXMKcm0oYXJjaGl2ZS5jdGwudHMuZCwgYXJjaGl2ZS5jdGwudHMuY28yLCBhcmNoaXZlLmN0bC50cy5wcmUpCmBgYAoKYGBge3IgcmVhZC1sb25nLXRzLWRhdGF9CiMgMi4gTG9hZCBmbHV4IGRhdGEgZnJvbSBhaXItZHJ5ICsgc3RvcmFnZSBzYW1wbGVzIGFuZCBmcm9tIGFpci1kcnkgZXhwZXJpbWVudCAoY3RsICYgdHJlYXRtZW50KSwgQyAmIE4gZGF0YSBmb3IgYWxsIHRoZSBFeHBsb3JhdG9yaWVzIHNhbXBsZXMgKG1lYXN1cmVkIGluIDIwMTEpLCBhbmQgc29pbCBtYXNzIGFuZCBtb2lzdHVyZSBkYXRhIGZvciBhbGwgZXhwZXJpbWVudHMuCiMgUmVhZCBYcGxyIEMgYW5kIE4gZGF0YQp4cGxyLmNuIDwtIHJlYWQuY3N2KCIuLi9kYXRhL2V4dGVybmFsL2V4cGxvcmF0b3JpZXNfaXNjaG9lbmluZ19zb2lsY25fMjAxMS8xNzA0MDdfQ05fY29uY2VudHJhdGlvbnNfRXhwbG9yYXRvcmllc19FUF9QbG90c18yMDExLmNzdiIpCgojIFJlYWQgWHBsciAxNEMgZGF0YSBmb3IgY29udHJvbCBzYW1wbGVzICgidG1lIiBhbmQgImFyYyIgRXhwZXJpbWVudHMpCnhwbHIuY3RsLmlzbyA8LSByZWFkLnhsc3goIi4uL2RhdGEvZXh0ZXJuYWwvZXhwbG9yYXRvcmllc19pc2Nob2VuaW5nXzE0Yy1jbzJfMjAxMS8xNzAyMjhfMTRDX1Jlc3BpcmF0aW9uLnhsc3giKQoKIyBSZWFkIHNvaWwgbWFzcyBhbmQgbW9pc3R1cmUgaW5mbyBmb3IgYWlyLWRyeSArIHN0b3JhZ2UgdHJlYXRtZW50IHNhbXBsZXMKamFyaW5mby5hcmMgPC0gcmVhZC5jc3YoIi4uL2RhdGEvZGVyaXZlZC9hcmMtc3RvcmFnZS10Mi1qYXJJbmZvL2phcl9pbmZvcm1hdGlvbi5jc3YiKQoKIyBSZWFkIHNvaWwgbWFzcyBhbmQgbW9pc3R1cmUgaW5mbyBmb3IgYWlyLWRyeSBkYXRhCmphcmluZm8ucmV3ZXQgPC0gcmVhZC5jc3YoIi4uL2RhdGEvZGVyaXZlZC9haXItZHJ5LTIwMTktd2hjL2Fpci1kcnktMjAxOS13aGNfMjAyMC0wNy0wMy5jc3YiKQoKIyBSZWFkIHNvaWwgbWFzcyBhbmQgbW9pc3R1cmUgaW5mbyBmb3Igc3RvcmFnZSBkdXJhdGlvbiB0cmVhdG1lbnQgc2FtcGxlcwojIHJlbW92ZSB1bml0IHJvdyBhbmQgY29udmVydCB0byBhcHByb3ByaWF0ZSB0eXBlcwpqYXJpbmZvLnRtZSA8LSB0eXBlLmNvbnZlcnQocmVhZC54bHN4KCIuLi9kYXRhL3Jhdy9sYWJfamVuYV9yZXN1bHRzLWNvMl8yMDE4LTA3LTMwL0FyY0luY19JbmNEYXRhXzIwMTgueGxzeCIsIHNoZWV0ID0gMSlbLTEsIF0pCgojIFJlYWQgRHVrZSBpc28gYW5kIGZsdXggZGF0YQp0bWUuY3RsLmR1ayA8LSByZWFkLmNzdigiLi4vZGF0YS9kZXJpdmVkL2FyYy10bWUtZHVrZS9hcmMtdG1lLWR1a2VfMjAyMC0wNC0yOS5jc3YiKQoKIyBSZWFkIFNpZXJyYSBOZXZhZGEgKEp1bidzKSBzb2lsIGRhdGEKdG1lLmN0bC5zb2lsLnNyYSA8LSByZWFkLmNzdigiLi4vZGF0YS9kZXJpdmVkL2FyYy10bWUtc2llcnJhL2FyYy10bWUtc2llcnJhLXNvaWxfMjAyMC0wNC0yOS5jc3YiKQoKIyBSZWFkIE9hayBSaWRnZSBDIGRhdGEKdG1lLmN0bC5vcm5sIDwtIHJlYWQuY3N2KCIuLi9kYXRhL2Rlcml2ZWQvYXJjLXRtZS1vcm5sL2FyYy10bWUtb3JubF8yMDIwLTA0LTMwLmNzdiIpCgojIFJlYWQgYWlyLWRyeSArIHN0b3JhZ2UgcmVzcGlyYXRpb24gZGF0YQphcmNoaXZlLmFyYy50cyA8LSByZWFkLmNzdigiLi4vZGF0YS9kZXJpdmVkL2FyYy1zdG9yYWdlLXQyLWZsdXgvYXJjaGl2ZS1mbHV4LXQyXzIwMjAtMDQtMjQuY3N2IikKCiMgUmVhZCBjb250cm9sIHJlc3BpcmF0aW9uIGRhdGEgZnJvbSAyMDE5IGFpci1kcnkgZXhwZXJpbWVudApyZXdldC5jdGwudHMgPC0gcmVhZC5jc3YoIi4uL2RhdGEvZGVyaXZlZC9mcmVzaC0yMDE5LWZsdXgvZnJlc2gtMjAxOS1mbHV4XzIwMjAtMDQtMjQuY3N2IikKCiMgUmVhZCB0cmVhdG1lbnQgcmVzcGlyYXRpb24gZGF0YSBmcm9tIDIwMTkgYWlyLWRyeSBleHBlcmltZW50CnJld2V0LmRyeS50cyA8LSByZWFkLmNzdigiLi4vZGF0YS9kZXJpdmVkL2RyaWVkLTIwMTktZmx1eC9kcmllZC0yMDE5LWZsdXhfMjAyMC0wNC0yNC5jc3YiKQoKIyBSZWFkIFNpZXJyYSBOZXZhZGEgKEp1bidzKSBmbHV4IGRhdGEKdG1lLmN0bC5mbHguc3JhIDwtIHJlYWQuY3N2KCIuLi9kYXRhL2Rlcml2ZWQvYXJjLXRtZS1zaWVycmEvYXJjLXRtZS1zaWVycmEtZmx1eF8yMDIwLTA3LTMwLmNzdiIpCgojIFJlYWQgc3RvcmFnZSBkdXJhdGlvbiByZXNwaXJhdGlvbiBkYXRhCnRtZS50cnQudHMgPC0gcmJpbmQocmVhZC5jc3YoIi4uL2RhdGEvZGVyaXZlZC9hcmMtdG1lLXQyLWZsdXgvYXJjLXRtZS10Mi1mbHV4LTFfMjAyMC0wNC0yNy5jc3YiLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpLAogICAgICAgICAgICAgICAgICAgICAgICByZWFkLmNzdigiLi4vZGF0YS9kZXJpdmVkL2FyYy10bWUtdDItZmx1eC9hcmMtdG1lLXQyLWZsdXgtMl8yMDIwLTA0LTI3LmNzdiIsIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkpCgojIFJlYWQgbWlzY2VsbGFuZW91cyBzdG9yYWdlIHRyZWF0bWVudCBkYXRhCnRtZS5taXNjIDwtIHJlYWQuY3N2KCIuLi9kYXRhL2Rlcml2ZWQvYXJjLXRtZS1taXNjL2FyYy10bWUtbWlzYy1pc29fMjAyMC0wNC0yOS5jc3YiKQpzYXZlKHRtZS5taXNjLCBmaWxlID0gInRtZS5taXNjLlJEYXRhIikKYGBgCgpgYGB7ciBzdW1tYXJpemUgZGF0YSwgaW5jbHVkZSA9IEZBTFNFfQojIDMuIENvbWJpbmUgYW5kIHN1bW1hcml6ZSBkYXRhIGluIGxvbmcgZm9ybWF0IHRvIGNhbGN1bGF0ZSByZXNwaXJhdGlvbiByYXRlcyBhbmQgcGxvdCBvdmVyIHRpbWUKIyBOQjogc2V0ICJpbmNsdWRlIiB0byBmYWxzZSB0byBzdXBwcmVzcyBiaW5kX3Jvd3Mgd2FybmluZyBhYm91dCBjb2VyY2luZyBmYWN0b3IgdG8gY2hhcgojIHJlbW92ZSBmb3JtdWxhX2NoZWNrIGNvbHVtbnMKaW52aXNpYmxlKGxpc3QyZW52KGxhcHBseShsaXN0KGFyY2hpdmUuYXJjLnRzID0gYXJjaGl2ZS5hcmMudHMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV3ZXQuY3RsLnRzID0gcmV3ZXQuY3RsLnRzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJld2V0LmRyeS50cyA9IHJld2V0LmRyeS50cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtZS50cnQudHMgPSB0bWUudHJ0LnRzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbih4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4JGZvcm11bGFfY2hlY2sgPC0gTlVMTAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwKICAgICAgICAgICAgICAgICAgIGVudmlyID0gLkdsb2JhbEVudikKICAgICAgICAgICkKCiMgQWRkIFRyZWF0bWVudCBjb2x1bW5zIHRvIGVhY2ggZGF0YXNldAphcmNoaXZlLmFyYy50cyRUcmVhdG1lbnQgPC0gImFpci1kcnkgKyBzdG9yYWdlIgphcmNoaXZlLmN0bC50cyRUcmVhdG1lbnQgPC0gImNvbnRyb2wiCnRtZS50cnQudHMkVHJlYXRtZW50IDwtICJzdG9yYWdlIGR1cmF0aW9uIgpyZXdldC5jdGwudHMkVHJlYXRtZW50IDwtICJjb250cm9sIgpyZXdldC5kcnkudHMkVHJlYXRtZW50IDwtICJhaXItZHJ5IgoKIyBjb21iaW5lIHJld2V0IGRhdGEKcmV3ZXQudHMgPC0gcmJpbmQocmV3ZXQuY3RsLnRzLCByZXdldC5kcnkudHMpCnJld2V0LnRzJEV4cGVyaW1lbnQgPC0gInJld2V0IgoKIyBhZGQgc29pbCBkcnkgd3QgZGF0YQphcmNoaXZlLmFyYy50cyRkd19nIDwtIGphcmluZm8uYXJjW21hdGNoKGFyY2hpdmUuYXJjLnRzJFNhbXBsZU5hbWUsIGphcmluZm8uYXJjJFNhbXBsZSksICJTb2lsLmRyeS53ZWlnaHRfLmcuIl0KYXJjaGl2ZS5jdGwudHMkZHdfZyA8LSBhcmNoaXZlLmN0bC50cy53aWRlW21hdGNoKGFyY2hpdmUuY3RsLnRzJElELCBhcmNoaXZlLmN0bC50cy53aWRlJElEKSwgImRyeV9zb2lsX3d0X2NvcnJlY3RlZF9nIl0KcmV3ZXQudHMgPC0gbWVyZ2UocmV3ZXQudHMsIGphcmluZm8ucmV3ZXRbICwgYygiSUQiLCAiVHJlYXRtZW50IiwgImR3X2ciKV0sIGJ5ID0gYygiSUQiLCAiVHJlYXRtZW50IikpCnRtZS50cnQudHMgPC0gbWVyZ2UodG1lLnRydC50cywgamFyaW5mby50bWVbICwgYygiTnIuIiwgImRyeS5zb2lsIildLCBieS54ID0gIlNhbXBsZU5hbWUiLCBieS55ID0gIk5yLiIpCmNvbG5hbWVzKHRtZS50cnQudHMpW3doaWNoKG5hbWVzKHRtZS50cnQudHMpID09ICJkcnkuc29pbCIpXSA8LSAiZHdfZyIKCiMgYWRkIGV4cGVyaW1lbnQgY29sIHRvIGFyY2hpdmUuYXJjLnRzLCBzdG9yYWdlLnRydC50cwphcmNoaXZlLmFyYy50cyRFeHBlcmltZW50IDwtICJhcmMiCnRtZS50cnQudHMkRXhwZXJpbWVudCA8LSAidG1lIgoKIyBjb21iaW5lIGFyY2hpdmUgZGF0YSBhbmQgRXhwbG9yYXRvcmllcyBzdG9yYWdlIGR1cmF0aW9uIGRhdGEKYXJjaGl2ZS50cyA8LSByYmluZChhcmNoaXZlLmN0bC50c1t3aGljaChhcmNoaXZlLmN0bC50cyRFeHBlcmltZW50ICE9ICJ0bWUiKSwgXSwgCiAgICAgICAgICAgICAgICAgICAgYXJjaGl2ZS5hcmMudHNbICwgbmFtZXMoYXJjaGl2ZS5jdGwudHMpXSkKdG1lLnRzIDwtIHJiaW5kKGFyY2hpdmUuY3RsLnRzW3doaWNoKGFyY2hpdmUuY3RsLnRzJEV4cGVyaW1lbnQgPT0gInRtZSIpLCBdLAogICAgICAgICAgICAgICAgdG1lLnRydC50c1sgLCBuYW1lcyhhcmNoaXZlLmN0bC50cyldKQoKIyBiaW5kIHRtZS5jdGwuZmx4LnNyYSBkYXRhIHRvIHRtZS50cwojIGFsbCBvdGhlciB0bWUuZmx4IGRhdGEgaXMgYWxyZWFkeSBzdW1tYXJpemVkCnRtZS5jdGwuZmx4LnNyYSRFeHBlcmltZW50IDwtICJ0bWUiCnRtZS5jdGwuZmx4LnNyYSRUcmVhdG1lbnQgPC0gImNvbnRyb2wiCnRtZS5jdGwuZmx4LnNyYSRkd19nIDwtIHRtZS5jdGwuc29pbC5zcmFbbWF0Y2godG1lLmN0bC5mbHguc3JhJEphcl9JRCwgdG1lLmN0bC5zb2lsLnNyYSRKYXJfSUQpLCAiZHdfZyJdCnRtZS50cyA8LSByYmluZCh0bWUudHMsIHRtZS5jdGwuZmx4LnNyYVsgLCBuYW1lcyh0bWUudHMpXSkKCiMgVGVzdCB0aGF0IHJlcXVpcmVkIG5hbWVzIGFyZSBwcmVzZW50Cm5tcyA8LSBjKCJTYW1wbGVOYW1lIiwgIklEIiwgIkV4cGVyaW1lbnQiLCAiVHJlYXRtZW50IiwgIlBlcmlvZCIsICJ0aW1lcG9pbnRfY210diIsICAidGltZV9kIiwgInRpbWVfZF9jbXR2IiwgIm1nQ08yX2phciIsICJkd19nIikKaW52aXNpYmxlKGxhcHBseShsaXN0KGFyY2hpdmUudHMgPSBhcmNoaXZlLnRzLAogICAgICAgICAgICAgICAgICAgICAgcmV3ZXQudHMgPSByZXdldC50cywKICAgICAgICAgICAgICAgICAgICAgIHRtZS50cyksCiAgICAgICBmdW5jdGlvbih4KSB7CiAgICAgICAgIGlmZWxzZSghaXMubmEobWF0Y2gobm1zLCBuYW1lcyh4KSkpLCAieWVzIiwgIm5vIikKICAgICAgIH0KICAgICAgICkpCgojIGNvbWJpbmUgYWxsIGRhdGEgYW5kIHJlbW92ZSB0aW1lIHBvaW50cyB3aXRob3V0IENPMiBtZWFzdXJlbWVudHMKdHMgPC0gYmluZF9yb3dzKGFyY2hpdmUudHNbICwgbm1zXSwgcmV3ZXQudHNbICwgbm1zXSwgdG1lLnRzWyAsIG5tc10pCmlmKGxlbmd0aCh3aGljaChpcy5uYSh0cyRtZ0NPMl9qYXIpKSkgPiAwKSB7CiAgdHMgPC0gdHNbLXdoaWNoKGlzLm5hKHRzJG1nQ08yX2phcikpLCBdCn0KCiMgYWRkIEMgY29udGVudAojIHhwbHIKdHMkZ0NfZ1MgPC0geHBsci5jblttYXRjaCh0cyRJRCwgeHBsci5jbiRFUF9QbG90aWQpLCAiVG90YWxfQyJdKjEwXi0zCiMgZHVrZQp0c1t3aGljaChpcy5uYSh0cyRnQ19nUykpLCAiZ0NfZ1MiXSA8LSB0bWUuY3RsLmR1a1ttYXRjaCh0c1t3aGljaChpcy5uYSh0cyRnQ19nUykpLCAiSUQiXSwgdG1lLmN0bC5kdWskSUQpLCAiQ19nX2tnIl0qMTBeLTMKIyBzaWVycmFzCnRzW3doaWNoKGlzLm5hKHRzJGdDX2dTKSksICJnQ19nUyJdIDwtIHRtZS5jdGwuc29pbC5zcmFbbWF0Y2godHNbd2hpY2goaXMubmEodHMkZ0NfZ1MpKSwgIklEIl0sIHRtZS5jdGwuc29pbC5zcmEkSUQpLCAiZ0Nfa2dTIl0qMTBeLTMKIyBvYWsgcmlkZ2UKdHNbd2hpY2goaXMubmEodHMkZ0NfZ1MpKSwgImdDX2dTIl0gPC0gdG1lLmN0bC5vcm5sW21hdGNoKHRzW3doaWNoKGlzLm5hKHRzJGdDX2dTKSksICJJRCJdLCB0bWUuY3RsLm9ybmwkSUQpLCAiQ19nX2tnIl0gKiAxMF4tMwoKIyBhZGQgVHlwZQp0cyRUeXBlIDwtIGlmZWxzZShncmVwbCgiRyIsIHRzJElEKSwgIkciLCAiRiIpCgojIGNhbGN1bGF0ZSBDTzIgcmVzcGlyYXRpb24gaW4gbWdDTzItQyBwZXIgZyBzb2lsIEMKIyBOQjogMTIvNDQgPSBtYXNzIHJhdGlvIG9mIEMgaW4gQ08yCnRzJG1nQ08yLkNfZ0MgPC0gKHRzJG1nQ08yX2phciooMTIvNDQpKS8odHMkZHdfZyp0cyRnQ19nUykKdHMkbWdDTzIuQ19nQ19kIDwtIHRzJG1nQ08yLkNfZ0MvdHMkdGltZV9kCiMgc3VtbWFyaXplIENPMiByZWxlYXNlIGRhdGEgZm9yIGVhY2ggdGltZXBvaW50LCBieSBleHBlcmltZW50LCB0cmVhdG1lbnQsIGFuZCB0eXBlCnRzLmF2ZyA8LSBkYXRhLmZyYW1lKG5hLm9taXQodHMpICU+JQogIHNlbGVjdChFeHBlcmltZW50LCBUcmVhdG1lbnQsIFR5cGUsIHRpbWVwb2ludF9jbXR2LCBtZ0NPMi5DX2dDX2QsIHRpbWVfZF9jbXR2KSAgJT4lCiAgZ3JvdXBfYnkoRXhwZXJpbWVudCwgVHJlYXRtZW50LCBUeXBlLCB0aW1lcG9pbnRfY210dikgJT4lCiAgYWRkX3RhbGx5KCkgJT4lCiAgc3VtbWFyaXNlX2FsbChsaXN0KG1lYW4gPSBtZWFuLCBzZCA9IHNkKSwgbmEucm0gPSBUUlVFKSAlPiUKICBtdXRhdGUoc2Vfc2xvcGUgPSBtZ0NPMi5DX2dDX2Rfc2Qvc3FydChuX21lYW4pLAogICAgICAgICBzZV9zbG9wZV9sID0gbWdDTzIuQ19nQ19kX21lYW4gLSBzZV9zbG9wZSwKICAgICAgICAgc2Vfc2xvcGVfdSA9IG1nQ08yLkNfZ0NfZF9tZWFuICsgc2Vfc2xvcGUpKQojIGFkZCB0aW1lcG9pbnQgemVybyBkYXRhCnRwMC5mIDwtIGZ1bmN0aW9uKGRmKSB7CiAgdHAwIDwtIGRmWzEsIF0KICB0cDBbICwgLXdoaWNoKG5hbWVzKHRwMCkgPT0gIkV4cGVyaW1lbnQiIHwgbmFtZXModHAwKSA9PSAiVHJlYXRtZW50IiB8IG5hbWVzKHRwMCkgPT0gIlR5cGUiIHwgbmFtZXModHAwKSA9PSAibiIpXSA8LSAwCiAgcmJpbmQodHAwLCBkZikKfQp0cy5hdmckdHJlYXQuRXhwIDwtIHBhc3RlKHRzLmF2ZyRUcmVhdG1lbnQsIHRzLmF2ZyRFeHBlcmltZW50KQp0cy5hdmcgPC0gbGFwcGx5KHNwbGl0KHRzLmF2ZywgdHMuYXZnJHRyZWF0LkV4cCksIGZ1bmN0aW9uKHgpIHsKICBsYXBwbHkoc3BsaXQoeCwgeCRUeXBlKSwgdHAwLmYpCiAgfSkKdHMuYXZnIDwtIGJpbmRfcm93cyhsYXBwbHkodHMuYXZnLCBiaW5kX3Jvd3MpKQojIHJlc3RvcmUgY2xhc3Nlcwp0cy5hdmcgPC0gYXMuZGF0YS5mcmFtZShsYXBwbHkodHMuYXZnLCB0eXBlLmNvbnZlcnQpKQojIHNhdmUgb2JqZWN0CnNhdmUodHMuYXZnLCBmaWxlID0gIi4vdHMuYXZnLlJEYXRhIikKIyBhdmVyYWdlCnRzLnByZSA8LSB0c1t0cyRQZXJpb2QgPT0gInByZSIsIF0KdHMucHJlLmF2ZyA8LSB0cy5wcmUgJT4lCiAgZmlsdGVyKHRpbWVfZF9jbXR2ID4gMy41KSAlPiUKICBzZWxlY3QoRXhwZXJpbWVudCwgVHJlYXRtZW50LCBUeXBlLCB0aW1lcG9pbnRfY210diwgU2FtcGxlTmFtZSwgbWdDTzIuQ19nQywgdGltZV9kX2NtdHYpICAlPiUKICBncm91cF9ieShFeHBlcmltZW50LCBUcmVhdG1lbnQsIFR5cGUsIHRpbWVwb2ludF9jbXR2LCBTYW1wbGVOYW1lKSAlPiUKICBzdW1tYXJpc2VfYWxsKGxpc3QobWVhbiA9IG1lYW4pLCBuYS5ybSA9IFRSVUUpICU+JQogIG11dGF0ZShtZ0NPMi5DX2dDX2QgPSBtZ0NPMi5DX2dDX21lYW4vdGltZV9kX2NtdHZfbWVhbikgJT4lCiAgc2VsZWN0KC1TYW1wbGVOYW1lLCAtbWdDTzIuQ19nQ19tZWFuLCBFeHBlcmltZW50LCBUcmVhdG1lbnQsIFR5cGUsIG1nQ08yLkNfZ0NfZCwgdGltZV9kX2NtdHZfbWVhbikgJT4lCiAgZ3JvdXBfYnkoRXhwZXJpbWVudCwgVHJlYXRtZW50LCBUeXBlKSAlPiUKICBhZGRfdGFsbHkoKSAlPiUKICBzdW1tYXJpc2VfYWxsKGxpc3QobWVhbiA9IG1lYW4sIHNkID0gc2QpLCBuYS5ybSA9IFRSVUUpICU+JQogIG11dGF0ZShzZV9zbG9wZSA9IG1nQ08yLkNfZ0NfZF9zZC9zcXJ0KG5fbWVhbiksCiAgICAgICAgIHNlX3Nsb3BlX2wgPSBtZ0NPMi5DX2dDX2RfbWVhbiAtIHNlX3Nsb3BlLAogICAgICAgICBzZV9zbG9wZV91ID0gbWdDTzIuQ19nQ19kX21lYW4gKyBzZV9zbG9wZSkKdHMuaW5jLmF2ZyA8LSB0cyAlPiUKICBmaWx0ZXIoUGVyaW9kID09ICJpbmMiKSAlPiUKICBzZWxlY3QoRXhwZXJpbWVudCwgVHJlYXRtZW50LCBUeXBlLCB0aW1lcG9pbnRfY210diwgbWdDTzIuQ19nQ19kLCB0aW1lX2RfY210dikgICU+JQogIGdyb3VwX2J5KEV4cGVyaW1lbnQsIFRyZWF0bWVudCwgVHlwZSwgdGltZXBvaW50X2NtdHYpICU+JQogIGFkZF90YWxseSgpICU+JQogIHN1bW1hcmlzZV9hbGwobGlzdChtZWFuID0gbWVhbiwgc2QgPSBzZCksIG5hLnJtID0gVFJVRSkgJT4lCiAgbXV0YXRlKHNlX3Nsb3BlID0gbWdDTzIuQ19nQ19kX3NkL3NxcnQobl9tZWFuKSwKICAgICAgICAgc2Vfc2xvcGVfbCA9IG1nQ08yLkNfZ0NfZF9tZWFuIC0gc2Vfc2xvcGUsCiAgICAgICAgIHNlX3Nsb3BlX3UgPSBtZ0NPMi5DX2dDX2RfbWVhbiArIHNlX3Nsb3BlKQpjb2xuYW1lcyh0cy5wcmUuYXZnKVt3aGljaChuYW1lcyh0cy5wcmUuYXZnKSAlaW4lIGMoInRpbWVwb2ludF9jbXR2X21lYW4iLAogICAgICAgICAgICAgICAgICAgICAgICJ0aW1lX2RfY210dl9tZWFuX21lYW4iLAogICAgICAgICAgICAgICAgICAgICAgICJ0aW1lX2RfY210dl9tZWFuX3NkIikpXSA8LSBjKCJ0aW1lcG9pbnRfY210diIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGltZV9kX2NtdHZfbWVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGltZV9kX2NtdHZfc2QiKQoKdHMucHJlLmF2ZyA8LSB0cy5wcmUuYXZnWyAsIC13aGljaCghbmFtZXModHMucHJlLmF2ZykgJWluJSBuYW1lcyh0cy5pbmMuYXZnKSldCgp0cy5hdmcyIDwtIGRhdGEuZnJhbWUocmJpbmQodHMucHJlLmF2ZywgdHMuaW5jLmF2ZykpCnRzLmF2ZzIgPC0gdHMuYXZnMltjb21wbGV0ZS5jYXNlcyh0cy5hdmcyKSwgXQoKIyBhZGQgdGltZXBvaW50IHplcm8gZGF0YQp0cy5hdmcyJHRyZWF0LkV4cCA8LSBwYXN0ZSh0cy5hdmcyJFRyZWF0bWVudCwgdHMuYXZnMiRFeHBlcmltZW50KQp0cy5hdmcyIDwtIGxhcHBseShzcGxpdCh0cy5hdmcyLCB0cy5hdmcyJHRyZWF0LkV4cCksIGZ1bmN0aW9uKHgpIHsKICBsYXBwbHkoc3BsaXQoeCwgeCRUeXBlKSwgdHAwLmYpCiAgfSkKdHMuYXZnMiA8LSBiaW5kX3Jvd3MobGFwcGx5KHRzLmF2ZzIsIGJpbmRfcm93cykpCgojIHJlc3RvcmUgY2xhc3Nlcwp0cy5hdmcyIDwtIGFzLmRhdGEuZnJhbWUobGFwcGx5KHRzLmF2ZzIsIHR5cGUuY29udmVydCkpCnNhdmUodHMuYXZnMiwgZmlsZSA9ICIuL3RzLmF2ZzIuUmRhdGEiKQpgYGAKCiMgUmVzdWx0cwojIyBSZXNwaXJhdGlvbiByYXRlcwoKKm5vdGUgdGhhdCB0aGUgdGV4dCBiZWxvdyB3YXMgbGVmdCBiZWNhdXNlIHN0YXRpc3RpY3Mgd2VyZSBjYWxjdWxhdGVkIG9uIHRoZSBmbHkqCgpgYGB7ciByZXNwLXJhdGUtc3RhdHMsIGluY2x1ZGUgPSBGQUxTRX0KIyByZXdldCBtYXggcmVzcCByYXRlcwp0LnRlc3QoCiAgdGFwcGx5KHRzW3RzJEV4cGVyaW1lbnQgPT0gInJld2V0IiAmIHRzJFRyZWF0bWVudCA9PSAiYWlyLWRyeSIgJiB0cyRQZXJpb2QgPT0gInByZSIgJiB0cyRUeXBlID09ICJHIiwgIm1nQ08yLkNfZ0NfZCJdLCB0c1t0cyRFeHBlcmltZW50ID09ICJyZXdldCIgJiB0cyRUcmVhdG1lbnQgPT0gImFpci1kcnkiICYgdHMkUGVyaW9kID09ICJwcmUiICYgdHMkVHlwZSA9PSAiRyIsICJJRCJdLCBtYXgsIG5hLnJtID0gVFJVRSksCiAgdGFwcGx5KHRzW3RzJEV4cGVyaW1lbnQgPT0gInJld2V0IiAmIHRzJFRyZWF0bWVudCA9PSAiYWlyLWRyeSIgJiB0cyRQZXJpb2QgPT0gInByZSIgJiB0cyRUeXBlID09ICJGIiwgIm1nQ08yLkNfZ0NfZCJdLHRzW3RzJEV4cGVyaW1lbnQgPT0gInJld2V0IiAmIHRzJFRyZWF0bWVudCA9PSAiYWlyLWRyeSIgJiB0cyRQZXJpb2QgPT0gInByZSIgJiB0cyRUeXBlID09ICJGIiwgIklEIl0sIG1heCwgbmEucm0gPSBUUlVFKSkKIyMjIGN0bCB2cy4gdHJ0IHByZS1pbmMgcmVzcCBtYXgKIyMgRXhwLjEgCiMgRwp0LnRlc3QoCiAgdW5saXN0KAogICAgdHMgJT4lCiAgICAgIGZpbHRlcihFeHBlcmltZW50ID09ICJyZXdldCIgJiBUcmVhdG1lbnQgPT0gImFpci1kcnkiICYgUGVyaW9kID09ICJwcmUiICYgVHlwZSA9PSAiRyIpICU+JQogICAgICBncm91cF9ieShJRCkgJT4lCiAgICAgIHN1bW1hcml6ZShhY3Jvc3MobWdDTzIuQ19nQ19kLCBtYXgpKSAlPiUKICAgICAgc2VsZWN0KG1nQ08yLkNfZ0NfZCkpLAogIHVubGlzdCgKICAgIHRzICU+JQogICAgICBmaWx0ZXIoRXhwZXJpbWVudCA9PSAicmV3ZXQiICYgVHJlYXRtZW50ID09ICJjb250cm9sIiAmIFBlcmlvZCA9PSAicHJlIiAmIFR5cGUgPT0gIkciKSAlPiUKICAgICAgZ3JvdXBfYnkoSUQpICU+JQogICAgICBzdW1tYXJpemUoYWNyb3NzKG1nQ08yLkNfZ0NfZCwgbWF4KSkgJT4lCiAgICAgIHNlbGVjdChtZ0NPMi5DX2dDX2QpKSwKICBwYWlyZWQgPSBUUlVFKQojIEYKdC50ZXN0KAogIHVubGlzdCgKICAgIHRzICU+JQogICAgICBmaWx0ZXIoRXhwZXJpbWVudCA9PSAicmV3ZXQiICYgVHJlYXRtZW50ID09ICJhaXItZHJ5IiAmIFBlcmlvZCA9PSAicHJlIiAmIFR5cGUgPT0gIkYiKSAlPiUKICAgICAgZ3JvdXBfYnkoSUQpICU+JQogICAgICBzdW1tYXJpemUoYWNyb3NzKG1nQ08yLkNfZ0NfZCwgbWF4KSkgJT4lCiAgICAgIHNlbGVjdChtZ0NPMi5DX2dDX2QpKSwKICB1bmxpc3QoCiAgICB0cyAlPiUKICAgICAgZmlsdGVyKEV4cGVyaW1lbnQgPT0gInJld2V0IiAmIFRyZWF0bWVudCA9PSAiY29udHJvbCIgJiBQZXJpb2QgPT0gInByZSIgJiBUeXBlID09ICJGIikgJT4lCiAgICAgIGdyb3VwX2J5KElEKSAlPiUKICAgICAgc3VtbWFyaXplKGFjcm9zcyhtZ0NPMi5DX2dDX2QsIG1heCkpICU+JQogICAgICBzZWxlY3QobWdDTzIuQ19nQ19kKSksCiAgcGFpcmVkID0gVFJVRSkKIyMgRXhwLjIgCiMgRwp0LnRlc3QoCiAgdW5saXN0KAogICAgdHMgJT4lCiAgICAgIGZpbHRlcihFeHBlcmltZW50ID09ICJyZXdldCIgJiBUcmVhdG1lbnQgPT0gImFpci1kcnkiICYgUGVyaW9kID09ICJwcmUiICYgVHlwZSA9PSAiRyIpICU+JQogICAgICBncm91cF9ieShJRCkgJT4lCiAgICAgIHN1bW1hcml6ZShhY3Jvc3MobWdDTzIuQ19nQ19kLCBtYXgpKSAlPiUKICAgICAgc2VsZWN0KG1nQ08yLkNfZ0NfZCkpLAogIHVubGlzdCgKICAgIHRzICU+JQogICAgICBmaWx0ZXIoRXhwZXJpbWVudCA9PSAicmV3ZXQiICYgVHJlYXRtZW50ID09ICJjb250cm9sIiAmIFBlcmlvZCA9PSAicHJlIiAmIFR5cGUgPT0gIkciKSAlPiUKICAgICAgZ3JvdXBfYnkoSUQpICU+JQogICAgICBzdW1tYXJpemUoYWNyb3NzKG1nQ08yLkNfZ0NfZCwgbWF4KSkgJT4lCiAgICAgIHNlbGVjdChtZ0NPMi5DX2dDX2QpKSwKICBwYWlyZWQgPSBUUlVFKQojIEYKdC50ZXN0KAogIHVubGlzdCgKICAgIHRzICU+JQogICAgICBmaWx0ZXIoRXhwZXJpbWVudCA9PSAicmV3ZXQiICYgVHJlYXRtZW50ID09ICJhaXItZHJ5IiAmIFBlcmlvZCA9PSAicHJlIiAmIFR5cGUgPT0gIkYiKSAlPiUKICAgICAgZ3JvdXBfYnkoSUQpICU+JQogICAgICBzdW1tYXJpemUoYWNyb3NzKG1nQ08yLkNfZ0NfZCwgbWF4KSkgJT4lCiAgICAgIHNlbGVjdChtZ0NPMi5DX2dDX2QpKSwKICB1bmxpc3QoCiAgICB0cyAlPiUKICAgICAgZmlsdGVyKEV4cGVyaW1lbnQgPT0gInJld2V0IiAmIFRyZWF0bWVudCA9PSAiY29udHJvbCIgJiBQZXJpb2QgPT0gInByZSIgJiBUeXBlID09ICJGIikgJT4lCiAgICAgIGdyb3VwX2J5KElEKSAlPiUKICAgICAgc3VtbWFyaXplKGFjcm9zcyhtZ0NPMi5DX2dDX2QsIG1heCkpICU+JQogICAgICBzZWxlY3QobWdDTzIuQ19nQ19kKSksCiAgcGFpcmVkID0gVFJVRSkKIyMgCmBgYAoKKkV4cGVyaW1lbnQgMSAoYWlyLWRyeSArIHN0b3JhZ2UgdHJlYXRtZW50KSoKCkFtb25nIHRoZSBhaXItZHJ5ICsgc3RvcmFnZSBzYW1wbGVzLCByZXNwaXJhdGlvbiByYXRlcyB3ZXJlIG1vcmUgdGhhbiB0d2ljZSBhcyBoaWdoIGluIGdyYXNzbGFuZCBzb2lscyB0aGFuIGluIGZvcmVzdCBzb2lscywgcmVhY2hpbmcgYSBtYXhpbXVtIG9mIGByIHtyb3VuZChtYXgodHMuYXZnW3RzLmF2ZyRFeHBlcmltZW50ID09ICJhcmMiICYgdHMuYXZnJFRyZWF0bWVudCA9PSAiYWlyLWRyeSArIHN0b3JhZ2UiICYgdHMuYXZnJFR5cGUgPT0gIkciLCAibWdDTzIuQ19nQ19kX21lYW4iXSksMSl9YCBtZyBDT34yfiBnIHNvaWwgQ14tMV4gZF4tMV4gYWZ0ZXIgYHIge3JvdW5kKHRzLmF2Z1t3aGljaCh0cy5hdmckbWdDTzIuQ19nQ19kX21lYW4gPT0gbWF4KHRzLmF2Z1t0cy5hdmckRXhwZXJpbWVudCA9PSAiYXJjIiAmIHRzLmF2ZyRUcmVhdG1lbnQgPT0gImFpci1kcnkgKyBzdG9yYWdlIiAmIHRzLmF2ZyRUeXBlID09ICJHIiwgIm1nQ08yLkNfZ0NfZF9tZWFuIl0pKSwgInRpbWVfZF9jbXR2X21lYW4iXSwxKX1gIGQsIGZvbGxvd2VkIGJ5IGEgc2hhcnAgZGVjbGluZS4gTWVhbiByZXNwaXJhdGlvbiByYXRlcyBpbiBmb3Jlc3Qgc2l0ZXMgcGVha2VkIGF0IGByIHtyb3VuZChtYXgodHMuYXZnW3RzLmF2ZyRFeHBlcmltZW50ID09ICJhcmMiICYgdHMuYXZnJFRyZWF0bWVudCA9PSAiYWlyLWRyeSArIHN0b3JhZ2UiICYgdHMuYXZnJFR5cGUgPT0gIkYiLCAibWdDTzIuQ19nQ19kX21lYW4iXSksMSl9YCBtZyBDT34yfiBnIHNvaWwgQ14tMV4gZF4tMV4gYWZ0ZXIgYHIge3JvdW5kKHRzLmF2Z1t3aGljaCh0cy5hdmckbWdDTzIuQ19nQ19kX21lYW4gPT0gbWF4KHRzLmF2Z1t0cy5hdmckRXhwZXJpbWVudCA9PSAiYXJjIiAmIHRzLmF2ZyRUcmVhdG1lbnQgPT0gImFpci1kcnkgKyBzdG9yYWdlIiAmIHRzLmF2ZyRUeXBlID09ICJGIiwgIm1nQ08yLkNfZ0NfZF9tZWFuIl0pKSwgInRpbWVfZF9jbXR2X21lYW4iXSwxKX1gIGQsIGZvbGxvd2VkIGJ5IGEgbXVjaCBtb3JlIGdyYWR1YWwgZGVjbGluZSB0aGFuIGluIGdyYXNzbGFuZCBzaXRlcy4gQ29udHJvbCBzYW1wbGVzIHJlc3BvbmRlZCBtb3JlIHdlYWtseSBhbmQgbW9yZSBncmFkdWFsbHkgdG8gcmV3ZXR0aW5nLCBhbHRob3VnaCBhcyBpbiB0aGUgdHJlYXRtZW50IHNhbXBsZXMgcmVzcGlyYXRpb24gd2FzIGdyZWF0ZXIgaW4gZ3Jhc3NsYW5kIHNvaWxzIHRoYW4gaW4gZm9yZXN0IHNvaWxzLiBQZWFrIHJlc3BpcmF0aW9uIHJhdGVzIGZvciBjb250cm9sIGluY3ViYXRpb25zIHdlcmUgYHIge3JvdW5kKG1heCh0cy5hdmdbdHMuYXZnJEV4cGVyaW1lbnQgPT0gImFyYyIgJiB0cy5hdmckVHJlYXRtZW50ID09ICJjb250cm9sIiAmIHRzLmF2ZyRUeXBlID09ICJHIiwgIm1nQ08yLkNfZ0NfZF9tZWFuIl0pLDEpfWAgYW5kIGByIHtyb3VuZChtYXgodHMuYXZnW3RzLmF2ZyRFeHBlcmltZW50ID09ICJhcmMiICYgdHMuYXZnJFRyZWF0bWVudCA9PSAiY29udHJvbCIgJiB0cy5hdmckVHlwZSA9PSAiRiIsICJtZ0NPMi5DX2dDX2RfbWVhbiJdKSwxKX1gIG1nIENPfjJ+IGcgc29pbCBDXi0xXiBkXi0xXiBhZnRlciBgciB7cm91bmQodHMuYXZnW3doaWNoKHRzLmF2ZyRtZ0NPMi5DX2dDX2RfbWVhbiA9PSBtYXgodHMuYXZnW3RzLmF2ZyRFeHBlcmltZW50ID09ICJhcmMiICYgdHMuYXZnJFRyZWF0bWVudCA9PSAiY29udHJvbCIgJiB0cy5hdmckVHlwZSA9PSAiRiIsICJtZ0NPMi5DX2dDX2RfbWVhbiJdKSksICJ0aW1lX2RfY210dl9tZWFuIl0sMSl9YCBkIGZvciBncmFzc2xhbmQgYW5kIGZvcmVzdCBzb2lscywgcmVzcGVjdGl2ZWx5LgoKKkV4cGVyaW1lbnQgMiAoYWlyLWRyeSB0cmVhdG1lbnQsIDIwMTkgc2FtcGxlcykqCgpQZWFrIHJlc3BpcmF0aW9uIHJhdGVzIHdlcmUgbm90IHNpZ25pZmljYW50bHkgZGlmZmVyZW50IChwID4gMC4wNSkgYmV0d2VlbiBmb3Jlc3QgYW5kIGdyYXNzbGFuZCBzb2lscyBpbiBFeHBlcmltZW50IDIsIHBlYWtpbmcgYXQgYHIge3JvdW5kKG1heCh0cy5hdmcyW3RzLmF2ZzIkRXhwZXJpbWVudCA9PSAicmV3ZXQiICYgdHMuYXZnMiRUcmVhdG1lbnQgPT0gImFpci1kcnkiICYgdHMuYXZnMiRUeXBlID09ICJHIiwgIm1nQ08yLkNfZ0NfZF9tZWFuIl0pLDEpfWAuMCBhbmQgYHIge3JvdW5kKG1heCh0cy5hdmcyW3RzLmF2ZzIkRXhwZXJpbWVudCA9PSAicmV3ZXQiICYgdHMuYXZnMiRUcmVhdG1lbnQgPT0gImFpci1kcnkiICYgdHMuYXZnMiRUeXBlID09ICJGIiwgIm1nQ08yLkNfZ0NfZF9tZWFuIl0pLDEpfWAgbWcgQ09+Mn4gZyBzb2lsIENeLTFeIGReLTFeIGFmdGVyIGByIHtyb3VuZCh0cy5hdmcyW3doaWNoKHRzLmF2ZzIkbWdDTzIuQ19nQ19kX21lYW4gPT0gbWF4KHRzLmF2ZzJbdHMuYXZnMiRFeHBlcmltZW50ID09ICJyZXdldCIgJiB0cy5hdmcyJFRyZWF0bWVudCA9PSAiYWlyLWRyeSIgJiB0cy5hdmcyJFR5cGUgPT0gIkYiLCAibWdDTzIuQ19nQ19kX21lYW4iXSkpLCAidGltZV9kX2NtdHZfbWVhbiJdKjI0LDApfWAgaCBmb3IgZ3Jhc3NsYW5kIGFuZCBmb3Jlc3Qgc29pbHMsIHJlc3BlY3RpdmVseSAqKihGaWcuIDEpKiouCgpgYGB7ciBDTzItcmVzcC1yYXRlcywgZmlnLmhlaWdodD00fQojIHBsb3R0ZWQgYXMgbWVhc3VyZWQKdHMuYXZnICU+JQogIGZpbHRlcihFeHBlcmltZW50ICE9ICJ0bWUiKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHRpbWVfZF9jbXR2X21lYW4sIG1nQ08yLkNfZ0NfZF9tZWFuKSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDQsIGNvbG9yPSJncmF5IikgKwogIGdlb21fcmliYm9uKGFlcyh5bWluID0gc2Vfc2xvcGVfbCwgeW1heCA9IHNlX3Nsb3BlX3UsIGZpbGwgPSBUeXBlLCBsaW5ldHlwZSA9IFRyZWF0bWVudCwgYWxwaGEgPSBUcmVhdG1lbnQpLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBUeXBlLCBzaGFwZSA9IFRyZWF0bWVudCksIHNpemUgPSAyKSArCiAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IFR5cGUsIGxpbmV0eXBlID0gVHJlYXRtZW50KSkgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoRXhwZXJpbWVudCksCiAgICAgICAgICAgICBsYWJlbGxlciA9IGxhYmVsbGVyKEV4cGVyaW1lbnQgPSBjKCJhcmMiID0gIjIwMTEiLCAicmV3ZXQiID0gIjIwMTkiKSkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDE4KSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gJ0Vjb3N5c3RlbScsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9YygnRic9JyNhMzU1MTMnLCdHJz0nIzEzNjFhMycpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCdGb3Jlc3QnLCdHcmFzc2xhbmQnKSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKG5hbWUgPSAnU3RhbmRhcmQgZXJyb3InLAogICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9YygnRic9JyNhMzU1MTMnLCdHJz0nIzEzNjFhMycpLAogICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ0ZvcmVzdCcsJ0dyYXNzbGFuZCcpKSArCiAgc2NhbGVfYWxwaGFfbWFudWFsKG5hbWUgPSAnVHJlYXRtZW50JywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYWlyLWRyeSArIHN0b3JhZ2UiID0gLjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRyb2wiID0gLjQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpci1kcnkiID0gLjIpKSArCiAgc2NhbGVfbGluZXR5cGVfbWFudWFsKG5hbWUgPSAnVHJlYXRtZW50JywKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYWlyLWRyeSArIHN0b3JhZ2UiID0gJ2Rhc2hlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRyb2wiID0nc29saWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5IiA9ICJkb3R0ZWQiKSwKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiYWlyLWRyeSIgPSAiYWlyLWRyeS9yZXdldCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpci1kcnkgKyBzdG9yYWdlIiA9ICJhaXItZHJ5L3Jld2V0ICsgc3RvcmFnZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRyb2wiID0gImNvbnRyb2wtMSAoMjAxMSlcbmNvbnRyb2wtMiAoMjAxOSkiKSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gJ1RyZWF0bWVudCcsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFpci1kcnkgKyBzdG9yYWdlIiA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRyb2wiID0gMTYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpci1kcnkiID0gMSkpICsKICB5bGFiKGV4cHJlc3Npb24oJ1Jlc3BpcmF0aW9uIFJhdGUgKG1nQ08nWzJdKictQyBnQydeLTEqJ2QnXi0xKicpJykpICsKICB4bGFiKCJUaW1lIChkYXlzKSIpICsKICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQob3JkZXIgPSAxKSwKICAgICAgICAgc2hhcGUgPSBndWlkZV9sZWdlbmQob3JkZXIgPSAzKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAoKPioqRmlnLiBgciB7KGZpZy5uIDwtIDEpfWAuIFJlc3BpcmF0aW9uIHJhdGVzIGZvciBFeHBlcmltZW50IDEgKGFpci1kcnkgKyBzdG9yYWdlIHRyZWF0bWVudCwgMjAxMSkgYW5kIEV4cGVyaW1lbnQgMiAoYWlyLWRyeSBvbmx5IHRyZWF0bWVudCwgMjAxOSkqKgoKPipDYXB0aW9uOiogVG9wIHBhbmVsIHNob3dzIGRhdGEgZnJvbSBzYW1wbGVzIGNvbGxlY3RlZCBpbiAyMDExIGZvciBFeHBlcmltZW50IDEgKGFpci1kcnkgKyBzdG9yYWdlIHRyZWF0bWVudCksIGJvdHRvbSBwYW5lbCBzaG93cyBkYXRhIGZyb20gc2FtcGxlcyBjb2xsZWN0ZWQgaW4gMjAxOSBmb3IgRXhwZXJpbWVudCAyIChhaXItZHJ5IG9ubHkgdHJlYXRtZW50KS4gVmVydGljYWwgZ3JheSBsaW5lIGF0IGRheSA0IGRlbWFyY2F0ZXMgdGhlIGVuZCBvZiB0aGUgcHJlLWluY3ViYXRpb24gcGVyaW9kIGFuZCB0aGUgc3RhcnQgb2YgdGhlIGVxdWlsaWJyaXVtIHJlc3BpcmF0aW9uIHBlcmlvZC4gUG9pbnRzIHNob3cgbWVhc3VyZW1lbnRzIGFuZCBsaW5lcyBzaG93IHRyZW5kcyBpbiBtZWFuIHJlc3BpcmF0aW9uIHJhdGUuIFNoYWRlZCByaWJib25zIHJlcHJlc2VudCBvbmUgc3RhbmRhcmQgZXJyb3IuIFRoZSBmaW5hbCBtZWFzdXJlbWVudCBwb2ludHMgZm9yIGEgZmV3IHNhbXBsZXMgd2hpY2ggdG9vayA+MTggZGF5cyB0byByZWFjaCBDT34yfiB0YXJnZXRzIGFyZSBleGNsdWRlZCBmb3IgZGlzcGxheSByZWFzb25zOyByZXNwaXJhdGlvbiByYXRlcyBmb3IgdGhvc2Ugc2FtcGxlcyByZW1haW5lZCBmbGF0LiBOb3RlIHRoYXQgaGVhZHNwYWNlIENPfjJ+IGNvbmNlbnRyYXRpb25zIGZvciBFeHBlcmltZW50IDEgY29udHJvbCBzYW1wbGVzIHdlcmUgb25seSBtZWFzdXJlZCBvbmNlIGR1cmluZyB0aGUgcHJlLWluY3ViYXRpb24gcGVyaW9kIChkYXkgNCkgaW4gY29udHJhc3QgdG8gZGFpbHkgbWVhc3VyZW1lbnRzIGZvciBhbGwgb3RoZXIgc2FtcGxlcy4gQ29uc2VxdWVudGx5IHRoZSByZXNwaXJhdGlvbiByYXRlIGZvciB0aG9zZSBzYW1wbGVzIGlzIHRoZSBjdW11bGF0aXZlIGF2ZXJhZ2UgcmF0ZSBvdmVyIHRoZSBmaXJzdCA0IGQuCgoqRXhwZXJpbWVudCAzIChzdG9yYWdlIGR1cmF0aW9uKSoKCkdyYXNzbGFuZCBzb2lscyBmcm9tIHRoZSBzdG9yYWdlIGR1cmF0aW9uIHRyZWF0bWVudCBncm91cCByZXNwb25kZWQgcmFwaWRseSB0byByZXdldHRpbmcgYW5kIHJlYWNoZWQgdGFyZ2V0IENPfjJ+IGxldmVscyBhZnRlciBqdXN0IGByIHtyb3VuZCh0cy5hdmcyW3doaWNoKHRzLmF2ZzIkbWdDTzIuQ19nQ19kX21lYW4gPT0gbWF4KHRzLmF2ZzJbdHMuYXZnMiRFeHBlcmltZW50ID09ICJ0bWUiICYgdHMuYXZnMiRUcmVhdG1lbnQgPT0gInN0b3JhZ2UgZHVyYXRpb24iICYgdHMuYXZnMiRUeXBlID09ICJHIiwgIm1nQ08yLkNfZ0NfZF9tZWFuIl0pKSwgInRpbWVfZF9jbXR2X21lYW4iXSoyNCwwKX1gIGggb2YgaW5jdWJhdGlvbi4gT25seSBhIHNpbmdsZSBvYnNlcnZhdGlvbiB3YXMgbWFkZSBmb3IgdGhlIGdyYXNzbGFuZCB0cmVhbWVudCBzYW1wbGVzIGR1ZSB0byB0aGUgcmFwaWQgcmVzcGlyYXRpb24gcmF0ZXMsIHdoaWNoIHBlYWtlZCBhdCBgciB7cm91bmQobWF4KHRzLmF2ZzJbdHMuYXZnMiRFeHBlcmltZW50ID09ICJ0bWUiICYgdHMuYXZnMiRUcmVhdG1lbnQgPT0gInN0b3JhZ2UgZHVyYXRpb24iICYgdHMuYXZnMiRUeXBlID09ICJHIiwgIm1nQ08yLkNfZ0NfZF9tZWFuIl0pLDEpfWAgbWcgQ09+Mn4gZyBzb2lsIENeLTFeIGReLTFeLiBUaGUgbWVhbiBwZWFrIHJlc3BpcmF0aW9uIHJhdGUgZm9yIGZvcmVzdCB0cmVhdG1lbnQgc2FtcGxlcyB3YXMgbG93ZXIgYW5kIGxhZ2dlZCBpbiBjb21wYXJpc29uIHRvIHRoZSBncmFzc2xhbmQgc29pbHMsIHJlYWNoaW5nIGByIHtyb3VuZChtYXgodHMuYXZnMlt0cy5hdmcyJEV4cGVyaW1lbnQgPT0gInRtZSIgJiB0cy5hdmcyJFRyZWF0bWVudCA9PSAic3RvcmFnZSBkdXJhdGlvbiIgJiB0cy5hdmcyJFR5cGUgPT0gIkYiLCAibWdDTzIuQ19nQ19kX21lYW4iXSksMSl9YCBtZyBDT34yfiBnIHNvaWwgQ14tMV4gZF4tMV4gYWZ0ZXIgYHIge3JvdW5kKHRzLmF2ZzJbd2hpY2godHMuYXZnMiRtZ0NPMi5DX2dDX2RfbWVhbiA9PSBtYXgodHMuYXZnMlt0cy5hdmcyJEV4cGVyaW1lbnQgPT0gInRtZSIgJiB0cy5hdmcyJFRyZWF0bWVudCA9PSAic3RvcmFnZSBkdXJhdGlvbiIgJiB0cy5hdmcyJFR5cGUgPT0gIkYiLCAibWdDTzIuQ19nQ19kX21lYW4iXSkpLCAidGltZV9kX2NtdHZfbWVhbiJdKjI0LDApfWAgaC4KCkNvbnRyb2wtMyByZXNwaXJhdGlvbiByYXRlcyBwZWFrZWQgYWZ0ZXIgdGhlIHByZS1pbmN1YmF0aW9uIHBlcmlvZCAoYHIge3JvdW5kKHRzLmF2ZzJbd2hpY2godHMuYXZnMiRtZ0NPMi5DX2dDX2RfbWVhbiA9PSBtYXgodHMuYXZnMlt0cy5hdmcyJEV4cGVyaW1lbnQgPT0gInRtZSIgJiB0cy5hdmcyJFRyZWF0bWVudCA9PSAiY29udHJvbCIgJiB0cy5hdmcyJFR5cGUgPT0gIkciLCAibWdDTzIuQ19nQ19kX21lYW4iXSkpLCAidGltZV9kX2NtdHZfbWVhbiJdKjI0LDApfWAgaCksIGF0IGByIHtyb3VuZChtYXgodHMuYXZnMlt0cy5hdmcyJEV4cGVyaW1lbnQgPT0gInRtZSIgJiB0cy5hdmcyJFRyZWF0bWVudCA9PSAiY29udHJvbCIgJiB0cy5hdmcyJFR5cGUgPT0gIkciLCAibWdDTzIuQ19nQ19kX21lYW4iXSksMSl9YCBtZyBDT34yfiBnIHNvaWwgQ14tMV4gZF4tMV4uIEZvcmVzdCBjb250cm9sIHNhbXBsZXMgd2VyZSBwcmUtaW5jdWJhdGVkIHVuZGVyIHZhcmlvdXMgY29uZGl0aW9ucywgYnV0IHJlc3BpcmF0aW9uIHJhdGVzIHdlcmUgb25seSBtZWFzdXJlZCBkdXJpbmcgdGhlIHByZS1pbmN1YmF0aW9uIHBlcmlvZCBmb3IgdHdvIHNhbXBsZXMgZnJvbSB0aGUgU2llcnJhIE5ldmFkYSBtb3VudGFpbnMgKFVTQSkuIEluIGdlbmVyYWwsIHJlc3BpcmF0aW9uIHJhdGVzIGZvciBmb3Jlc3QgY29udHJvbCBzYW1wbGVzIGluIEV4cGVyaW1lbnQgMyB3ZXJlIG11Y2ggbG93ZXIgdGhhbiBpbiB0aGUgdHJlYXRtZW50IGluY3ViYXRpb25zLCBwZWFraW5nIGF0IGByIHtyb3VuZChtYXgodHMuYXZnMlt0cy5hdmcyJEV4cGVyaW1lbnQgPT0gInRtZSIgJiB0cy5hdmcyJFRyZWF0bWVudCA9PSAiY29udHJvbCIgJiB0cy5hdmcyJFR5cGUgPT0gIkYiLCAibWdDTzIuQ19nQ19kX21lYW4iXSksMSl9YCBtZyBDT34yfiBnIHNvaWwgQ14tMV4gZF4tMV4gYWZ0ZXIgYHIge3JvdW5kKHRzLmF2ZzJbd2hpY2godHMuYXZnMiRtZ0NPMi5DX2dDX2RfbWVhbiA9PSBtYXgodHMuYXZnMlt0cy5hdmcyJEV4cGVyaW1lbnQgPT0gInRtZSIgJiB0cy5hdmcyJFRyZWF0bWVudCA9PSAiY29udHJvbCIgJiB0cy5hdmcyJFR5cGUgPT0gIkYiLCAibWdDTzIuQ19nQ19kX21lYW4iXSkpLCAidGltZV9kX2NtdHZfbWVhbiJdKjI0LDApfWAgaC4KCiMjIFJhZGlvY2FyYm9uIGRhdGEKCmBgYHtyIGxvYWQgYW1zLWplbmEtaW5nZXN0IGZ4fQojIDEuIFJlYWQgaW4gaXNvdG9wZSBkYXRhIGZyb20gdmFyaW91cyBzb3VyY2VzCiMgRmlyc3QgbG9hZCBoZWxwZXIgZnVuY3Rpb25zICdyZWFkX2plbmFfYW1zX3Jlc3VsdHMuUicsICdyZWFkX2plbmFfaXNvX3Jlc3VsdHMuUicgCnNvdXJjZSgiLi91dGlsaXRpZXMvamVuYV9hbXNfaW5nZXN0LlIiKQpzb3VyY2UoIi4vdXRpbGl0aWVzL2plbmFfaXNvX2luZ2VzdC5SIikKYGBgCgpgYGB7ciByZWFkIGlzbyBkYXRhLCBpbmNsdWRlID0gRkFMU0V9CiMgMi4gTmV4dCByZWFkIGluIGRhdGEgZnJvbSB0aGUgYXBwcm9wcmlhdGUgZGlyZWN0b3JpZXMgaW4gJ2RhdGEvcmF3JwojIDE0QwojIGlkZW50aWZ5IHN1YmRpcmVjdG9yaWVzIGluICdyYXcnIGRpcmVjdG9yeSB3aXRoICJhbXNfamVuYSIgaW4gbmFtZQphbXNfamVuYV9yZXN1bHRzX2RpcnMgPC0gbGlzdC5maWxlcygiLi4vZGF0YS9yYXciLCBwYXR0ZXJuID0gImFtc19qZW5hX3Jlc3VsdHMiLCBmdWxsLm5hbWVzID0gVFJVRSkKYW1zX3Jlc3VsdHNfbHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhhbXNfamVuYV9yZXN1bHRzX2RpcnMpLCBmdW5jdGlvbihpKSB7CiAgcmVhZF9qZW5hX2Ftc19yZXN1bHRzKGFtc19qZW5hX3Jlc3VsdHNfZGlyc1tpXSkKfSkKbmFtZXMoYW1zX3Jlc3VsdHNfbHMpIDwtIGxpc3QuZmlsZXMoIi4uL2RhdGEvcmF3IiwgcGF0dGVybiA9ICJhbXNfamVuYV9yZXN1bHRzIikKCiMgMTNDCiMgaWRlbnRpZnkgc3ViZGlyZWN0b3JpZXMgaW4gJ3JhdycgZGlyZWN0b3J5IHdpdGggImlzb19qZW5hIiBpbiBuYW1lCmlzb19qZW5hX3Jlc3VsdHNfZGlycyA8LSBsaXN0LmZpbGVzKCIuLi9kYXRhL3JhdyIsIHBhdHRlcm4gPSAiaXNvX2plbmFfcmVzdWx0cyIsIGZ1bGwubmFtZXMgPSBUUlVFKQppc29fcmVzdWx0c19scyA8LSBsYXBwbHkoc2VxX2Fsb25nKGlzb19qZW5hX3Jlc3VsdHNfZGlycyksIGZ1bmN0aW9uKGkpIHsKICByZWFkX2plbmFfaXNvX3Jlc3VsdHMoaXNvX2plbmFfcmVzdWx0c19kaXJzW2ldKQp9KQpuYW1lcyhpc29fcmVzdWx0c19scykgPC0gbGlzdC5maWxlcygiLi4vZGF0YS9yYXciLCBwYXR0ZXJuID0gImlzb19qZW5hX3Jlc3VsdHMiKQpgYGAKCmBgYHtyIGFyYyBhbmQgcmV3ZXQgZXhwZXJpbWVudCB0ZW1wbGF0ZX0KIyAzLiBDcmVhdGUgYSAidGlkeSIgc3R5bGUgdGVtcGxhdGUgZm9yIHRoZSBkYXRhLCBpLmUuIHZhcmlhYmxlcyBpbiBjb2x1bW5zLiAKIyBLZXkgdmFyaWFibGVzIGFyZSBhcyBmb2xsb3dzOgojICAgKiBTYW1wbGVOYW1lIChpbmNvcnBvcmF0ZXMgbGFiIHJlcCBhbmQgdHJlYXRtZW50LCBlLmcuICJIRUcxMC0xX2RyeSIpCiMgICAqIElEIChwbG90IElEcywgZS5nLiBmb3IgIkhFRzEwIiBmb3IgRXhwbG9yYXRvcnkgc2FtcGxlcykKIyAgICogVHJlYXRtZW50ICgzIHRyZWF0bWVudHM6IGFpci1kcnksIGFpci1kcnkgKyBzdG9yYWdlLCBzdG9yYWdlIGR1cmF0aW9uOyArIGNvbnRyb2xzKQojICAgKiBUeXBlICgyIGxldmVsczogRiA9IGZvcmVzdCwgRyA9IGdyYXNzbGFuZCkKIyAgICogUGVyaW9kIChpbmN1YmF0aW9uIHBlcmlvZCwgMiBsZXZlbHM6IHByZSA9IHByZWluY3ViYXRpb24sIGluYyA9IGVxdWlsaWJyaXVtIGluY3ViYXRpb24pCiMgICAqIEV4cGVyaW1lbnQgKDMgbGV2ZWxzOiBhcmMgPSBhaXItZHJ5ICsgc3RvcmFnZSwgcmV3ZXQgPSBhaXItZHJ5L3Jld2V0LCB0aW1lID0gc3RvcmFnZSBkdXJhdGlvbikKIyAKIyAqIE9ic2VydmF0aW9uYWwgY29sdW1ucyBpbmNsdWRlOgojICAgKiBkMTRjICgkXERlbHRhJF4xNF5DLUNPfjJ+KQojICAgKiBkMTNjICgkXGRlbHRhJF4xM15DLUNPfjJ+KQojICAgKiBDX2dfa2cgKEMgY29udGVudCkKIyAgICogZHdfZyAoZHJ5IHdlaWdodCkKIyAgICogbWdDTzIuQ19nUyAobWcgQ09+Mn4tQyByZXNwaXJlZCBnXi0xXiBzb2lsIFBlcmlvZF4tMV4pCiMgICAqIHRpbWVfZCAoZGF5cyBpbiBpbmN1YmF0aW9uIHBlcmlvZCBwcmlvciB0byBtZWFzdXJlbWVudCkKIyAgICogZEgyT19ncmF2IChwZXJjZW50IGNoYW5nZSBpbiBncmF2aW1ldHJpYyB3YXRlciBjb250ZW50IGR1ZSB0byBsYWJvcmF0b3J5IG1vaXN0dXJlIGFkanVzdG1lbnQpCiMgICAqIGRIMk9fd2hjIChwZXJjZW50IGNoYW5nZSBpbiB3YXRlciBob2xkaW5nIGNhcGFjaXR5IGR1ZSB0byBsYWJvcmF0b3J5IG1vaXN0dXJlIGFkanVzdG1lbnQpCnVuaXF1ZS5pZC5uIDwtIGMobGVuZ3RoKHVuaXF1ZShhcmNoaXZlLnRzW2FyY2hpdmUudHMkVHJlYXRtZW50ID09ICJjb250cm9sIiwgIlNhbXBsZU5hbWUiXSkpLAogICAgICAgICAgICAgICAgIGxlbmd0aCh1bmlxdWUoYXJjaGl2ZS50c1thcmNoaXZlLnRzJFRyZWF0bWVudCA9PSAiYWlyLWRyeSArIHN0b3JhZ2UiLCAiU2FtcGxlTmFtZSJdKSksCiAgICAgICAgICAgICAgICAgbGVuZ3RoKHVuaXF1ZShyZXdldC5jdGwudHMkU2FtcGxlTmFtZSkpLAogICAgICAgICAgICAgICAgIGxlbmd0aCh1bmlxdWUocmV3ZXQuZHJ5LnRzJFNhbXBsZU5hbWUpKSkKcHJlLjE0YyA8LSBkYXRhLmZyYW1lKFNhbXBsZU5hbWUgPSBjKGFzLmNoYXJhY3Rlcih1bmlxdWUoYXJjaGl2ZS50c1thcmNoaXZlLnRzJFRyZWF0bWVudCA9PSAiY29udHJvbCIsICJTYW1wbGVOYW1lIl0pKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLmNoYXJhY3Rlcih1bmlxdWUoYXJjaGl2ZS50c1thcmNoaXZlLnRzJFRyZWF0bWVudCA9PSAiYWlyLWRyeSArIHN0b3JhZ2UiLCAiU2FtcGxlTmFtZSJdKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcy5jaGFyYWN0ZXIodW5pcXVlKHJld2V0LmN0bC50cyRTYW1wbGVOYW1lKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcy5jaGFyYWN0ZXIodW5pcXVlKHJld2V0LmRyeS50cyRTYW1wbGVOYW1lKSkpKQpwcmUuMTRjJElEIDwtIHN1YnN0cihwcmUuMTRjJFNhbXBsZU5hbWUsIDEsIDUpCnByZS4xNGMkVHlwZSA8LSBpZmVsc2UoZ3JlcGwoIkciLCBwcmUuMTRjJElEKSwgIkciLCAiRiIpCnByZS4xNGMkRXhwZXJpbWVudCA8LSBjKHJlcCgiYXJjIiwgdW5pcXVlLmlkLm5bMV0gKyB1bmlxdWUuaWQublsyXSksCiAgICAgICAgICAgICAgICAgICAgICAgcmVwKCJyZXdldCIsIHVuaXF1ZS5pZC5uWzNdICsgdW5pcXVlLmlkLm5bNF0pKQpwcmUuMTRjJFRyZWF0bWVudCA8LSBjKHJlcCgiY29udHJvbCIsIHVuaXF1ZS5pZC5uWzFdKSwKICAgICAgICAgICAgICAgICAgICAgICByZXAoImFpci1kcnkgKyBzdG9yYWdlIiwgdW5pcXVlLmlkLm5bMl0pLAogICAgICAgICAgICAgICAgICAgICAgIHJlcCgiY29udHJvbCIsIHVuaXF1ZS5pZC5uWzNdKSwKICAgICAgICAgICAgICAgICAgICAgICByZXAoImFpci1kcnkiLCB1bmlxdWUuaWQubls0XSkpCnByZS4xNGMkUGVyaW9kIDwtICJwcmUiCgojIGNyZWF0ZSBpbmMgcGVyaW9kIGRmIGFzIGR1cGxpY2F0ZSBvZiBwcmUtaW5jIGRmLCBidXQgdGVzdCB0aGF0IGl0IGlzIHRoZSByaWdodCBzaGFwZSBmaXJzdAppZihucm93KHByZS4xNGMpID09IHN1bSh1bmlxdWUuaWQubikgJiBuY29sKHByZS4xNGMpID09IDYpIHsKICBpbmMuMTRjIDwtIHByZS4xNGMKICBpbmMuMTRjJFBlcmlvZCA8LSAiaW5jIgp9IGVsc2UgewogICJwcmUuMTRjIGRhdGEgZnJhbWUgbWFsZm9ybWVkIgp9CmFsbC4xNGMudGVtcGxhdGUgPC0gcmJpbmQocHJlLjE0YywgaW5jLjE0YykKYGBgCgpgYGB7ciB0bWUgZXhwZXJpbWVudCB0ZW1wbGF0ZX0KdW5pcXVlLmlkLnRtZS5uIDwtIGMobGVuZ3RoKHVuaXF1ZSh0bWUuY3RsLmR1ayRTYW1wbGVOYW1lKSksCiAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCh1bmlxdWUodG1lLmN0bC5vcm5sJFNhbXBsZU5hbWUpKSwKICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKHVuaXF1ZSh0bWUuY3RsLmZseC5zcmEkU2FtcGxlTmFtZSkpLAogICAgICAgICAgICAgICAgICAgICBsZW5ndGgodW5pcXVlKHRtZS5taXNjJFNhbXBsZU5hbWUpKSwKICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKHVuaXF1ZShhcmNoaXZlLmN0bC50cy53aWRlW2FyY2hpdmUuY3RsLnRzLndpZGUkRXhwZXJpbWVudCA9PSAidG1lIiwgIklEIl0pKSwKICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKHVuaXF1ZSh0bWUudHJ0LnRzJFNhbXBsZU5hbWUpKSkKcHJlLnRtZS5jdGwgPC0gZGF0YS5mcmFtZShTYW1wbGVOYW1lID0gYyhhcy5jaGFyYWN0ZXIodW5pcXVlKHRtZS5jdGwuZHVrJFNhbXBsZU5hbWUpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcy5jaGFyYWN0ZXIodW5pcXVlKHRtZS5jdGwub3JubCRTYW1wbGVOYW1lKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMuY2hhcmFjdGVyKHVuaXF1ZSh0bWUuY3RsLmZseC5zcmEkU2FtcGxlTmFtZSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLmNoYXJhY3Rlcih1bmlxdWUodG1lLm1pc2MkU2FtcGxlTmFtZSkpLCAgIGFzLmNoYXJhY3Rlcih1bmlxdWUoYXJjaGl2ZS5jdGwudHMud2lkZVthcmNoaXZlLmN0bC50cy53aWRlJEV4cGVyaW1lbnQgPT0gInRtZSIsICJJRCJdKSkpKQpwcmUudG1lLmN0bCRTaXRlIDwtIGMocmVwKCJEdWtlIiwgdW5pcXVlLmlkLnRtZS5uWzFdKSwKICAgICAgICAgICAgICAgICAgICAgIHJlcCgiT1JOTCIsIHVuaXF1ZS5pZC50bWUublsyXSksCiAgICAgICAgICAgICAgICAgICAgICByZXAoIlNpZXJyYSIsIHVuaXF1ZS5pZC50bWUublszXSksCiAgICAgICAgICAgICAgICAgICAgICByZXAoIm1pc2MiLCB1bmlxdWUuaWQudG1lLm5bNF0pLAogICAgICAgICAgICAgICAgICAgICAgcmVwKCJIYWluaWNoIiwgdW5pcXVlLmlkLnRtZS5uWzVdKSkKCgojIER1a2UsIE9STkwsIG1pc2MsIGFuZCBYcGxyIElEcwpwcmUudG1lLmN0bFtwcmUudG1lLmN0bCRTaXRlID09ICJEdWtlIiB8IAogICAgICAgICAgICBwcmUudG1lLmN0bCRTaXRlID09ICJPUk5MIiB8CiAgICAgICAgICAgIHByZS50bWUuY3RsJFNpdGUgPT0gIm1pc2MiIHwKICAgICAgICAgICAgcHJlLnRtZS5jdGwkU2l0ZSA9PSAiSGFpbmljaCIsICJJRCJdIDwtIGFzLmNoYXJhY3RlcihwcmUudG1lLmN0bFtwcmUudG1lLmN0bCRTaXRlID09ICJEdWtlIiB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmUudG1lLmN0bCRTaXRlID09ICJPUk5MIiB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmUudG1lLmN0bCRTaXRlID09ICJtaXNjIiB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmUudG1lLmN0bCRTaXRlID09ICJIYWluaWNoIiwgIlNhbXBsZU5hbWUiXSkKCiMgU2llcnJhIElEcwpwcmUudG1lLmN0bFtwcmUudG1lLmN0bCRTaXRlID09ICJTaWVycmEiLCAiSUQiXSA8LQogIHN1YnN0cihwcmUudG1lLmN0bFtwcmUudG1lLmN0bCRTaXRlID09ICJTaWVycmEiLCAiU2FtcGxlTmFtZSJdLCAxMCwgMTEpCgojIHN1YmRpdmlkZSBPUk5MIGludG8gV0IgYW5kIFRWQQpwcmUudG1lLmN0bFtwcmUudG1lLmN0bCRTaXRlID09ICJPUk5MIiwgIlNpdGUiXSA8LSBpZmVsc2UoZ3JlcGwoIlRWQSIsIHByZS50bWUuY3RsW3ByZS50bWUuY3RsJFNpdGUgPT0gIk9STkwiLCAiSUQiXSksICJUZW5uZXNzZWUgVmFsbGV5IiwgIldhbGtlciBCcmFuY2giKQoKIyBzdWJkaXZpZGUgU2llcnJhIGludG8gTXVzaWNrIGFuZCBTaGF2ZXIKcHJlLnRtZS5jdGxbcHJlLnRtZS5jdGwkU2l0ZSA9PSAiU2llcnJhIiwgIlNpdGUiXSA8LSBpZmVsc2UoZ3JlcGwoIk0iLCBwcmUudG1lLmN0bFtwcmUudG1lLmN0bCRTaXRlID09ICJTaWVycmEiLCAiSUQiXSksICJNdXNpY2siLCAiU2hhdmVyIikKCiMgYWRkIHRyZWF0bWVudCBjb2wKcHJlLnRtZS5jdGwkVHJlYXRtZW50IDwtICJjb250cm9sIgoKcHJlLnRtZS50cnQgPC0gZGF0YS5mcmFtZShTYW1wbGVOYW1lID0gdW5pcXVlKHRtZS50cnQudHMkU2FtcGxlTmFtZSkpCnByZS50bWUudHJ0JElEIDwtIHN1YnN0cihwcmUudG1lLnRydCRTYW1wbGVOYW1lLCAxLCBuY2hhcihhcy5jaGFyYWN0ZXIocHJlLnRtZS50cnQkU2FtcGxlTmFtZSkpLTIpCnByZS50bWUudHJ0IDwtIHJiaW5kKHByZS50bWUudHJ0LCBwcmUudG1lLmN0bFtwcmUudG1lLmN0bCRTaXRlID09ICJtaXNjIiwgYygiSUQiLCAiU2FtcGxlTmFtZSIpXSkKcHJlLnRtZS50cnQkVHJlYXRtZW50IDwtICJzdG9yYWdlIGR1cmF0aW9uIgpwcmUudG1lLnRydCRTaXRlIDwtIHByZS50bWUuY3RsW21hdGNoKHByZS50bWUudHJ0JElELCBwcmUudG1lLmN0bCRJRCksICJTaXRlIl0KCnByZS50bWUuMTRjIDwtIHJiaW5kKHByZS50bWUuY3RsLCBwcmUudG1lLnRydCkKcHJlLnRtZS4xNGMkVHlwZSA8LSBpZmVsc2UoZ3JlcGwoIkciLCBwcmUudG1lLjE0YyRTYW1wbGVOYW1lKSwgIkciLCAiRiIpCnByZS50bWUuMTRjJFBlcmlvZCA8LSAicHJlIgpwcmUudG1lLjE0YyRFeHBlcmltZW50IDwtICJ0bWUiCgojIGNyZWF0ZSBpbmMgcGVyaW9kIGRmCmluYy50bWUuMTRjIDwtIHByZS50bWUuMTRjCmluYy50bWUuMTRjJFBlcmlvZCA8LSAiaW5jIgp0bWUuMTRjLnRlbXBsYXRlIDwtIHJiaW5kKHByZS50bWUuMTRjLCBpbmMudG1lLjE0YykKYGBgCgpgYGB7ciBjb21iaW5lIHNvaWwgb2JzIGRhdGF9CiMgNC4gU3VtbWFyaXplIG9ic2VydmF0aW9uYWwgZGF0YSBmcm9tIHRpbWVzZXJpZXMgZGF0YSBieSB1bmlxdWUgSURzIChTYW1wbGVOYW1lKQojIHN1bW1hcml6ZSB0aW1lIGFuZCBjbzIgZGF0YSBieSBleHBlcmltZW50LCBwZXJpb2QsIHRyZWF0bWVudCwgYW5kIHNhbXBsZSBuYW1lCnRzLmVwc24uYXZnIDwtIHRzICU+JQogIHNlbGVjdChFeHBlcmltZW50LCBJRCwgUGVyaW9kLCBUcmVhdG1lbnQsIFNhbXBsZU5hbWUsIGdDX2dTLCBkd19nLCBtZ0NPMi5DX2dDLCB0aW1lX2QsIHRpbWVfZF9jbXR2KSAgJT4lCiAgZ3JvdXBfYnkoRXhwZXJpbWVudCwgSUQsIFBlcmlvZCwgVHJlYXRtZW50LCBTYW1wbGVOYW1lKSAlPiUKICBzdW1tYXJpc2VfYWxsKGxpc3QobWF4ID0gbWF4KSwgbmEucm0gPSBUUlVFKQp0cy5lcHNuLmF2ZyA8LSByZW5hbWVfYXQodHMuZXBzbi5hdmcsIHZhcnMoY29udGFpbnMoJ21heCcpKSwgbGlzdCh+c3ViKCJfbWF4IiwgIiIsIC4pKSkKYGBgCgpgYGB7ciBjbGVhbiB1cCAxNEMgZGF0YX0KIyA2LiBDbGVhbiB1cCBeMTReQyBkYXRhIGFuZCBhZGQgZXh0ZXJuYWwgZGF0YSBwb2ludHMgKHRtZSBleHBlcmltZW50LCBYcGxyIGNvbnRyb2wgc2FtcGxlcykKIyBOZWVkIHRvIGFkZCBTYW1wbGVOYW1lIGNvbCBhbmQgdmFyaWFibGUgY29sdW1ucyBUcmVhdG1lbnQsIFBlcmlvZCwgYW5kIEV4cGVyaW1lbnQgdG8gYWxsIGRhdGEgZnJhbWVzIGluIGFtc19yZXN1bHRzX2xzIAoKIyBGaXJzdCBhZGQgMTRDIGFuZCAxM0MgZGF0YSBmcm9tIEV4cGxvcmF0b3JpZXMgY29udHJvbCBzYW1wbGVzIHRvIGFtc19yZXN1bHRzX2xzCiMgbm90ZSB0aGF0IG5laXRoZXIgMTNDIG5vciAxNEMgd2FzIG1lYXN1cmVkIGZvciB0aGUgcHJlLWluY3ViYXRpb24gcGVyaW9kIGZvciB0aGVzZSBzYW1wbGVzCiMgZ2V0IG5hbWVzIGZvciBhbXNfcmVzdWx0cyBkYXRhIGZyYW1lcwpyZXN1bHRzLjE0Yy5ubXMgPC0gbmFtZXMoYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMTktMDEtMjhgJGBCZWVtLU1pbGxlcl85Lnhsc3hgKQojIGdldCBuYW1lcyBmb3IgcmVsZXZhbnQgRXhwZXJpbWVudC9UcmVhdG1lbnQvUGVyaW9kIGNvbWJpbmF0aW9uCmFyY19jdGxfaW5jX1NOIDwtIGFzLmNoYXJhY3RlcihhbGwuMTRjLnRlbXBsYXRlW2FsbC4xNGMudGVtcGxhdGUkRXhwZXJpbWVudCA9PSAiYXJjIiAmIGFsbC4xNGMudGVtcGxhdGUkVHJlYXRtZW50ID09ICJjb250cm9sIiAmIGFsbC4xNGMudGVtcGxhdGUkUGVyaW9kID09ICJpbmMiLCAiU2FtcGxlTmFtZSJdKQp0bWVfY3RsX2luY194cGxyX1NOIDwtIHVubGlzdChsYXBwbHkoYW1zX3Jlc3VsdHNfbHNbMToyXSwgZnVuY3Rpb24oeCkgdW5saXN0KGxhcHBseSh4LCAiW1siLCAiUHJvYmUiKSkpKQp0bWVfY3RsX2luY194cGxyX1NOIDwtIHRtZV9jdGxfaW5jX3hwbHJfU05bZ3JlcCgiSEUiLCB0bWVfY3RsX2luY194cGxyX1NOKV0KaWYobGVuZ3RoKHRtZV9jdGxfaW5jX3hwbHJfU04pID09IDE0KSB7CiAgdG1lX2N0bF9pbmNfeHBscl9TTiA8LSB1bmlxdWUoc3Vic3RyKHRtZV9jdGxfaW5jX3hwbHJfU04sIDEsIG5jaGFyKHRtZV9jdGxfaW5jX3hwbHJfU04pLTIpKQp9CgojIGFkZCBzdWJsaXN0IGZvciBFeHBsb3JhdG9yaWVzIDIwMTEgKGNvbnRyb2wpIGRhdGEgYW5kIGRhdGEgZnJhbWVzIGZvciBhYm92ZSBzdWJzZXRzCmFtc19yZXN1bHRzX2xzJGV4cGxvcmF0b3JpZXNfaXNjaG9lbmluZ18xNGMuY28yXzIwMTEkYXJjX2N0bF9pbmMgPC0gZGF0YS5mcmFtZShtYXRyaXgobnJvdyA9IGxlbmd0aChhcmNfY3RsX2luY19TTiksIG5jb2wgPSBsZW5ndGgocmVzdWx0cy4xNGMubm1zKSkpCmFtc19yZXN1bHRzX2xzJGV4cGxvcmF0b3JpZXNfaXNjaG9lbmluZ18xNGMuY28yXzIwMTEkdG1lX2N0bF9pbmNfeHBsciA8LSBkYXRhLmZyYW1lKG1hdHJpeChucm93ID0gbGVuZ3RoKHRtZV9jdGxfaW5jX3hwbHJfU04pLCBuY29sID0gbGVuZ3RoKHJlc3VsdHMuMTRjLm5tcykpKQoKIyBhZGQgbmFtZXMgYW5kIGZpbGwgU2FtcGxlTmFtZXMgZm9yIG5ldyBkYXRhIGZyYW1lcwphbXNfcmVzdWx0c19scyRleHBsb3JhdG9yaWVzX2lzY2hvZW5pbmdfMTRjLmNvMl8yMDExIDwtIGxhcHBseSgKICBhbXNfcmVzdWx0c19scyRleHBsb3JhdG9yaWVzX2lzY2hvZW5pbmdfMTRjLmNvMl8yMDExLCBmdW5jdGlvbihkZikgewogICAgbmFtZXMoZGYpIDwtIHJlc3VsdHMuMTRjLm5tcwogICAgZGYgPC0gZGF0YS5mcmFtZSgKICAgICAgbWFwcGx5KEZVTiA9IGFzLAogICAgICAgICAgICAgZGYsIAogICAgICAgICAgICAgc2FwcGx5KGFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDE5LTAxLTI4YCRgQmVlbS1NaWxsZXJfOS54bHN4YCwgY2xhc3MpLAogICAgICAgICAgICAgU0lNUExJRlkgPSBGQUxTRSksCiAgICAgIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkKICByZXR1cm4oZGYpCn0pCgphbXNfcmVzdWx0c19scyRleHBsb3JhdG9yaWVzX2lzY2hvZW5pbmdfMTRjLmNvMl8yMDExJGFyY19jdGxfaW5jWyAsIGMoIlNhbXBsZU5hbWUiLCJQcm9iZSIpXSA8LSBhcmNfY3RsX2luY19TTgphbXNfcmVzdWx0c19scyRleHBsb3JhdG9yaWVzX2lzY2hvZW5pbmdfMTRjLmNvMl8yMDExJHRtZV9jdGxfaW5jX3hwbHJbICwgYygiU2FtcGxlTmFtZSIsIlByb2JlIildIDwtIHRtZV9jdGxfaW5jX3hwbHJfU04KCiMgZmlsbCAxNEMgZGF0YQphbXNfcmVzdWx0c19scyRleHBsb3JhdG9yaWVzX2lzY2hvZW5pbmdfMTRjLmNvMl8yMDExIDwtIGxhcHBseShhbXNfcmVzdWx0c19scyRleHBsb3JhdG9yaWVzX2lzY2hvZW5pbmdfMTRjLmNvMl8yMDExLCBmdW5jdGlvbihkZikgewogIGRmJGBYLjE0Qy4uLi5gIDwtIHhwbHIuY3RsLmlzb1ttYXRjaChkZiRQcm9iZSwgeHBsci5jdGwuaXNvJEVQX1Bsb3RpZCksICIxNGNfQ08yIl0KICBkZiRUcmVhdG1lbnQgPC0gImNvbnRyb2wiCiAgZGYkUGVyaW9kIDwtICJpbmMiCiAgcmV0dXJuKGRmKQp9KQoKIyBhZGQgRXhwZXJpbWVudAphbXNfcmVzdWx0c19scyRleHBsb3JhdG9yaWVzX2lzY2hvZW5pbmdfMTRjLmNvMl8yMDExJGFyY19jdGxfaW5jJEV4cGVyaW1lbnQgPC0gImFyYyIKYW1zX3Jlc3VsdHNfbHMkZXhwbG9yYXRvcmllc19pc2Nob2VuaW5nXzE0Yy5jbzJfMjAxMSR0bWVfY3RsX2luY194cGxyJEV4cGVyaW1lbnQgPC0gInRtZSIKCgojIGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDE4LTEwLTEyYCBhbmQgYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMTgtMTEtMDlgCiMgYEJlZW0tTWlsbGVyXzQueGxzeGAsIGBCZWVtLU1pbGxlcl81Lnhsc3hgOyBgQmVlbS1NaWxsZXJfNi54bHN4YCwgYEJlZW0tTWlsbGVyXzcueGxzeGAKIyBBZGQgdHJlYXRtZW50LCBleHBlcmltZW50LCBwZXJpb2QgY29scwojIEV4cGVyaW1lbnQgPSB0bWUKIyBUcmVhdG1lbnQgPSBzdG9yYWdlIGR1cmF0aW9uCiMgUGVyaW9kID0gaW5jCmFtc19yZXN1bHRzX2xzWzE6Ml0gPC0gbGFwcGx5KGFtc19yZXN1bHRzX2xzWzE6Ml0sIGZ1bmN0aW9uKGxzKSBsYXBwbHkobHMsIGZ1bmN0aW9uKGRmKSB7CiAgZGYkRXhwZXJpbWVudCA8LSAidG1lIgogIGRmJFRyZWF0bWVudCA8LSAic3RvcmFnZSBkdXJhdGlvbiIKICBkZiRQZXJpb2QgPC0gImluYyIKICByZXR1cm4oZGYpCiAgfSkKKQoKIyBgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wMS0yOGAKIyBgQmVlbS1NaWxsZXJfOS54bHN4YAojIEV4cGVyaW1lbnQgPSBhcmMKIyBUcmVhdG1lbnQgPSBhaXItZHJ5ICsgc3RvcmFnZQojIFBlcmlvZCA9IHByZQphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wMS0yOGAkYEJlZW0tTWlsbGVyXzkueGxzeGAkU2FtcGxlTmFtZSA8LSBhbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wMS0yOGAkYEJlZW0tTWlsbGVyXzkueGxzeGAkUHJvYmUKYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMTktMDEtMjhgJGBCZWVtLU1pbGxlcl85Lnhsc3hgJFRyZWF0bWVudCA8LSAiYWlyLWRyeSArIHN0b3JhZ2UiCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDE5LTAxLTI4YCRgQmVlbS1NaWxsZXJfOS54bHN4YCRQZXJpb2QgPC0gInByZSIKYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMTktMDEtMjhgJGBCZWVtLU1pbGxlcl85Lnhsc3hgJEV4cGVyaW1lbnQgPC0gImFyYyIKCiMgYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMTktMDItMjVgJAojIEFyY2hpdmVkX0luY3ViYXRpb25zXzMwLnhsc3gKIyBFeHBlcmltZW50ID0gYXJjCiMgVHJlYXRtZW50ID0gYWlyLWRyeSArIHN0b3JhZ2UKIyBQZXJpb2QgPSBpbmMKYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMTktMDItMjVgJEFyY2hpdmVkX0luY3ViYXRpb25zXzMwLnhsc3gkU2FtcGxlTmFtZSA8LSBzdWJzdHIoYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMTktMDItMjVgJEFyY2hpdmVkX0luY3ViYXRpb25zXzMwLnhsc3gkUHJvYmUsIDEsIDkpCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDE5LTAyLTI1YCRBcmNoaXZlZF9JbmN1YmF0aW9uc18zMC54bHN4JFRyZWF0bWVudCA8LSAiYWlyLWRyeSArIHN0b3JhZ2UiCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDE5LTAyLTI1YCRBcmNoaXZlZF9JbmN1YmF0aW9uc18zMC54bHN4JFBlcmlvZCA8LSAiaW5jIgphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wMi0yNWAkQXJjaGl2ZWRfSW5jdWJhdGlvbnNfMzAueGxzeCRFeHBlcmltZW50IDwtICJhcmMiCgojIGFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDE5LTA0LTMwYAojIGBSb3N0XzMxLTIueGxzeGAKIyBFeHBlcmltZW50ID0gYXJjCiMgVHJlYXRtZW50ID0gYWlyLWRyeSArIHN0b3JhZ2UKIyBQZXJpb2QgPSBpbmMsIHByZSAoU0VXMTEtMi0yKQphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wNC0zMGAkYFJvc3RfMzEtMi54bHN4YCRTYW1wbGVOYW1lIDwtIHN1YnN0cihhbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wNC0zMGAkYFJvc3RfMzEtMi54bHN4YCRQcm9iZSwgMSwgOSkKYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMTktMDQtMzBgJGBSb3N0XzMxLTIueGxzeGAkVHJlYXRtZW50IDwtICJhaXItZHJ5ICsgc3RvcmFnZSIKYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMTktMDQtMzBgJGBSb3N0XzMxLTIueGxzeGAkRXhwZXJpbWVudCA8LSAiYXJjIgphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wNC0zMGAkYFJvc3RfMzEtMi54bHN4YFsyOjksICJQZXJpb2QiXSA8LSAiaW5jIgphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wNC0zMGAkYFJvc3RfMzEtMi54bHN4YFsxMCwgIlBlcmlvZCJdIDwtICJwcmUiCgojIGFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDIwLTAyLTEzYAojIFJvc3RfNDcueGxzeCAKIyBFeHBlcmltZW50ID0gcmV3ZXQKIyBUcmVhdG1lbnQgPSBjb250cm9sCiMgUGVyaW9kID0gcHJlCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDIwLTAyLTEzYCRSb3N0XzQ3Lnhsc3gkU2FtcGxlTmFtZSA8LSBzdWJzdHIoYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMjAtMDItMTNgJFJvc3RfNDcueGxzeCRQcm9iZSwgMSwgNykKYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMjAtMDItMTNgJFJvc3RfNDcueGxzeCRUcmVhdG1lbnQgPC0gImNvbnRyb2wiCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDIwLTAyLTEzYCRSb3N0XzQ3Lnhsc3gkRXhwZXJpbWVudCA8LSAicmV3ZXQiCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDIwLTAyLTEzYCRSb3N0XzQ3Lnhsc3gkUGVyaW9kIDwtICJwcmUiCiMgUm9zdF81MC54bHN4CiMgRXhwZXJpbWVudCA9IHJld2V0CiMgVHJlYXRtZW50ID0gY29udHJvbAojIFBlcmlvZCA9IGluYwphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAyMC0wMi0xM2AkUm9zdF81MC54bHN4JFNhbXBsZU5hbWUgPC0gc3Vic3RyKGFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDIwLTAyLTEzYCRSb3N0XzUwLnhsc3gkUHJvYmUsIDEsIDcpCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDIwLTAyLTEzYCRSb3N0XzUwLnhsc3gkVHJlYXRtZW50IDwtICJjb250cm9sIgphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAyMC0wMi0xM2AkUm9zdF81MC54bHN4JEV4cGVyaW1lbnQgPC0gInJld2V0IgphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAyMC0wMi0xM2AkUm9zdF81MC54bHN4JFBlcmlvZCA8LSAiaW5jIgojIFJvc3RfNTIueGxzeAojIEV4cGVyaW1lbnQgPSByZXdldAojIFRyZWF0bWVudCA9IGFpci1kcnkKIyBQZXJpb2QgPSBwcmUsIGluYwphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAyMC0wMi0xM2AkUm9zdF81Mi54bHN4JFNhbXBsZU5hbWUgPC0gc3Vic3RyKGFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDIwLTAyLTEzYCRSb3N0XzUyLnhsc3gkUHJvYmUsIDEsIDExKQpwcmUuaXggPC0gd2hpY2goZ3JlcGwoIlBSRSIsIGFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDIwLTAyLTEzYCRSb3N0XzUyLnhsc3gkUHJvYmUpKQphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAyMC0wMi0xM2AkUm9zdF81Mi54bHN4JFRyZWF0bWVudCA8LSAiYWlyLWRyeSIKYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMjAtMDItMTNgJFJvc3RfNTIueGxzeCRFeHBlcmltZW50IDwtICJyZXdldCIKYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMjAtMDItMTNgJFJvc3RfNTIueGxzeFtwcmUuaXgsICJQZXJpb2QiXSA8LSAicHJlIgphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAyMC0wMi0xM2AkUm9zdF81Mi54bHN4Wy1wcmUuaXgsICJQZXJpb2QiXSA8LSAiaW5jIgpgYGAKCmBgYHtyIGNvbWJpbmUgMTRDIHNvaWwgb2JzIGRhdGF9CiMgNy4gQ29tYmluZSBkYXRhLgojIGZsYXR0ZW4gbGlzdCBhbmQgcmVtb3ZlIEFNUyBibGFua3MsIE5BIHNhbXBsZXMsIGFuZCBub24tRXhwbG9yYXRvcnkgZGF0YQphbXNfcmVzdWx0c19hcmNfcmV3ZXQgPC0gbGFwcGx5KGFtc19yZXN1bHRzX2xzWzM6N10sIGZ1bmN0aW9uKHgpIGJpbmRfcm93cyh4KSkKYW1zX3Jlc3VsdHNfYXJjX3Jld2V0LmRmIDwtIGJpbmRfcm93cyhsYXBwbHkoYW1zX3Jlc3VsdHNfYXJjX3Jld2V0LCBmdW5jdGlvbih4KSBleHRyYS5jbGVhbi5meCh4KSkpCgojIGZsYXR0ZW4gZXh0ZXJuYWwgZGF0YSBsaXN0CmFtc19yZXN1bHRzX3RtZSA8LSBsYXBwbHkoYW1zX3Jlc3VsdHNfbHNbYygxOjIsNyldLCBmdW5jdGlvbih4KSBsYXBwbHkoeCwgdG1lLjE0Yy5meCkpCmFtc19yZXN1bHRzX3RtZS5kZiA8LSBiaW5kX3Jvd3MobGFwcGx5KGFtc19yZXN1bHRzX3RtZSwgZnVuY3Rpb24oeCkgYmluZF9yb3dzKHgpKSkKCiMgY3V0IG91dCBub24tcmVsZXZhbnQgQU1TIHJlc3VsdHMgY29sdW1ucwpubXMuYW1zLnZhcnMgPC0gYygiRjE0QyIsICJlcnIiLCAiWC4xNEMuLi4uIiwgImVyci4uLi4iLAogICAgICAgICAgICAgICAgICJTYW1wbGVOYW1lIiwgIlRyZWF0bWVudCIsICJQZXJpb2QiLCAiRXhwZXJpbWVudCIpCmFtc19yZXN1bHRzX2FyY19yZXdldC5kZiA8LSBhbXNfcmVzdWx0c19hcmNfcmV3ZXQuZGZbICwgbm1zLmFtcy52YXJzXQpjb2xuYW1lcyhhbXNfcmVzdWx0c19hcmNfcmV3ZXQuZGYpIDwtIGMoImZtIiwgImZtX2VyciIsICJkMTRjIiwgImQxNGNfZXJyIiwgbm1zLmFtcy52YXJzWzU6OF0pCgphbXNfcmVzdWx0c190bWUuZGYgPC0gYW1zX3Jlc3VsdHNfdG1lLmRmWyAsIG5tcy5hbXMudmFyc10KY29sbmFtZXMoYW1zX3Jlc3VsdHNfdG1lLmRmKSA8LSBjKCJmbSIsICJmbV9lcnIiLCAiZDE0YyIsICJkMTRjX2VyciIsIG5tcy5hbXMudmFyc1s1OjhdKQogICAgIAojIGNvbXBsaWNhdGVkLCBidXQgdGhlIGZvbGxvd2luZyBjaGVja3MgdG8gc2VlIGlmOgojIDEpIFRoZSBlbmQgb2YgdGhlIHNhbXBsZSBuYW1lIHN0cmluZyBpcyAiLW4iIHdoZXJlICJuIiBpcyBhIG51bWJlcgojIDIpIGlmIHRydWUsIHRoZSBmaW5hbCB0d28gY2hhcmFjdGVycyBhcmUgdHJpbW1lZAojIDMpIGlmIGZhbHNlLCB0aGUgbmFtZSBpcyByZXRhaW5lZCBhcyBpcyAoZS5nLiBmb3IgdG1lIGN0bCBzYW1wbGVzKQphbXNfcmVzdWx0c190bWUuZGYkSUQgPC0gaWZlbHNlKHN1YnN0cihzdWJzdHIoYW1zX3Jlc3VsdHNfdG1lLmRmJFNhbXBsZU5hbWUsIDEsIG5jaGFyKGFtc19yZXN1bHRzX3RtZS5kZiRTYW1wbGVOYW1lKS0xKSwKICAgICAgICAgICAgICBuY2hhcihzdWJzdHIoYW1zX3Jlc3VsdHNfdG1lLmRmJFNhbXBsZU5hbWUsIDEsIG5jaGFyKGFtc19yZXN1bHRzX3RtZS5kZiRTYW1wbGVOYW1lKS0xKSksCiAgICAgICAgICAgICAgbmNoYXIoc3Vic3RyKGFtc19yZXN1bHRzX3RtZS5kZiRTYW1wbGVOYW1lLCAxLCBuY2hhcihhbXNfcmVzdWx0c190bWUuZGYkU2FtcGxlTmFtZSktMSkpKSA9PSAiLSIsCiAgICAgICBzdWJzdHIoYW1zX3Jlc3VsdHNfdG1lLmRmJFNhbXBsZU5hbWUsIDEsIG5jaGFyKGFtc19yZXN1bHRzX3RtZS5kZiRTYW1wbGVOYW1lKS0yKSwKICAgICAgIGFtc19yZXN1bHRzX3RtZS5kZiRTYW1wbGVOYW1lKQphbXNfcmVzdWx0c190bWUuZGYkVHlwZSA8LSBpZmVsc2UoZ3JlcGwoIkciLCBhbXNfcmVzdWx0c190bWUuZGYkSUQpLCAiRyIsICJGIikKCiMgbWVyZ2UgYXJjIGFuZCByZXdldCAxNEMgZGF0YSB3aXRoIHRlbXBsYXRlCmlmKG5yb3cobWVyZ2UoYWxsLjE0Yy50ZW1wbGF0ZSwgYW1zX3Jlc3VsdHNfYXJjX3Jld2V0LmRmLCBhbGwueCA9IFRSVUUpKSA9PSBucm93KGFsbC4xNGMudGVtcGxhdGUpKSB7CiAgYWxsLjE0YyA8LSBtZXJnZShhbGwuMTRjLnRlbXBsYXRlLCBhbXNfcmVzdWx0c19hcmNfcmV3ZXQuZGYsIGFsbC54ID0gVFJVRSkKfSBlbHNlIHsKICBjYXQoImR1cGxpY2F0ZSBzYW1wbGUgbWVyZ2UgZXJyb3IiKQp9CgojIG1lcmdlIHNvaWwgb2JzIGRhdGEgd2l0aCAxNGMgZGF0YQppZihucm93KG1lcmdlKGFsbC4xNGMsIHRzLmVwc24uYXZnLCBieSA9IGMoIlNhbXBsZU5hbWUiLCAiUGVyaW9kIikpKSA9PSBucm93KGFsbC4xNGMpKSB7CiAgYWxsLjE0YyA8LSBtZXJnZShhbGwuMTRjLCB0cy5lcHNuLmF2ZywgYWxsLnggPSBUUlVFKQp9IGVsc2UgewogIGNhdCgiZHVwbGljYXRlIHNhbXBsZSBtZXJnZSBlcnJvciIpCn0KCiMgbWVyZ2UgdG1lIDE0QyBkYXRhIHdpdGggdGVtcGxhdGUgYW5kIHRzLmVwc24uYXZnCnRtZS4xNGMgPC0gbWVyZ2UodG1lLjE0Yy50ZW1wbGF0ZSwgYW1zX3Jlc3VsdHNfdG1lLmRmLCBhbGwueCA9IFRSVUUpCgojIGFkZCBjdGwgc2FtcGxlIDE0QyBkYXRhIHRvIHRtZS4xNGMKIyBmaXJzdCByZW1vdmUgTkEgdmFsdWVzCnRtZS4xNGMuY2xlYW4gPC0gdG1lLjE0Y1t3aGljaCghaXMubmEodG1lLjE0YyRkMTRjKSB8ICFpcy5uYSh0bWUuMTRjJGZtKSksIF0KIyBkZWZpbmUgbWVyZ2UgZngKdG1lLm1yZy5meCA8LSBmdW5jdGlvbih4LCB5KSB7CiAgbXJnLm5tcyA8LSBjKCJTYW1wbGVOYW1lIiwgIklEIiwgIlRyZWF0bWVudCIsICJQZXJpb2QiKQogIHZhci5ubXMgPC0gYygiWWVhclNhbXBsZWQiLCAiU2l0ZSIsICJIb3Jpem9uIiwgICJkMTRjIiwgImZtIikKICBpZihsZW5ndGgoZ3JlcCgiZm0iLCBuYW1lcyh5KSkpID4gMCkgewogICAgZGYgPC0gbWVyZ2UoeFsgLCBtcmcubm1zXSwgeVsgLCBjKG1yZy5ubXMsIHZhci5ubXMpXSkKICB9IGVsc2UgewogICAgZGYgPC0gbWVyZ2UoeFsgLCBtcmcubm1zXSwgeVsgLCBjKG1yZy5ubXMsIHZhci5ubXNbMTo0XSldKQogICAgZGYkZm0gPC0gTkEKICB9CiAgcmV0dXJuKGRmKQp9Cgp0bWUuMTRjLmRmIDwtIHN1cHByZXNzTWVzc2FnZXMoYmluZF9yb3dzKGxhcHBseShsaXN0KHRtZS5jdGwuZHVrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtZS5jdGwuZmx4LnNyYVt3aGljaCghaXMubmEodG1lLmN0bC5mbHguc3JhJGQxNGMpKSwgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bWUuY3RsLm9ybmwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1lLm1pc2MpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oaSkgdG1lLm1yZy5meCh0bWUuMTRjLCBpKSkpKQoKIyBhZGQgc3RvcmFnZSBkdXJhdGlvbiBkYXRhIGZvciB0cmVhdG1lbnQgc2FtcGxlcyBhbmFseXplZCBleHRlcm5hbGx5CnRtZS4xNGMuZGYkVHlwZSA8LSAiRiIKCiMgYWRkIFllYXJTYW1wbGVkIGZvciB0bWUuMTRjLmNsZWFuIHNhbXBsZXMKZm9yKGkgaW4gMTpucm93KHRtZS4xNGMuY2xlYW4pKSB7CiAgaWYodG1lLjE0Yy5jbGVhbltpLCAiU2l0ZSJdID09ICJEdWtlIikgewogICAgdG1lLjE0Yy5jbGVhbltpLCAiWWVhclNhbXBsZWQiXSA8LSAyMDA4CiAgfSBlbHNlIGlmKHRtZS4xNGMuY2xlYW5baSwgIlNpdGUiXSA9PSAiSGFpbmljaCIpIHsKICAgIHRtZS4xNGMuY2xlYW5baSwgIlllYXJTYW1wbGVkIl0gPC0gMjAxMQogIH0gZWxzZSBpZih0bWUuMTRjLmNsZWFuW2ksICJTaXRlIl0gPT0gIk11c2ljayIgfCB0bWUuMTRjLmNsZWFuW2ksICJTaXRlIl0gPT0gIlNoYXZlciIpIHsKICAgIHRtZS4xNGMuY2xlYW5baSwgIlllYXJTYW1wbGVkIl0gPC0gMjAwOQogIH0gZWxzZSB7CiAgICB0bWUuMTRjLmNsZWFuW2ksICJZZWFyU2FtcGxlZCJdIDwtIDIwMDQKICB9Cn0KCiMgQWRkIEhvcml6b24gdG8gdG1lLjE0Yy5jbGVhbgp0bWUuMTRjLmNsZWFuJEhvcml6b24gPC0gaWZlbHNlKHRtZS4xNGMuY2xlYW4kSUQgPT0gIk1CIiB8IHRtZS4xNGMuY2xlYW4kSUQgPT0gIlNCIiwgIkIiLCAiQSIpCgojIGNvbWJpbmUgdG1lIGRhdGEKdG1lLjE0YyA8LSBiaW5kX3Jvd3ModG1lLjE0Yy5jbGVhblsgLCBuYW1lcyh0bWUuMTRjLmRmKV0sIHRtZS4xNGMuZGYpCnRtZS4xNGMkRXhwZXJpbWVudCA8LSAidG1lIgoKIyByZW1vdmUgb3V0bGllciAoTUEtMSkKIyAqKiogTmVlZCB0byBjbGFyaWZ5IG1ldGhvZCBmb3IgZGV0ZXJtaW5pbmcgdGhhdCB0aGlzIGlzIGFuIG91dGxpZXIgKioqIAp0bWUuMTRjIDwtIHRtZS4xNGNbLXdoaWNoKHRtZS4xNGMkU2FtcGxlTmFtZSA9PSAiTUEtMSIgfCB0bWUuMTRjJFNhbXBsZU5hbWUgPT0gIkhFVzQ5LTEiIHwgdG1lLjE0YyRTYW1wbGVOYW1lID09ICJIRVcyNi0xIiksIF0KCgojIEFkZCBtaXNzaW5nIHZhcmlhYmxlIGNvbHVtbnMgdG8gYWxsLjE0YwojIGFkZCBZZWFyU2FtcGxlZCBjb2x1bW4KYWxsLjE0YyRZZWFyU2FtcGxlZCA8LSBpZmVsc2UoYWxsLjE0YyRFeHBlcmltZW50ID09ICJhcmMiLCAyMDExLCAyMDE5KQoKIyBhZGQgU2l0ZSBhbmQgSG9yaXpvbiBjb2x1bW5zCmFsbC4xNGMkU2l0ZSA8LSBpZmVsc2UoZ3JlcGwoIkhFIiwgYWxsLjE0YyRJRCksICJIYWluaWNoIiwgIlNjaG9yZmhlaWRlIikKYWxsLjE0YyRIb3Jpem9uIDwtICJBIgoKCiMgY29tYmluZSB0bWUuMTRjIGFuZCBhbGwuMTRjIGludG8gYSBsaXN0IGFuZCBjYWxjdWxhdGUgZnJhY3Rpb24gbW9kZXJuIGZyb20gZDE0QyBhcyBuZWVkZWQKYWxsLjE0Yy5scyA8LSBsYXBwbHkobGlzdCh0bWUuMTRjLCBhbGwuMTRjKSwgZnVuY3Rpb24oZGYpIHsKICBkZiRmbSA8LSBpZmVsc2UoaXMubmEoZGYkZm0pLAogICAgICAgICAgICAgICAgICBkMTRjLmZtLmZ4KGRmJFllYXJTYW1wbGVkLCBkZiRkMTRjKSwKICAgICAgICAgICAgICAgICAgZGYkZm0pCiAgZGYkZDE0Y19jb3JyIDwtIGRlY2F5LmNvcnIuZngoZGYkWWVhclNhbXBsZWQsIGRmJGZtKQogIHJldHVybihkZikKfSkKc2F2ZShhbGwuMTRjLmxzLCBmaWxlID0gImFsbC4xNGMubHMuUkRhdGEiKQoKYWxsLjE0Yy5zdW0gPC0gbGFwcGx5KGFsbC4xNGMubHMsIGZ1bmN0aW9uKGRmKSB7CiAgZGYuc3VtIDwtIHNlbGVjdChkZiwgLVNhbXBsZU5hbWUpICU+JQogICAgZ3JvdXBfYnkoSUQsIFR5cGUsIFBlcmlvZCwgVHJlYXRtZW50LCBFeHBlcmltZW50LCBTaXRlLCBIb3Jpem9uLCBZZWFyU2FtcGxlZCkgJT4lCiAgICBzdW1tYXJpc2VfYWxsKGxpc3QobWVhbiA9IG1lYW4sIG1heCA9IG1heCwgbWluID0gbWluLCBzZCA9IHNkKSwgbmEucm0gPSBUUlVFKQogIGRmLnN1bVttYXBwbHkoaXMuaW5maW5pdGUsIGRmLnN1bSldIDwtIE5BCiAgcmV0dXJuKGRmLnN1bSkKfSkKYWxsLjE0Yy5zdW0gPC0gcmFwcGx5KGFsbC4xNGMuc3VtLCBmID0gZnVuY3Rpb24oeCkgaWZlbHNlKGlzLm5hbih4KSwgTkEgLCB4KSwgaG93ID0gInJlcGxhY2UiKQphbGwuMTRjLnN1bS5kZiA8LSBzdXBwcmVzc01lc3NhZ2VzKGJpbmRfcm93cyhhbGwuMTRjLnN1bSkpCnNhdmUoYWxsLjE0Yy5zdW0uZGYsIGZpbGUgPSAiYWxsLjE0Yy5zdW0uZGYuUkRhdGEiKQpgYGAKCmBgYHtyIHJlYWQtY2FsYy0xM2N9CiMgQ2xlYW4gdXAgMTNDIGRhdGEKIyBOb3RlIHRoYXQgaXNvIGRhdGEgSURzIHNob3VsZCBiZSBzdG9yZWQgYXMgdGhlICJwcmVwYXJhdGlvbiIgdmFyaWFibGUKCiMgZmlyc3QgY3JlYXRlIGEgbGlicmFyeSBvZiBwb3NzaWJsZSBJRHMKYWxsLmlkcyA8LSB1bmlxdWUoYyhhbGwuMTRjLnRlbXBsYXRlJElELCB0bWUuMTRjLnRlbXBsYXRlJElEKSkKCiMgZnVuY3Rpb24gdG8gc3RyaXAgb3V0IGFsbCB2YWx1ZXMgbm90IGNvcnJlc3BvbmRpbmcgdG8ga25vd24gSURzIGFuZCByZXR1cm4gbWVhbiBvZiBkdXBsaWNhdGVzCmNsZWFuLmlzbyA8LSBmdW5jdGlvbihkZikgewogIAogICMgc3RyaXAgb3V0IG5vbiBhcmMtaW5jIGRhdGEKICBpeCA8LSB2ZWN0b3IobW9kZSA9ICJsaXN0IiwgbGVuZ3RoID0gbGVuZ3RoKGFsbC5pZHMpKQogIGZvcihpIGluIHNlcV9hbG9uZyhhbGwuaWRzKSkgewogICAgaWYoYW55KGdyZXBsKGFsbC5pZHNbaV0sIGRmJHByZXBhcmF0aW9uKSkpIHsKICAgICAgaXhbW2ldXSA8LSB3aGljaChncmVwbChhbGwuaWRzW2ldLCBkZiRwcmVwYXJhdGlvbikpCiAgICB9IAogIH0KICAKICBpeCA8LSB1bmxpc3QoaXgpCiAgCiAgIyBjb252ZXJ0IDEzQyBjb2wgdG8gbnVtZXJpYwogIGRmIDwtIGRhdGEuZnJhbWUoZGZbaXgsIF0pCiAgZGYkb2Zmc2V0LmNvcnIuc2FtcGxlIDwtIGFzLm51bWVyaWMoZGYkb2Zmc2V0LmNvcnIuc2FtcGxlKQogIAogICMgY29udmVydCB0byBkYXRhIGZyYW1lIGZyb20gdGliYmxlCiAgZGYgPC0gZGF0YS5mcmFtZShkZikKICAKICAjIGF2ZXJhZ2UgZHVwbGljYXRlcwogIGQxM2MgPC0gdmVjdG9yKCkKICBmb3IoaSBpbiBzZXFfYWxvbmcoZGYkcHJlcGFyYXRpb24pKSB7CiAgICAgICAgaWYoaSAhPSBucm93KGRmKSkgewogICAgICAgICAgZDEzY1tpXSA8LSBpZmVsc2UoZGZbaSwgInByZXBhcmF0aW9uIl0gPT0gZGZbaSArIDEsICJwcmVwYXJhdGlvbiJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhbihkZltpLCAib2Zmc2V0LmNvcnIuc2FtcGxlIl0sIGRmW2krMSwgIm9mZnNldC5jb3JyLnNhbXBsZSJdLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTkEpCiAgICAgIH0KICB9CiAgZGYgPC0gZGZbY29tcGxldGUuY2FzZXMoZGYkb2Zmc2V0LmNvcnIuc2FtcGxlKSwgXQogIHJldHVybihkYXRhLmZyYW1lKFNhbXBsZU5hbWUgPSB1bmlxdWUoZGYkcHJlcGFyYXRpb24pLAogICAgICAgICAgICAgICAgICAgIGQxM2MgPSBkMTNjW2NvbXBsZXRlLmNhc2VzKGQxM2MpXSkpCn0KCmlzb19yZXN1bHRzX2xzX2NsZWFuIDwtIGxhcHBseShpc29fcmVzdWx0c19scywgZnVuY3Rpb24oZGYpIHsKICBsYXBwbHkoZGYsIGNsZWFuLmlzbykKfSkKCiMgYWRkIGluIEV4cGVyaW1lbnQsIHRyZWF0bWVudCwgcGVyaW9kLCBldGMuCiMgMS4gaXNvX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wMS0yMgojIyAxM0NfYXJjaGl2ZWNJbmNfUHJlXzIwMTgxMjA3LTE0MTY5MS0xNDE3NTEueGxzCmlzb19yZXN1bHRzX2xzX2NsZWFuW1sxXV1bWzFdXVsiUGVyaW9kIl0gPC0gInByZSIKaXNvX3Jlc3VsdHNfbHNfY2xlYW5bWzFdXVtbMV1dWyJFeHBlcmltZW50Il0gPC0gImFyYyIKaXNvX3Jlc3VsdHNfbHNfY2xlYW5bWzFdXVtbMV1dWyJUcmVhdG1lbnQiXSA8LSAiYWlyLWRyeSArIHN0b3JhZ2UiCgojIyAxM0NfYXJjaGl2ZWRJbmNfMjAxOTAxMTYtMTQyMDEyLTE0MjA3Mi54bHMKaXNvX3Jlc3VsdHNfbHNfY2xlYW5bWzFdXVtbMl1dWyJQZXJpb2QiXSA8LSAiaW5jIgppc29fcmVzdWx0c19sc19jbGVhbltbMV1dW1syXV1bIkV4cGVyaW1lbnQiXSA8LSAiYXJjIgppc29fcmVzdWx0c19sc19jbGVhbltbMV1dW1syXV1bIlRyZWF0bWVudCJdIDwtICJhaXItZHJ5ICsgc3RvcmFnZSIKCiMgMi4gaXNvX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wMS0yMwojIyAyMDE5MDEyMi1NYW51ZWxSb3N0LTE0MjA4Mi0xNDE1NTMueGxzYAppc29fcmVzdWx0c19sc19jbGVhbltbMl1dW1sxXV1bIlBlcmlvZCJdIDwtICJpbmMiCmlzb19yZXN1bHRzX2xzX2NsZWFuW1syXV1bWzFdXVsiRXhwZXJpbWVudCJdIDwtICJhcmMiCmlzb19yZXN1bHRzX2xzX2NsZWFuW1syXV1bWzFdXVsiVHJlYXRtZW50Il0gPC0gImFpci1kcnkgKyBzdG9yYWdlIgoKIyAzLiBpc29famVuYV9yZXN1bHRzLWNvMl8yMDE5LTA5LTEwCiMjIDIwMTkwOTA5LTJXaC1KZWZmcmV5X0JlZW0tTWlsbGVyLTEzNjEzLTEzNjU4Lnhscwppc29fcmVzdWx0c19sc19jbGVhbltbM11dW1sxXV1bIlBlcmlvZCJdIDwtICJwcmUiCmlzb19yZXN1bHRzX2xzX2NsZWFuW1szXV1bWzFdXVsiRXhwZXJpbWVudCJdIDwtICJyZXdldCIKaXNvX3Jlc3VsdHNfbHNfY2xlYW5bWzNdXVtbMV1dWyJUcmVhdG1lbnQiXSA8LSAiY29udHJvbCIKCiMgNC4gaXNvX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wOS0xMQojIyAyMDE5MDkxMC1KZWZmcmV5X0JlZW0tTWlsbGVyLTEzNjY0LTEzNzAyLnhscwppc29fcmVzdWx0c19sc19jbGVhbltbNF1dW1sxXV1bIlBlcmlvZCJdIDwtICJpbmMiCmlzb19yZXN1bHRzX2xzX2NsZWFuW1s0XV1bWzFdXVsiRXhwZXJpbWVudCJdIDwtICJyZXdldCIKaXNvX3Jlc3VsdHNfbHNfY2xlYW5bWzRdXVtbMV1dWyJUcmVhdG1lbnQiXSA8LSAiY29udHJvbCIKCiMgNS4gaXNvX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0xMi0wNAojIyAyMDE5MTEyNi1NUm9zdC1CZWVtTWlsbGVyLTE3NTA5LTE3NTU1Lnhscwppc29fcmVzdWx0c19sc19jbGVhbltbNV1dW1sxXV1bIlBlcmlvZCJdIDwtICJpbmMiCmlzb19yZXN1bHRzX2xzX2NsZWFuW1s1XV1bWzFdXVsiRXhwZXJpbWVudCJdIDwtICJyZXdldCIKaXNvX3Jlc3VsdHNfbHNfY2xlYW5bWzVdXVtbMV1dWyJUcmVhdG1lbnQiXSA8LSAiYWlyLWRyeSIKCiMgNi4gaXNvX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0xMi0yMQojIyAyMDE5MDIxMy1NYW51ZWxSb3N0LTE0MzE5Mi0xNDMyOTQueGxzCmlzb19yZXN1bHRzX2xzX2NsZWFuW1s2XV1bWzFdXVsiUGVyaW9kIl0gPC0gImluYyIKaXNvX3Jlc3VsdHNfbHNfY2xlYW5bWzZdXVtbMV1dWyJFeHBlcmltZW50Il0gPC0gImFyYyIKaXNvX3Jlc3VsdHNfbHNfY2xlYW5bWzZdXVtbMV1dWyJUcmVhdG1lbnQiXSA8LSAiYWlyLWRyeSArIHN0b3JhZ2UiCgojIyAyMDE5MTEwNi1NUm9zdC0xNjkyNS0xNjk1Mi54bHMKaXNvX3Jlc3VsdHNfbHNfY2xlYW5bWzZdXVtbMl1dWyJQZXJpb2QiXSA8LSAiaW5jIgppc29fcmVzdWx0c19sc19jbGVhbltbNl1dW1syXV1bIkV4cGVyaW1lbnQiXSA8LSAicmV3ZXQiCmlzb19yZXN1bHRzX2xzX2NsZWFuW1s2XV1bWzJdXVsiVHJlYXRtZW50Il0gPC0gImNvbnRyb2wiCgojIyBBcmNJbmNfZHJ5XzEzQy54bHMKaXNvX3Jlc3VsdHNfbHNfY2xlYW5bWzZdXVtbM11dWyJQZXJpb2QiXSA8LSAicHJlIgppc29fcmVzdWx0c19sc19jbGVhbltbNl1dW1szXV1bIkV4cGVyaW1lbnQiXSA8LSAicmV3ZXQiCmlzb19yZXN1bHRzX2xzX2NsZWFuW1s2XV1bWzNdXVsiVHJlYXRtZW50Il0gPC0gImFpci1kcnkiCgojIEZsYXR0ZW4gbGlzdAppc29fZGYgPC0gc3VwcHJlc3NXYXJuaW5ncyhiaW5kX3Jvd3ModW5saXN0KGlzb19yZXN1bHRzX2xzX2NsZWFuLCByZWN1cnNpdmUgPSBGQUxTRSkpKQpzYXZlKGlzb19kZiwgZmlsZSA9ICJpc29fZGYuUkRhdGEiKQoKIyBleHRyYWN0IG9yaWdpbmFsIElEcwpvZy5zbiA8LSB2ZWN0b3IoKQpmb3IoaSBpbiBzZXFfYWxvbmcoaXNvX2RmJFNhbXBsZU5hbWUpKSB7CiAgb2cuc25baV0gPC0gaWZlbHNlKGdyZXBsKCJIRSIsIGlzb19kZiRTYW1wbGVOYW1lW2ldKSwKICAgICAgICAgICAgICAgICAgICAgc3Vic3RyKGlzb19kZiRTYW1wbGVOYW1lW2ldLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gdW5saXN0KGdyZWdleHByKCJIRSIsIGlzb19kZiRTYW1wbGVOYW1lW2ldKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcCA9IHVubGlzdChncmVnZXhwcigiSEUiLCBpc29fZGYkU2FtcGxlTmFtZVtpXSkpICsgNCksCiAgICAgICAgICAgICAgICAgICAgIHN1YnN0cihpc29fZGYkU2FtcGxlTmFtZVtpXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IHVubGlzdChncmVnZXhwcigiU0UiLCBpc29fZGYkU2FtcGxlTmFtZVtpXSkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3AgPSB1bmxpc3QoZ3JlZ2V4cHIoIlNFIiwgaXNvX2RmJFNhbXBsZU5hbWVbaV0pKSArIDQpKQp9Cmlzb19kZiRJRCA8LSBvZy5zbgppc29fZGYkVHlwZSA8LSBpZmVsc2UoZ3JlcGwoIkciLCBpc29fZGYkSUQpLCAiRyIsICJGIikKCiMgYWRkIGNvbnRyb2wgc2FtcGxlIDEzQyBmb3IgYXJjIGV4cGVyaW1lbnQKYXJjLmN0bC5pbmMuSURzIDwtIHVuaXF1ZShpc29fZGZbaXNvX2RmJEV4cGVyaW1lbnQgPT0gImFyYyIgJiBpc29fZGYkUGVyaW9kID09ICJpbmMiLCAiSUQiXSkKYXJjLmN0bC5pbmMuMTNjIDwtIGRhdGEuZnJhbWUoSUQgPSBhcmMuY3RsLmluYy5JRHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZU5hbWUgPSBhcmMuY3RsLmluYy5JRHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQxM2MgPSB4cGxyLmN0bC5pc29bd2hpY2goIWlzLm5hKG1hdGNoKHhwbHIuY3RsLmlzbyRFUF9QbG90aWQsIGFyYy5jdGwuaW5jLklEcykpKSwgIjEzY19DTzIiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwZXJpbWVudCA9ICJhcmMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJpb2QgPSAiaW5jIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJlYXRtZW50ID0gImNvbnRyb2wiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlID0gaWZlbHNlKGdyZXBsKCJHIiwgYXJjLmN0bC5pbmMuSURzKSwgIkciLCAiRiIpKQppc29fZGYgPC0gcmJpbmQoaXNvX2RmLCBhcmMuY3RsLmluYy4xM2MpCiMgZ2dwbG90KGlzb19kZiwgYWVzKElELCBkMTNjLCBjb2xvciA9IFRyZWF0bWVudCwgc2hhcGUgPSBQZXJpb2QpKSArCiMgICAgIGdlb21fcG9pbnQoc2l6ZSA9IDMpICsKIyAgICAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhFeHBlcmltZW50KSkgKwojICAgICB0aGVtZV9idygpCmBgYAoKCmBgYHtyIGNvdW50cyBmb3IgY2hlY2tpbmcgcGxvdHMsIGluY2x1ZGUgPSBGQUxTRX0KIyA4LiBDb3VudCBudW1iZXIgb2YgXjE0XkMgb2JzZXJ2YXRpb25zIGZvciBjaGVja2luZyBwbG90cy4KIyBjb3VudCAhaXMubmEoMTRDKSBjYXNlcyBieSBTYW1wbGVOYW1lCmFsbC4xNGNbLXdoaWNoKGlzLm5hKGFsbC4xNGMkZDE0Y19jb3JyKSksXSAlPiUKICBncm91cF9ieShFeHBlcmltZW50LCBUcmVhdG1lbnQsIFBlcmlvZCwgVHlwZSkgJT4lCiAgY291bnQoKQojIGJ5IElECmFsbC4xNGNbLXdoaWNoKGlzLm5hKGFsbC4xNGMkZDE0Y19jb3JyKSksXSAlPiUKICBncm91cF9ieShFeHBlcmltZW50LCBUcmVhdG1lbnQsIFBlcmlvZCwgVHlwZSkgJT4lCiAgZGlzdGluY3QoSUQpICU+JQogIGNvdW50KCkKYGBgCgoqUHJlLWluY3ViYXRpb24gdmVyc3VzIGVxdWlsaWJyaXVtIHJlc3BpcmF0aW9uIF4xNF5DLUNPfjJ+KgoKYGBge3IgcHJlLWluYy0xNGMtcGxvdH0KYWxsLjE0Yy5wcmUuaW5jIDwtIG1lcmdlKGFsbC4xNGMuc3VtLmRmW2FsbC4xNGMuc3VtLmRmJFBlcmlvZCA9PSAicHJlIiwgYygiSUQiLCAiRXhwZXJpbWVudCIsICJUeXBlIiwgIlRyZWF0bWVudCIsICJkMTRjX2NvcnJfbWVhbiIsICJkMTRjX2NvcnJfbWluIiwgImQxNGNfY29ycl9tYXgiKV0sCiAgICAgICAgICAgICAgICAgICAgICAgICBhbGwuMTRjLnN1bS5kZlthbGwuMTRjLnN1bS5kZiRQZXJpb2QgPT0gImluYyIsIGMoIklEIiwgIkV4cGVyaW1lbnQiLCAiVHlwZSIsICJUcmVhdG1lbnQiLCAiZDE0Y19jb3JyX21lYW4iLCAiZDE0Y19jb3JyX21pbiIsICJkMTRjX2NvcnJfbWF4IildLAogICAgICAgICAgICAgICAgICAgICAgICAgYnkgPSBjKCJJRCIsICJFeHBlcmltZW50IiwgIlR5cGUiLCAiVHJlYXRtZW50IiksCiAgICAgICAgICAgICAgICAgICAgICAgICBzdWZmaXhlcyA9IGMoIl9wcmUiLCAiX2luYyIpKQphbGwuMTRjLnByZS5pbmMkdHJlYXQuYmkgPC0gaWZlbHNlKGFsbC4xNGMucHJlLmluYyRUcmVhdG1lbnQgPT0gImNvbnRyb2wiLCAiY29udHJvbCIsICJ0cmVhdG1lbnQiKQoKIyBzYXZlCnNhdmUoYWxsLjE0Yy5wcmUuaW5jLCBmaWxlID0gIi4vYWxsLjE0Yy5wcmUuaW5jLlJEYXRhIikKCmFsbC4xNGMucHJlLmluYyAlPiUKICBmaWx0ZXIoRXhwZXJpbWVudCAhPSAidG1lIikgJT4lCiAgZ2dwbG90KC4sIGFlcyhkMTRjX2NvcnJfbWVhbl9wcmUsIGQxNGNfY29ycl9tZWFuX2luYywgY29sb3IgPSBUeXBlLCBzaGFwZSA9IFRyZWF0bWVudCkpICsKICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDApICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBjb2xvciA9ICJncmF5IikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGNvbG9yID0gImdyYXkiKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIGdlb21fZXJyb3JiYXIoCiAgICBhZXMoeW1pbiA9IGQxNGNfY29ycl9taW5faW5jLCAKICAgICAgICB5bWF4ID0gZDE0Y19jb3JyX21heF9pbmMsIAogICAgICAgIGNvbG9yID0gVHlwZSksIAogICAgd2lkdGggPSAuMjUpICsKICBnZW9tX2Vycm9yYmFyaCgKICAgIGFlcyh4bWluID0gZDE0Y19jb3JyX21pbl9wcmUsIAogICAgICAgIHhtYXggPSBkMTRjX2NvcnJfbWF4X3ByZSwgCiAgICAgICAgY29sb3IgPSBUeXBlKSwgCiAgICBoZWlnaHQgPSAuOSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gJ0Vjb3N5c3RlbScsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9YygnRic9JyNhMzU1MTMnLCdHJz0nIzEzNjFhMycpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCdGb3Jlc3QnLCdHcmFzc2xhbmQnKSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gJ1RyZWF0bWVudCcsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImNvbnRyb2wiID0gMTYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpci1kcnkiID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeSArIHN0b3JhZ2UiID0gMCksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoImNvbnRyb2wiID0gImNvbnRyb2wtMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpci1kcnkiID0gImFpci1kcnkvcmV3ZXQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5ICsgc3RvcmFnZSIgPSAiYWlyLWRyeS9yZXdldCArIHN0b3JhZ2UiKSkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKC02MCwgMTE1KSkgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKC02MCwgMTE1KSkgKwogIHhsYWIoZXhwcmVzc2lvbignUmV3ZXR0aW5nIHB1bHNlICcqRGVsdGEqJydeMTQqJ0MtQ08nWzJdKicgKOKAsCknKSkgKwogIHlsYWIoZXhwcmVzc2lvbignRXF1aWxpYnJpdW0gcmVzcGlyYXRpb24gJypEZWx0YSonJ14xNConQy1DTydbMl0qJyAo4oCwKScpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQua2V5LmhlaWdodD11bml0KC44LCAiY20iKSwKICAgICAgICBhc3BlY3QucmF0aW8gPSAxKQpgYGAKPioqRmlnLiBgciB7ZmlnLm4gKyAxfWAuICRcRGVsdGEkXjE0XkMtQ09+Mn4gb2YgdGhlIHJld2V0dGluZyBwdWxzZSBhbmQgdGhlIGVxdWlsaWJyaXVtIHJlc3BpcmF0aW9uIHBlcmlvZCoqCgo+KkNhcHRpb246KiBQb2ludHMgYXJlIG1lYW5zIG9mIGxhYm9yYXRvcnkgZHVwbGljYXRlcyBhbmQgZXJyb3IgYmFycyBhcmUgdGhlIG1pbiBhbmQgbWF4IChleGNlcHQgZm9yIEV4cGVyaW1lbnQgMSBjb250cm9sIHNhbXBsZXMsIHdoaWNoIHdlcmUgbm90IHJlcGxpY2F0ZWQpLiBOb3RlIHRoYXQgcmV3ZXR0aW5nIHB1bHNlICRcRGVsdGEkXjE0XkMgd2FzIG5vdCBtZWFzdXJlZCBmb3IgY29udHJvbC0xIHNhbXBsZXM7IGFkZGl0aW9uYWxseSBzYW1wbGVzIGZyb20gdGhyZWUgb2YgdGhlIGZvcmVzdCBwbG90cyBvZiB0aGUgYWlyLWRyeSArIHN0b3JhZ2Ugc2FtcGxlcyBmcm9tIEV4cGVyaW1lbnQgMSBmYWlsZWQgdG8gYWNjdW11bGF0ZSBlbm91Z2ggQ09+Mn4gZHVyaW5nIHRoZSBwcmUtaW5jdWJhdGlvbiBwZXJpb2QgdG8gbWVhc3VyZSAkXERlbHRhJF4xNF5DLiBUaGUgb3V0bGllciBwb2ludCB3aXRoIHRoZSBzdWJzdGFudGlhbGx5IGRlcGxldGVkIHByZS1pbmN1YmF0aW9uICRcRGVsdGEkXjE0XkMgaXMgZnJvbSBFeHBlcmltZW50IDIgKGNvbnRyb2wpLgoKYGBge3IgcHJlLWluYy0xM2MtcGxvdCwgaW5jbHVkZSA9IEZBTFNFfQppc28uMTIuYXZnIDwtIGlzb19kZiAlPiUKICBzZWxlY3QoSUQsIEV4cGVyaW1lbnQsIFBlcmlvZCwgVHJlYXRtZW50LCBkMTNjKSAlPiUKICBncm91cF9ieShJRCwgRXhwZXJpbWVudCwgUGVyaW9kLCBUcmVhdG1lbnQpICU+JQogIGFkZF9jb3VudCgpICU+JQogIHN1bW1hcml6ZV9hbGwobGlzdChtZWFuID0gbWVhbiwgc2QgPSBzZCksIG5hLnJtID0gVFJVRSkgJT4lCiAgbXV0YXRlKGQxM2Nfc2UgPSBkMTNjX3NkL25fbWVhbiwKICAgICAgICAgIGQxM2NfdSA9IGQxM2NfbWVhbiArIGQxM2Nfc2UqMiwKICAgICAgICAgIGQxM2NfbCA9IGQxM2NfbWVhbiAtIGQxM2Nfc2UqMikKCmlzby4xMi5hdmckVHlwZSA8LSBpZmVsc2UoZ3JlcGwoIkciLCBpc28uMTIuYXZnJElEKSwgIkciLCAiRiIpCmlzby4xMi5hdmcgPC0gZGF0YS5mcmFtZShpc28uMTIuYXZnKQoKIyBzdGF0cwojIGFpci1kcnkgKyBzdG9yYWdlCiMgZm9yZXN0CnQudGVzdChpc28uMTIuYXZnW2lzby4xMi5hdmckUGVyaW9kID09ICJpbmMiICYgaXNvLjEyLmF2ZyRUcmVhdG1lbnQgPT0gImFpci1kcnkgKyBzdG9yYWdlIiAmIGlzby4xMi5hdmckVHlwZSA9PSAiRiIsICJkMTNjX21lYW4iXSwKICAgICAgIGlzby4xMi5hdmdbaXNvLjEyLmF2ZyRQZXJpb2QgPT0gImluYyIgJiBpc28uMTIuYXZnJEV4cGVyaW1lbnQgPT0gImFyYyIgJiBpc28uMTIuYXZnJFRyZWF0bWVudCA9PSAiY29udHJvbCIgJiBpc28uMTIuYXZnJFR5cGUgPT0gIkYiLCAiZDEzY19tZWFuIl0sIAogICAgICAgdGFpbHMgPSAyLCBwYWlyZWQgPSBUUlVFKQoKIyBncmFzc2xhbmQKdC50ZXN0KGlzby4xMi5hdmdbaXNvLjEyLmF2ZyRQZXJpb2QgPT0gImluYyIgJiBpc28uMTIuYXZnJFRyZWF0bWVudCA9PSAiYWlyLWRyeSArIHN0b3JhZ2UiICYgaXNvLjEyLmF2ZyRUeXBlID09ICJHIiwgImQxM2NfbWVhbiJdLAogICAgICAgaXNvLjEyLmF2Z1tpc28uMTIuYXZnJFBlcmlvZCA9PSAiaW5jIiAmIGlzby4xMi5hdmckRXhwZXJpbWVudCA9PSAiYXJjIiAmIGlzby4xMi5hdmckVHJlYXRtZW50ID09ICJjb250cm9sIiAmIGlzby4xMi5hdmckVHlwZSA9PSAiRyIsICJkMTNjX21lYW4iXSwKICAgICAgIHRhaWxzID0gMiwgcGFpcmVkID0gVFJVRSkKCiMgYWlyLWRyeSBvbmx5CiMgZm9yZXN0CnQudGVzdChpc28uMTIuYXZnW2lzby4xMi5hdmckUGVyaW9kID09ICJpbmMiICYgaXNvLjEyLmF2ZyRUcmVhdG1lbnQgPT0gImFpci1kcnkiICYgaXNvLjEyLmF2ZyRUeXBlID09ICJGIiwgImQxM2NfbWVhbiJdLAogICAgICAgaXNvLjEyLmF2Z1tpc28uMTIuYXZnJFBlcmlvZCA9PSAiaW5jIiAmIGlzby4xMi5hdmckRXhwZXJpbWVudCA9PSAicmV3ZXQiICYgaXNvLjEyLmF2ZyRUcmVhdG1lbnQgPT0gImNvbnRyb2wiICYgaXNvLjEyLmF2ZyRUeXBlID09ICJGIiwgImQxM2NfbWVhbiJdLAogICAgICAgdGFpbHMgPSAyLCBwYWlyZWQgPSBUUlVFKQoKIyBncmFzc2xhbmQKdC50ZXN0KGlzby4xMi5hdmdbaXNvLjEyLmF2ZyRQZXJpb2QgPT0gImluYyIgJiBpc28uMTIuYXZnJFRyZWF0bWVudCA9PSAiYWlyLWRyeSIgJiBpc28uMTIuYXZnJFR5cGUgPT0gIkciLCAiZDEzY19tZWFuIl0sCiAgICAgICBpc28uMTIuYXZnW2lzby4xMi5hdmckUGVyaW9kID09ICJpbmMiICYgaXNvLjEyLmF2ZyRFeHBlcmltZW50ID09ICJyZXdldCIgJiBpc28uMTIuYXZnJFRyZWF0bWVudCA9PSAiY29udHJvbCIgJiBpc28uMTIuYXZnJFR5cGUgPT0gIkciLCAiZDEzY19tZWFuIl0sIAogICAgICAgdGFpbHMgPSAyLCBwYWlyZWQgPSBUUlVFKQoKaXNvLjEyLnByZS5pbmMgPC0gbWVyZ2UoaXNvLjEyLmF2Z1tpc28uMTIuYXZnJFBlcmlvZCA9PSAicHJlIiwgYygiSUQiLCAiRXhwZXJpbWVudCIsICJUeXBlIiwgIlRyZWF0bWVudCIsICJkMTNjX21lYW4iLCAiZDEzY191IiwgImQxM2NfbCIpXSwKICAgICAgICAgICAgICAgICAgICAgICAgaXNvLjEyLmF2Z1tpc28uMTIuYXZnJFBlcmlvZCA9PSAiaW5jIiwgYygiSUQiLCAiRXhwZXJpbWVudCIsICJUeXBlIiwgIlRyZWF0bWVudCIsICJkMTNjX21lYW4iLCAiZDEzY191IiwgImQxM2NfbCIpXSwKICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gYygiSUQiLCAiRXhwZXJpbWVudCIsICJUeXBlIiwgIlRyZWF0bWVudCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgc3VmZml4ZXMgPSBjKCJfcHJlIiwgIl9pbmMiKSkKaXNvLjEyLnByZS5pbmMkdHJlYXQuYmkgPC0gaWZlbHNlKGlzby4xMi5wcmUuaW5jJFRyZWF0bWVudCA9PSAiY29udHJvbCIsICJjb250cm9sIiwgInRyZWF0bWVudCIpCnNhdmUoaXNvLjEyLnByZS5pbmMsIGZpbGUgPSAiaXNvLjEyLnByZS5pbmMuUkRhdGEiKQoKIyByYW5nZShjKGlzby4xMi5wcmUuaW5jJGQxM2NfbF9wcmUsIGlzby4xMi5wcmUuaW5jJGQxM2NfbF9pbmMsIGlzby4xMi5wcmUuaW5jJGQxM2NfdV9pbmMsIGlzby4xMi5wcmUuaW5jJGQxM2NfbF9pbmMpLCBuYS5ybSA9IFRSVUUpCmlzby4xMi5wcmUuaW5jICU+JQogIGdncGxvdCguLCBhZXMoZDEzY19tZWFuX3ByZSwgZDEzY19tZWFuX2luYywgY29sb3IgPSBUeXBlLCBzaGFwZSA9IFRyZWF0bWVudCkpICsKICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDApICsKICBnZW9tX3BvaW50KHNpemUgPSAzKSArCiAgZ2VvbV9lcnJvcmJhcigKICAgIGFlcyh5bWluID0gZDEzY19sX2luYywgCiAgICAgICAgeW1heCA9IGQxM2NfdV9pbmMsIAogICAgICAgIGNvbG9yID0gVHlwZSksIAogICAgd2lkdGggPSAuMjUpICsKICBnZW9tX2Vycm9yYmFyaCgKICAgIGFlcyh4bWluID0gZDEzY19sX3ByZSwgCiAgICAgICAgeG1heCA9IGQxM2NfdV9wcmUsCiAgICAgICAgY29sb3IgPSBUeXBlKSwgCiAgICBoZWlnaHQgPSAuMjUpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICdFY29zeXN0ZW0nLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPWMoJ0YnPScjYTM1NTEzJywnRyc9JyMxMzYxYTMnKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnRm9yZXN0JywnR3Jhc3NsYW5kJykpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICdUcmVhdG1lbnQnLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJjb250cm9sIiA9IDE2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5IiA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpci1kcnkgKyBzdG9yYWdlIiA9IDApLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJjb250cm9sIiA9ICJjb250cm9sLTEgKDIwMTEpXG5jb250cm9sLTIgKDIwMTkpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeSIgPSAiYWlyLWRyeSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpci1kcnkgKyBzdG9yYWdlIiA9ICJhaXItZHJ5ICsgc3RvcmFnZSIpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoLTI5LjEsIC0yMi4yNSkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtMjkuMSwgLTIyLjI1KSkgKwogIHhsYWIoZXhwcmVzc2lvbignUHJlLWluY3ViYXRpb24gJypkZWx0YSonJ14xMyonQyAo4oCwKScpKSArCiAgeWxhYihleHByZXNzaW9uKCdFcXVpbGlicml1bSByZXNwaXJhdGlvbiAnKmRlbHRhKicnXjEzKidDICjigLApJykpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC5rZXkuaGVpZ2h0PXVuaXQoLjgsICJjbSIpLAogICAgICAgIGFzcGVjdC5yYXRpbyA9IDEpCmBgYAoKYGBge3IgcHJlLWVxdS0xNGMtc3RhdHMsIGluY2x1ZGUgPSBGQUxTRX0KIyBnYXRoZXIgcHJlIGFuZCBpbmMgZGF0YSBmcm9tIGFsbCByZXBzLCBhcmMgYW5kIHJld2V0IGV4cCBvbmx5CmoudmFycyA8LSBjKCJTYW1wbGVOYW1lIiwgIlNpdGUiLCAiSUQiLCAiRXhwZXJpbWVudCIsICJUcmVhdG1lbnQiLCAiVHlwZSIsICJkMTRjX2NvcnIiLCAibWdDTzIuQ19nQyIpCmFyYy5yZXdldC5wcmUuMTRjIDwtIGJpbmRfcm93cyhsYXBwbHkoYWxsLjE0Yy5scywgZnVuY3Rpb24oZGYpIHsKICBpZighaXMubnVsbChkZiRtZ0NPMi5DX2dDKSkgewogICAgICBkZiA8LSBkZlt3aGljaChkZiRQZXJpb2QgPT0gInByZSIgJiBkZiRFeHBlcmltZW50ICE9ICJ0bWUiKSwgai52YXJzXQogICAgICBkZiR0cmVhdC5iaSA8LSBpZmVsc2UoZGYkVHJlYXRtZW50ID09ICJjb250cm9sIiwgImNvbnRyb2wiLCAidHJlYXRtZW50IikKICByZXR1cm4oZGYpCiAgfQp9KSkKYXJjLnJld2V0LmluYy4xNGMgPC0gYmluZF9yb3dzKGxhcHBseShhbGwuMTRjLmxzLCBmdW5jdGlvbihkZikgewogIGlmKCFpcy5udWxsKGRmJG1nQ08yLkNfZ0MpKSB7CiAgZGYgPC0gZGZbd2hpY2goZGYkUGVyaW9kID09ICJpbmMiICYgZGYkRXhwZXJpbWVudCAhPSAidG1lIiksIGoudmFyc10KICBkZiR0cmVhdC5iaSA8LSBpZmVsc2UoZGYkVHJlYXRtZW50ID09ICJjb250cm9sIiwgImNvbnRyb2wiLCAidHJlYXRtZW50IikKICByZXR1cm4oZGYpCiAgfQp9KSkKYXJjLnJld2V0LjE0YyA8LSBtZXJnZShhcmMucmV3ZXQucHJlLjE0YywgYXJjLnJld2V0LmluYy4xNGMsIAogICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gYyhqLnZhcnNbMTo2XSwgInRyZWF0LmJpIiksIHN1ZmZpeGVzID0gYygiX3ByZSIsICJfaW5jIikpCmFyYy5yZXdldC4xNGMkWWVhclNhbXBsZWQgPC0gaWZlbHNlKGdyZXBsKCJhcmMiLCBhcmMucmV3ZXQuMTRjJEV4cGVyaW1lbnQpLCAyMDExLCAyMDE5KQpzYXZlKGFyYy5yZXdldC4xNGMsIGZpbGUgPSAiYXJjLnJld2V0LjE0Yy5SRGF0YSIpCmBgYAoKYGBge3IgcHJlLWVxdS0xM2Mtc3RhdHMsIGluY2x1ZGUgPSBGQUxTRX0KIyBnYXRoZXIgcHJlIGFuZCBpbmMgZGF0YSBmcm9tIGFsbCByZXBzLCBhcmMgYW5kIHJld2V0IGV4cCBvbmx5Cmlzb19kZiR0cmVhdC5iaSA8LSBpZmVsc2UoaXNvX2RmJFRyZWF0bWVudCA9PSAiY29udHJvbCIsICJjb250cm9sIiwgInRyZWF0bWVudCIpCmFyYy5yZXdldC4xM2Muc3RhdHMubHMgPC0gbGFwcGx5KAogIHNwbGl0KGlzb19kZiwgaXNvX2RmJEV4cGVyaW1lbnQpLCBmdW5jdGlvbihleHApIAogICAgbGFwcGx5KHNwbGl0KGV4cCwgZXhwJFBlcmlvZCksIGZ1bmN0aW9uKHBlcikgCiAgICAgIGxhcHBseShzcGxpdChwZXIsIHBlciR0cmVhdC5iaSksIGZ1bmN0aW9uKHRydCkgewogICAgICAgICAgICAjIGNhbGN1bGF0ZSBtZWFuIGFuZCB2YXIgb2YgcmVwcwogICAgICAgICAgICAgIGJpbmRfcm93cygKICAgICAgICAgICAgICAgIGxhcHBseShzcGxpdCh0cnQsIHRydCRJRCksIGZ1bmN0aW9uKGlkKSB7CiAgICAgICAgICAgICAgICAgIGRhdGEuZnJhbWUobSA9IG1lYW4oaWQkZDEzYyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHZhcihpZCRkMTNjKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlID0gdW5pcXVlKGlkJFR5cGUpKQogICAgICAgICAgICAgICAgfSksIC5pZCA9ICJJRCIpfSkpKQoKIyBjYWxjdWxhdGUgbWVhbiByZXAgdmFyCm1lYW4ucmVwLnZhci4xM2MgPC0gbWVhbih1bmxpc3QobGFwcGx5KGFyYy5yZXdldC4xM2Muc3RhdHMubHMsIGZ1bmN0aW9uKGV4cCkKICBsYXBwbHkoZXhwLCBmdW5jdGlvbihwZXIpCiAgICBsYXBwbHkocGVyLCBmdW5jdGlvbih0cnQpIHsKICAgICAgbWVhbih0cnQkdiwgbmEucm0gPSBUKQogICAgfSkpKSksIG5hLnJtID0gVCkKCiMgYWRkIHJlcCB2YXIgYXMgbmVlZGVkCmFyYy5yZXdldC4xM2Muc3RhdHMubHMgPC0gbGFwcGx5KGFyYy5yZXdldC4xM2Muc3RhdHMubHMsIGZ1bmN0aW9uKGV4cCkKICBsYXBwbHkoZXhwLCBmdW5jdGlvbihwZXIpCiAgICBsYXBwbHkocGVyLCBmdW5jdGlvbih0cnQpIHsKICAgICAgdHJ0JHYgPC0gaWZlbHNlKGlzLm5hKHRydCR2KSwgbWVhbi5yZXAudmFyLjEzYywgdHJ0JHYpCiAgICAgIHJldHVybih0cnQpCiAgICAgIH0pKSkKCiMgY2FsY3VsYXRlIGdyYW5kIG1lYW4gYW5kIHBvb2xlZCBzZCB3aXRoaW4gZXhwLCB0cnQsIHR5cGUKIyBmb3IgcGxvdHRpbmcgMTNDCmFyYy5yZXdldC4xM2MucG9vbGVkIDwtIGJpbmRfcm93cyhsYXBwbHkoYXJjLnJld2V0LjEzYy5zdGF0cy5scywgZnVuY3Rpb24oZXhwKQogIGJpbmRfcm93cyhsYXBwbHkoZXhwLCBmdW5jdGlvbihwZXIpCiAgICBiaW5kX3Jvd3MobGFwcGx5KHBlciwgZnVuY3Rpb24odHJ0KQogICAgICBiaW5kX3Jvd3MobGFwcGx5KHNwbGl0KHRydCwgdHJ0JFR5cGUpLCBmdW5jdGlvbihpZC5zdW0pIHsKICAgICAgICBkIDwtIHNhbXBsZS5kZWNvbXAobiA9IHJlcCgyLCBsZW5ndGgoaWQuc3VtJG0pKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlLm1lYW4gPSBpZC5zdW0kbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlLnZhciA9IGlkLnN1bSR2LAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlLnNkID0gVFJVRSkKICAgICAgICByZXR1cm4oZFtncmVwbCgicG9vbGVkIiwgcm93bmFtZXMoZCkpLCBdKQogICAgICB9KSwgLmlkID0gIlR5cGUiKSksIC5pZCA9ICJ0cmVhdC5iaSIpKSwgLmlkID0gIlBlcmlvZCIpKSwgLmlkID0gIkV4cGVyaW1lbnQiKQpzYXZlKGFyYy5yZXdldC4xM2MucG9vbGVkLCBmaWxlID0gImFyYy5yZXdldC4xM2MucG9vbGVkLlJEYXRhIikKCiMgQ2FsY3VsYXRlIG1lYW4gZGlmZmVyZW5jZXMgYmV0d2VlbiBlbmNsb3N1cmUgcGVyaW9kcwphcmMucmV3ZXQuMTNjLnByZS5pbmMubHMgPC0gbGFwcGx5KGFyYy5yZXdldC4xM2Muc3RhdHMubHMsIGZ1bmN0aW9uKGV4cCkgewogIHBlci5scyA8LSBsYXBwbHkoZXhwLCBmdW5jdGlvbihwZXIpIGJpbmRfcm93cyhwZXIsIC5pZCA9ICJ0cmVhdC5iaSIpKQogIHByZS5pbmMuZGYgPC0gbWVyZ2UoCiAgICBwZXIubHNbWzFdXSwgcGVyLmxzW1syXV0sIGJ5ID0gYygiSUQiLCAidHJlYXQuYmkiKSwgc3VmZml4ZXMgPSBuYW1lcyhwZXIubHMpKQogICMgY2FsY3VsYXRlIG1lYW4gZGlmZmVyZW5jZQogIHByZS5pbmMuZGYkZGlmIDwtIHByZS5pbmMuZGYkbXByZSAtIHByZS5pbmMuZGYkbWluYwogICMgc3VtIHZhcmlhbmNlcwogIHByZS5pbmMuZGYkdmRpZiA8LSBwcmUuaW5jLmRmJHZwcmUgKyBwcmUuaW5jLmRmJHZpbmMKICBwcmUuaW5jLmRmJFR5cGUgPC0gcHJlLmluYy5kZiRUeXBlcHJlCiAgcmV0dXJuKHByZS5pbmMuZGZbICwgYygiSUQiLCAiZGlmIiwgInZkaWYiLCAiVHlwZSIsICJ0cmVhdC5iaSIpXSkKfSkKCiMgY2FsY3VsYXRlIG1lYW4gb2YgbWVhbiBkaWZmZXJlbmNlIGFuZCBwb29sZWQgdmFyaWFuY2UKYXJjLnJld2V0LjEzYy5wcmUuaW5jLnN0YXRzIDwtIGxhcHBseShhcmMucmV3ZXQuMTNjLnByZS5pbmMubHMsIGZ1bmN0aW9uKGV4cCkKICBsYXBwbHkoc3BsaXQoZXhwLCBleHAkdHJlYXQuYmkpLCBmdW5jdGlvbih0cnQpCiAgICBsYXBwbHkoc3BsaXQodHJ0LCB0cnQkVHlwZSksIGZ1bmN0aW9uKGlkLnN1bSkgewogICAgICBzYW1wbGUuZGVjb21wKG4gPSByZXAoMiwgbGVuZ3RoKGlkLnN1bSRkaWYpKSwKICAgICAgICAgICAgICAgICAgICBzYW1wbGUubWVhbiA9IGlkLnN1bSRkaWYsCiAgICAgICAgICAgICAgICAgICAgc2FtcGxlLnZhciA9IGlkLnN1bSR2ZGlmLAogICAgICAgICAgICAgICAgICAgIGluY2x1ZGUuc2QgPSBUUlVFKX0pKSkKCiMgQ2FsY3VsYXRlIG1lYW4gZGlmZmVyZW5jZXMgZm9yIDJuZCBlbmNsb3N1cmUgcGVyaW9kICgiaW5jIikKYXJjLnJld2V0LjEzYy5pbmMuZGlmLmxzIDwtIGxhcHBseShhcmMucmV3ZXQuMTNjLnN0YXRzLmxzLCBmdW5jdGlvbihleHApIHsKICBpbmMubHMgPC0gdW5saXN0KGV4cFt3aGljaChuYW1lcyhleHApID09ICJpbmMiKV0sIHJlY3Vyc2l2ZSA9IEZBTFNFKSAKICBpbmMuZGYgPC0gbWVyZ2UoaW5jLmxzW1sxXV0sIGluYy5sc1tbMl1dLCBieSA9ICJJRCIsIHN1ZmZpeGVzID0gbmFtZXMoZXhwJGluYykpCiAgIyBjYWxjdWxhdGUgbWVhbiBkaWZmZXJlbmNlCiAgaW5jLmRmJGRpZiA8LSBpbmMuZGYkbXRyZWF0bWVudCAtIGluYy5kZiRtY29udHJvbAogICMgc3VtIHZhcmlhbmNlcwogIGluYy5kZiR2ZGlmIDwtIGluYy5kZiR2Y29udHJvbCArIGluYy5kZiR2dHJlYXRtZW50CiAgaW5jLmRmJFR5cGUgPC0gaW5jLmRmJFR5cGVjb250cm9sCiAgcmV0dXJuKGluYy5kZlsgLCBjKCJJRCIsICJkaWYiLCAidmRpZiIsICJUeXBlIildKQp9KQoKIyBjYWxjdWxhdGUgbWVhbiBvZiBtZWFuIGRpZmZlcmVuY2UgYW5kIHBvb2xlZCB2YXJpYW5jZQphcmMucmV3ZXQuMTNjLnN0YXRzLmluYy5scyA8LSBsYXBwbHkoYXJjLnJld2V0LjEzYy5pbmMuZGlmLmxzLCBmdW5jdGlvbihleHApIHsKICBsYXBwbHkoc3BsaXQoZXhwLCBleHAkVHlwZSksIGZ1bmN0aW9uKGlkLnN1bSkgewogICAgc2FtcGxlLmRlY29tcChuID0gcmVwKDIsIGxlbmd0aChpZC5zdW0kZGlmKSksCiAgICAgICAgICAgICAgICAgIHNhbXBsZS5tZWFuID0gaWQuc3VtJGRpZiwKICAgICAgICAgICAgICAgICAgc2FtcGxlLnZhciA9IGlkLnN1bSR2ZGlmLAogICAgICAgICAgICAgICAgICBpbmNsdWRlLnNkID0gVFJVRSkKICB9KQp9KQpgYGAKCiMjIFRyZWF0bWVudCBlZmZlY3Qgb24gJFxEZWx0YSReMTReQy1DT34yfiBmb3IgYWxsIHNhbXBsZXMgKEV4cGVyaW1lbnRzIDEsIDIsIGFuZCAzKQoKYGBge3Igc3RhdHMtMjAyMS0wNS0yMX0KIyBjYWxjdWxhdGUgbWVhbnMgYW5kIHZhcmlhbmNlcyB3aXRoaW4gZXhwZXJpbWVudCwgcGVyaW9kLCB0eXBlLCBhbmQgSUQKYWxsLjE0Yy5kZiA8LSByYmluZChhbGwuMTRjLmxzW1sxXV0sCiAgICAgICAgICAgICAgICAgICAgYWxsLjE0Yy5sc1tbMl1dWywgd2hpY2gobmFtZXMoYWxsLjE0Yy5sc1tbMl1dKSAlaW4lIG5hbWVzKGFsbC4xNGMubHNbWzFdXSkpXSkKYWxsLjE0Yy5kZiR0cmVhdC5iaSA8LSBpZmVsc2UoYWxsLjE0Yy5kZiRUcmVhdG1lbnQgPT0gImNvbnRyb2wiLCAiY29udHJvbCIsICJ0cmVhdG1lbnQiKQoKYWxsLjE0Yy5zdGF0cy5scyA8LSBsYXBwbHkoCiAgIyBzcGxpdCBieSBFeHBlcmltZW50IGFuZCByZXN0cmljdCB0byBBIGhvcml6b24KICBzcGxpdChhbGwuMTRjLmRmW2FsbC4xNGMuZGYkSG9yaXpvbiA9PSAiQSIsIF0sIAogICAgICAgIGFsbC4xNGMuZGZbYWxsLjE0Yy5kZiRIb3Jpem9uID09ICJBIiwgIkV4cGVyaW1lbnQiXSksIGZ1bmN0aW9uKGV4cCkgewogICAgIyBzcGxpdCBieSBQZXJpb2QKICAgICAgICAgICMgZXhjbHVkZSBPYWsgUmlkZ2UKICAgICAgICAgICMgaWYgKGV4cFsxLCAiRXhwZXJpbWVudCJdID09ICJ0bWUiKSB7CiAgICAgICAgICAjICAgZXhwIDwtIGV4cFstd2hpY2goZXhwJFNpdGUgPT0gIlRlbm5lc3NlZSBWYWxsZXkiIHwgZXhwJFNpdGUgPT0gIldhbGtlciBCcmFuY2giKSwgXQogICAgICAgICAgIyB9CiAgICAgICAgICBsYXBwbHkoc3BsaXQoZXhwLCBleHAkUGVyaW9kKSwgZnVuY3Rpb24ocGVyKSB7CiAgICAgICAgICAgICMgc3BsaXQgYnkgVHJlYXRtZW50CiAgICAgICAgICAgIGxhcHBseShzcGxpdChwZXIsIHBlciR0cmVhdC5iaSksIGZ1bmN0aW9uKHRydCkgewogICAgICAgICAgICAjIGNhbGN1bGF0ZSBtZWFuIGFuZCB2YXIgb2YgcmVwcwogICAgICAgICAgICAgIGJpbmRfcm93cygKICAgICAgICAgICAgICAgIGxhcHBseShzcGxpdCh0cnQsIHRydCRJRCksIGZ1bmN0aW9uKGlkKSB7CiAgICAgICAgICAgICAgICAgIGRhdGEuZnJhbWUobSA9IG1lYW4oaWQkZDE0Y19jb3JyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gdmFyKGlkJGQxNGNfY29yciksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSA9IHVuaXF1ZShpZCRUeXBlKSkKICAgICAgICAgICAgICAgIH0pLCAuaWQgPSAiSUQiKQogICAgICAgICAgICB9KQogICAgICAgIH0pCiAgICAgIH0pCgojIFVzZSBtZWFuIG9mIHJlcGxpY2F0ZSB2YXJpYW5jZXMgYWNyb3NzIGFsbCBleHBlcmltZW50cyBmb3IgbWlzc2luZyB2YXJpYW5jZXMKbWVhbi5yZXAudmFyIDwtIG1lYW4oYyhhbGwuMTRjLnN0YXRzLmxzJHJld2V0JGluYyRjb250cm9sJHYsCiAgICAgICAgICAgICAgICAgICAgICAgYWxsLjE0Yy5zdGF0cy5scyRyZXdldCRpbmMkdHJlYXRtZW50JHYsCiAgICAgICAgICAgICAgICAgICAgICAgYWxsLjE0Yy5zdGF0cy5scyRhcmMkaW5jJHRyZWF0bWVudCR2LAogICAgICAgICAgICAgICAgICAgICAgIGFsbC4xNGMuc3RhdHMubHMkdG1lJGluYyRjb250cm9sJHYpLCBuYS5ybSA9IFRSVUUpCiMgYWRkIHZhciB3aGVyZSBuZWVkZWQKYWxsLjE0Yy5zdGF0cy5scyA8LSBsYXBwbHkoYWxsLjE0Yy5zdGF0cy5scywgZnVuY3Rpb24oZXhwKSB7CiAgbGFwcGx5KGV4cCwgZnVuY3Rpb24ocGVyKSB7CiAgICBsYXBwbHkocGVyLCBmdW5jdGlvbih0cnQpIHsKICAgICAgdHJ0JHYgPC0gaWZlbHNlKGlzLm5hKHRydCR2KSwgbWVhbi5yZXAudmFyLCB0cnQkdikKICAgICAgcmV0dXJuKHRydCkKICAgICAgfSkKICAgIH0pCiAgfSkKCiMgY2FsY3VsYXRlIGdyYW5kIG1lYW5zIGFuZCBwb29sZWQgdmFyaWFuY2Ugdy9pbiB0cmVhdG1lbnQgZ3JvdXBzIGFuZCB0eXBlcwphcmMucmV3ZXQuMTRjLnN0YXRzLmluYy5sczIgPC0gbGFwcGx5KGFsbC4xNGMuc3RhdHMubHNbMToyXSwgZnVuY3Rpb24oZXhwKQogIGxhcHBseShleHAsIGZ1bmN0aW9uKHBlcikKICAgIGxhcHBseShwZXIsIGZ1bmN0aW9uKHRydCkKICAgICAgbGFwcGx5KHNwbGl0KHRydCwgdHJ0JFR5cGUpLCBmdW5jdGlvbihpZC5zdW0pIHsKICAgICAgICBpZC5zdW0gPC0gaWQuc3VtWyFpcy5uYShpZC5zdW0kbSksIF0KICAgICAgICBkZiA8LSBzYW1wbGUuZGVjb21wKG4gPSByZXAoMiwgbGVuZ3RoKGlkLnN1bSRtKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlLm1lYW4gPSBpZC5zdW0kbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGUudmFyID0gaWQuc3VtJHYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZS5zZCA9IFRSVUUpCiAgICAgICAgZGZbLCAiSUQiXSA8LSBjKGlkLnN1bSRJRCwgInBvb2xlZCIpCiAgICAgICAgcmV0dXJuKGRmKQogICAgICB9KSkpKQoKIyBDYWxjdWxhdGUgbWVhbiBkaWZmZXJlbmNlcyBmb3IgMm5kIGVuY2xvc3VyZSBwZXJpb2QgKCJpbmMiKQphbGwuMTRjLnN0YXRzLmluYy5kaWYubHMgPC0gbGFwcGx5KGFsbC4xNGMuc3RhdHMubHMsIGZ1bmN0aW9uKGV4cCkgewogIGluYy5scyA8LSB1bmxpc3QoZXhwW3doaWNoKG5hbWVzKGV4cCkgPT0gImluYyIpXSwgcmVjdXJzaXZlID0gRkFMU0UpIAogIGluYy5kZiA8LSBtZXJnZShpbmMubHNbWzFdXSwgaW5jLmxzW1syXV0sIGJ5ID0gIklEIiwgc3VmZml4ZXMgPSBuYW1lcyhleHAkaW5jKSkKICAjIGNhbGN1bGF0ZSBtZWFuIGRpZmZlcmVuY2UKICBpbmMuZGYkZGlmIDwtIGluYy5kZiRtdHJlYXRtZW50IC0gaW5jLmRmJG1jb250cm9sCiAgIyBzdW0gdmFyaWFuY2VzCiAgaW5jLmRmJHZkaWYgPC0gaW5jLmRmJHZjb250cm9sICsgaW5jLmRmJHZ0cmVhdG1lbnQKICBpbmMuZGYkVHlwZSA8LSBpbmMuZGYkVHlwZWNvbnRyb2wKICByZXR1cm4oaW5jLmRmWyAsIGMoIklEIiwgImRpZiIsICJ2ZGlmIiwgIlR5cGUiKV0pCn0pCgojIGNhbGN1bGF0ZSBtZWFuIG9mIG1lYW4gZGlmZmVyZW5jZSBhbmQgcG9vbGVkIHZhcmlhbmNlCiMgYXJjLCByZXdldAphcmMucmV3ZXQuMTRjLnN0YXRzLmluYy5scyA8LSBsYXBwbHkoYWxsLjE0Yy5zdGF0cy5pbmMuZGlmLmxzWzE6Ml0sIGZ1bmN0aW9uKGV4cCkgewogIGxhcHBseShzcGxpdChleHAsIGV4cCRUeXBlKSwgZnVuY3Rpb24oaWQuc3VtKSB7CiAgICBkZiA8LSBzYW1wbGUuZGVjb21wKG4gPSByZXAoMiwgbGVuZ3RoKGlkLnN1bSRkaWYpKSwKICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlLm1lYW4gPSBpZC5zdW0kZGlmLAogICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGUudmFyID0gaWQuc3VtJHZkaWYsCiAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUuc2QgPSBUUlVFKQogICAgZGZbLCAiSUQiXSA8LSBjKGlkLnN1bSRJRCwgInBvb2xlZCIpCiAgICByZXR1cm4oZGYpCiAgfSkKfSkKc2F2ZShhcmMucmV3ZXQuMTRjLnN0YXRzLmluYy5scywgZmlsZSA9ICJhcmMucmV3ZXQuMTRjLnN0YXRzLmluYy5scy5SRGF0YSIpCgojIyB0bWUKIyBhbGwKdG1lLjE0Yy5zdGF0cyA8LSBzYW1wbGUuZGVjb21wKG4gPSByZXAoMiwgbnJvdyhhbGwuMTRjLnN0YXRzLmluYy5kaWYubHMkdG1lKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGUubWVhbiA9IGFsbC4xNGMuc3RhdHMuaW5jLmRpZi5scyR0bWUkZGlmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlLnZhciA9IGFsbC4xNGMuc3RhdHMuaW5jLmRpZi5scyR0bWUkdmRpZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUuc2QgPSBUUlVFKQp0bWUuY2k5NS5pbnQgPC0gdG1lLjE0Yy5zdGF0c1tucm93KHRtZS4xNGMuc3RhdHMpLCAic2FtcGxlLnNkIl0gLyBzcXJ0KHRtZS4xNGMuc3RhdHNbbnJvdyh0bWUuMTRjLnN0YXRzKSwgIm4iXSkgKiBxdCgwLjk3NSwgdG1lLjE0Yy5zdGF0c1tucm93KHRtZS4xNGMuc3RhdHMpLCAibiJdIC0gMSkKdG1lLmNpOTUgPC0gYyh0bWUuMTRjLnN0YXRzW25yb3codG1lLjE0Yy5zdGF0cyksICJzYW1wbGUubWVhbiJdIC0gdG1lLmNpOTUuaW50LAogICAgICAgICAgICAgIHRtZS4xNGMuc3RhdHNbbnJvdyh0bWUuMTRjLnN0YXRzKSwgInNhbXBsZS5tZWFuIl0gKyB0bWUuY2k5NS5pbnQpCgojIE9hayBSaWRnZQp0bWUuT1IgPC0gYWxsLjE0Yy5zdGF0cy5pbmMuZGlmLmxzJHRtZVtjKHdoaWNoKGdyZXBsKCJXQiIsIGFsbC4xNGMuc3RhdHMuaW5jLmRpZi5scyR0bWUkSUQpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaChncmVwbCgiVFZBIiwgYWxsLjE0Yy5zdGF0cy5pbmMuZGlmLmxzJHRtZSRJRCkpKSwgXQp0bWUuT1Iuc3RhdHMgPC0gc2FtcGxlLmRlY29tcChuID0gcmVwKDIsIG5yb3codG1lLk9SKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGUubWVhbiA9IHRtZS5PUiRkaWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGUudmFyID0gdG1lLk9SJHZkaWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlLnNkID0gVFJVRSkKdG1lLk9SLmNpOTUuaW50IDwtIHRtZS5PUi5zdGF0c1tucm93KHRtZS5PUi5zdGF0cyksICJzYW1wbGUuc2QiXSAvIHNxcnQodG1lLk9SLnN0YXRzW25yb3codG1lLk9SLnN0YXRzKSwgIm4iXSkgKiBxdCgwLjk3NSwgdG1lLk9SLnN0YXRzW25yb3codG1lLk9SLnN0YXRzKSwgIm4iXSAtIDEpCnRtZS5PUi5jaTk1IDwtIGModG1lLk9SLnN0YXRzW25yb3codG1lLk9SLnN0YXRzKSwgInNhbXBsZS5tZWFuIl0gLSB0bWUuT1IuY2k5NS5pbnQsCiAgICAgICAgICAgICAgICAgdG1lLk9SLnN0YXRzW25yb3codG1lLk9SLnN0YXRzKSwgInNhbXBsZS5tZWFuIl0gKyB0bWUuT1IuY2k5NS5pbnQpCiMgTm9uIE9hayBSaWRnZQp0bWUubm9uT1IgPC0gYWxsLjE0Yy5zdGF0cy5pbmMuZGlmLmxzJHRtZVstYXMubnVtZXJpYyhyb3cubmFtZXModG1lLk9SKSksIF0KdG1lLm5vbk9SLnN0YXRzIDwtIHNhbXBsZS5kZWNvbXAobiA9IHJlcCgyLCBucm93KHRtZS5ub25PUikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGUubWVhbiA9IHRtZS5ub25PUiRkaWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZS52YXIgPSB0bWUubm9uT1IkdmRpZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZS5zZCA9IFRSVUUpCnRtZS5ub25PUi5jaTk1LmludCA8LSB0bWUubm9uT1Iuc3RhdHNbbnJvdyh0bWUubm9uT1Iuc3RhdHMpLCAic2FtcGxlLnNkIl0gLyBzcXJ0KHRtZS5ub25PUi5zdGF0c1tucm93KHRtZS5ub25PUi5zdGF0cyksICJuIl0pICogcXQoMC45NzUsIHRtZS5ub25PUi5zdGF0c1tucm93KHRtZS5ub25PUi5zdGF0cyksICJuIl0gLSAxKQp0bWUubm9uT1IuY2k5NSA8LSBjKHRtZS5ub25PUi5zdGF0c1tucm93KHRtZS5ub25PUi5zdGF0cyksICJzYW1wbGUubWVhbiJdIC0gdG1lLm5vbk9SLmNpOTUuaW50LAogICAgICAgICAgICAgICAgICAgIHRtZS5ub25PUi5zdGF0c1tucm93KHRtZS5ub25PUi5zdGF0cyksICJzYW1wbGUubWVhbiJdICsgdG1lLm5vbk9SLmNpOTUuaW50KQojIG5vbk9SIEYKdG1lLm5vbk9SLkYgPC0gdG1lLm5vbk9SW3RtZS5ub25PUiRUeXBlID09ICJGIiwgXQp0bWUubm9uT1IuRi5zdGF0cyA8LSBzYW1wbGUuZGVjb21wKG4gPSByZXAoMiwgbnJvdyh0bWUubm9uT1IuRikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZS5tZWFuID0gdG1lLm5vbk9SLkYkZGlmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZS52YXIgPSB0bWUubm9uT1IuRiR2ZGlmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUuc2QgPSBUUlVFKQp0bWUubm9uT1IuRi5jaTk1LmludCA8LSB0bWUubm9uT1IuRi5zdGF0c1tucm93KHRtZS5ub25PUi5GLnN0YXRzKSwgInNhbXBsZS5zZCJdIC8KICBzcXJ0KHRtZS5ub25PUi5GLnN0YXRzW25yb3codG1lLm5vbk9SLkYuc3RhdHMpLCAibiJdKSAqIAogIHF0KDAuOTc1LCB0bWUubm9uT1IuRi5zdGF0c1tucm93KHRtZS5ub25PUi5GLnN0YXRzKSwgIm4iXSAtIDEpCnRtZS5ub25PUi5GLmNpOTUgPC0gYyh0bWUubm9uT1IuRi5zdGF0c1tucm93KHRtZS5ub25PUi5GLnN0YXRzKSwgInNhbXBsZS5tZWFuIl0gLSB0bWUubm9uT1IuRi5jaTk1LmludCwKICAgICAgICAgICAgICAgICAgICB0bWUubm9uT1IuRi5zdGF0c1tucm93KHRtZS5ub25PUi5GLnN0YXRzKSwgInNhbXBsZS5tZWFuIl0gKyB0bWUubm9uT1IuRi5jaTk1LmludCkKIyBub25PUiBHCnRtZS5ub25PUi5HIDwtIHRtZS5ub25PUlt0bWUubm9uT1IkVHlwZSA9PSAiRyIsIF0KdG1lLm5vbk9SLkcuc3RhdHMgPC0gc2FtcGxlLmRlY29tcChuID0gcmVwKDIsIG5yb3codG1lLm5vbk9SLkcpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGUubWVhbiA9IHRtZS5ub25PUi5HJGRpZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGUudmFyID0gdG1lLm5vbk9SLkckdmRpZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlLnNkID0gVFJVRSkKdG1lLm5vbk9SLkcuY2k5NS5pbnQgPC0gdG1lLm5vbk9SLkcuc3RhdHNbbnJvdyh0bWUubm9uT1IuRy5zdGF0cyksICJzYW1wbGUuc2QiXSAvCiAgc3FydCh0bWUubm9uT1IuRy5zdGF0c1tucm93KHRtZS5ub25PUi5HLnN0YXRzKSwgIm4iXSkgKiAKICBxdCgwLjk3NSwgdG1lLm5vbk9SLkcuc3RhdHNbbnJvdyh0bWUubm9uT1IuRy5zdGF0cyksICJuIl0gLSAxKQp0bWUubm9uT1IuRy5jaTk1IDwtIGModG1lLm5vbk9SLkcuc3RhdHNbbnJvdyh0bWUubm9uT1IuRy5zdGF0cyksICJzYW1wbGUubWVhbiJdIC0gdG1lLm5vbk9SLkcuY2k5NS5pbnQsCiAgICAgICAgICAgICAgICAgICAgdG1lLm5vbk9SLkcuc3RhdHNbbnJvdyh0bWUubm9uT1IuRy5zdGF0cyksICJzYW1wbGUubWVhbiJdICsgdG1lLm5vbk9SLkcuY2k5NS5pbnQpCgojIGNhbGN1bGF0ZSBmb3IgYWdncmVnYXRlZCBkYXRhc2V0CmFyYy5yZXdldC4xNGMuc3RhdHMuaW5jLmxzMiA8LSBsYXBwbHkoCiAgc3BsaXQoCiAgICBiaW5kX3Jvd3MobGFwcGx5KGFsbC4xNGMuc3RhdHMuaW5jLmRpZi5scywgZnVuY3Rpb24oZGYpIGJpbmRfcm93cyhkZiwgLmlkID0gInR5cGUiKSkpLAogICAgYmluZF9yb3dzKGxhcHBseShhbGwuMTRjLnN0YXRzLmluYy5kaWYubHMsIGZ1bmN0aW9uKGRmKSBiaW5kX3Jvd3MoZGYsIC5pZCA9ICJ0eXBlIikpKVtbInR5cGUiXV0pLCAKICBmdW5jdGlvbihpZC5zdW0pCiAgICBzYW1wbGUuZGVjb21wKG4gPSByZXAoMiwgbGVuZ3RoKGlkLnN1bSRkaWYpKSwKICAgICAgICAgICAgICAgICAgc2FtcGxlLm1lYW4gPSBpZC5zdW0kZGlmLAogICAgICAgICAgICAgICAgICBzYW1wbGUudmFyID0gaWQuc3VtJHZkaWYsCiAgICAgICAgICAgICAgICAgIGluY2x1ZGUuc2QgPSBUUlVFKSkKCiMgIyBob21vZ2VuZWl0eSBvZiB2YXJpYW5jZT8KIyBhcmMucmV3ZXQuMTRjLnZhci5pbmMubHMgPC0gbGFwcGx5KGFyYy5yZXdldC4xNGMuc3RhdHMuaW5jLmxzLCBmdW5jdGlvbihkZikgewojICAgdmFyLmRmIDwtIGJpbmRfcm93cyhkZiwgLmlkID0gIlR5cGUiKQojICAgdmFyLmRmIDwtIHZhci5kZlt3aGljaCh2YXIuZGYkbiA8IDMpLCBdCiMgICB2YXIudGVzdChzYW1wbGUudmFyIH4gVHlwZSwgZGF0YSA9IHZhci5kZikKIyB9KQojICMgY29udHJvbCB2cy4gdHJlYXRtZW50LCBFeHAgMgojIHJld2V0LmN0bC50cnQudmFyIDwtIGxhcHBseShhbGwuMTRjLnN0YXRzLmxzJHJld2V0JGluYywgZnVuY3Rpb24oZGYpIHsKIyAgICAgdmFyLmRmIDwtIGJpbmRfcm93cyhkZiwgLmlkID0gInRyZWF0LmJpIikKIyAgICAgcmV0dXJuKHZhci50ZXN0KHYgfiB0cmVhdC5iaSwgZGF0YSA9IHZhci5kZikpCiMgfSkKCiMgZXh0cmFjdCBtZWFuIGRpZmZlcmVuY2VzCmFyYy4xNGMuaW5jLm1lYW5EaWYgPC0gYmluZF9yb3dzKAogIGxhcHBseShhcmMucmV3ZXQuMTRjLnN0YXRzLmluYy5scywgZnVuY3Rpb24oZXhwKSB7CiAgICBiaW5kX3Jvd3MoCiAgICAgIGxhcHBseShleHAsIGZ1bmN0aW9uKG1kKSB7CiAgICAgICAgZGYgPC0gcm91bmQobWRbbnJvdyhtZCksIGMoIm4iLCAic2FtcGxlLm1lYW4iLCAic2FtcGxlLnNkIildLCAxKQogICAgICAgIHQgPC0gcXQoLjk3NSwgZGYgPSBtYXgoZGYkbikgLSAxKQogICAgICAgIGRmJHNlIDwtIHJvdW5kKGRmJHNhbXBsZS5zZC9zcXJ0KGRmJG4pLCAxKQogICAgICAgIGRmJGNpOTUubCA8LSByb3VuZChkZiRzYW1wbGUubWVhbiAtIGRmJHNlICogdCwgMSkKICAgICAgICBkZiRjaTk1LnUgPC0gcm91bmQoZGYkc2FtcGxlLm1lYW4gKyBkZiRzZSAqIHQsIDEpCiAgICAgICAgcmV0dXJuKGRmKQogICAgfSksIC5pZCA9ICJ0eXBlIikKfSksIC5pZCA9ICJFeHBlcmltZW50IikgJT4lCiAgbXV0YXRlKFR5cGUgPSBzdWJzdHIodHlwZSwgbmNoYXIodHlwZSksIG5jaGFyKHR5cGUpKSkgJT4lCiAgc2VsZWN0KGMoRXhwZXJpbWVudCwgVHlwZSwgbiwgc2FtcGxlLm1lYW4sIGNpOTUubCwgY2k5NS51LCBzYW1wbGUuc2QsIHNlKSkKZ2dwbG90KGFyYy4xNGMuaW5jLm1lYW5EaWYsIGFlcyhUeXBlLCBzYW1wbGUubWVhbiwgY29sb3IgPSBUeXBlKSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKICBnZW9tX3BvaW50KHNpemUgPSAzKSArCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IGNpOTUubCwgeW1heCA9IGNpOTUudSksIHdpZHRoID0gLjEpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICdFY29zeXN0ZW0nLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCdGJz0nI2EzNTUxMycsJ0cnPScjMTM2MWEzJyksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ0ZvcmVzdCcsJ0dyYXNzbGFuZCcpKSArCiAgY29vcmRfZmxpcCgpICsKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKEV4cGVyaW1lbnQpLCAKICAgICAgICAgICAgIGxhYmVsbGVyID0gbGFiZWxsZXIoRXhwZXJpbWVudCA9IGMoImFyYyIgPSAiRXhwZXJpbWVudCAxIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXdldCIgPSAiRXhwZXJpbWVudCAyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRtZSIgPSAiRXhwZXJpbWVudCAzIikpKSArCiAgeWxhYihleHByZXNzaW9uKCJDb250cm9sIC0gVHJlYXRtZW50ICIqRGVsdGFeMTQqIkMtQ08iWzJdKiIgKOKAsCkiKSkgKwogIHhsYWIoTlVMTCkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCkpCgojIGV4dHJhY3QgbWVhbiBkaWZmZXJlbmNlcyBmb3Igb3ZlcmFsbCBkYXRhc2V0CmFyYy4xNGMuaW5jLm1lYW5EaWYyIDwtIGJpbmRfcm93cygKICBsYXBwbHkoYXJjLnJld2V0LjE0Yy5zdGF0cy5pbmMubHMyLCBmdW5jdGlvbihtZCkgewogICAgICAgIGRmIDwtIHJvdW5kKG1kW25yb3cobWQpLCBjKCJuIiwgInNhbXBsZS5tZWFuIiwgInNhbXBsZS5zZCIpXSwgMSkKICAgICAgICB0IDwtIHF0KC45NzUsIGRmID0gbWF4KGRmJG4pIC0gMSkKICAgICAgICBkZiRzZSA8LSByb3VuZChkZiRzYW1wbGUuc2Qvc3FydChkZiRuKSwgMSkKICAgICAgICBkZiRjaTk1LmwgPC0gcm91bmQoZGYkc2FtcGxlLm1lYW4gLSBkZiRzZSAqIHQsIDEpCiAgICAgICAgZGYkY2k5NS51IDwtIHJvdW5kKGRmJHNhbXBsZS5tZWFuICsgZGYkc2UgKiB0LCAxKQogICAgICAgIHJldHVybihkZikKICAgIH0pLCAuaWQgPSAidHlwZSIpICU+JQogIG11dGF0ZShUeXBlID0gc3Vic3RyKHR5cGUsIG5jaGFyKHR5cGUpLCBuY2hhcih0eXBlKSkpICU+JQogIHNlbGVjdChjKFR5cGUsIG4sIHNhbXBsZS5tZWFuLCBjaTk1LmwsIGNpOTUudSwgc2FtcGxlLnNkLCBzZSkpCmBgYAoKYGBge3Igc3RhdHMtcG9vbGVkLTJ9CiMgYXJjICsgcmV3ZXQgdy8gcmVwcwphcmMucmV3ZXQuMTRjLnJlcHMgPC0gdW5zcGxpdCgKICBsYXBwbHkoc3BsaXQoYXJjLnJld2V0LjE0YywgYXJjLnJld2V0LjE0YyRFeHBlcmltZW50KSwgZnVuY3Rpb24oZXhwKSB7CiAgICB1bnNwbGl0KGxhcHBseShzcGxpdChleHAsIGV4cCR0cmVhdC5iaSksIGZ1bmN0aW9uKHRydCkgewogICAgICB1bnNwbGl0KGxhcHBseShzcGxpdCh0cnQsIHRydCRJRCksIGZ1bmN0aW9uKGRmKSB7CiAgICAgICAgZGYkcmVwIDwtIHNlcSgxLCBucm93KGRmKSkKICAgICAgICByZXR1cm4oZGYpCiAgICAgIH0pLCB0cnQkSUQpIAogICAgfSksIGV4cCR0cmVhdC5iaSkKICB9KSwgYXJjLnJld2V0LjE0YyRFeHBlcmltZW50KQphcmMucmV3ZXQuMTRjLnJlcHMkcmVwIDwtIGZhY3RvcihhcmMucmV3ZXQuMTRjLnJlcHMkcmVwKQoKIyBwcmUgdnMuIG1haW4gaW5jCiMgMTRDCmFyYy5yZXdldC4xNGMucmVwcy5wcmUgPC0gYXJjLnJld2V0LjE0Yy5yZXBzWy13aGljaChpcy5uYShhcmMucmV3ZXQuMTRjLnJlcHMkZDE0Y19jb3JyX3ByZSkpLCBdCnByZS5pbmMuZGlmIDwtIGxhcHBseSgKICBzcGxpdChhcmMucmV3ZXQuMTRjLnJlcHMucHJlLCBhcmMucmV3ZXQuMTRjLnJlcHMucHJlJEV4cGVyaW1lbnQpLCBmdW5jdGlvbihleHApIHsKICAgIGxhcHBseShzcGxpdChleHAsIGV4cCR0cmVhdC5iaSksIGZ1bmN0aW9uKHRydCkgewogICAgICB0cnQuZGlmIDwtIGJpbmRfcm93cygKICAgICAgICBsYXBwbHkoc3BsaXQodHJ0LCB0cnQkSUQpLCBmdW5jdGlvbihpZCkgewogICAgICAgICAgcHJlIDwtIGRhdGEuZnJhbWUobSA9IG1lYW4oaWQkZDE0Y19jb3JyX3ByZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gdmFyKGlkJGQxNGNfY29ycl9wcmUpKQogICAgICAgICAgaW5jIDwtIGRhdGEuZnJhbWUobSA9IG1lYW4oaWQkZDE0Y19jb3JyX2luYyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gdmFyKGlkJGQxNGNfY29ycl9pbmMpKQogICAgICAgICAgZGlmIDwtIGRhdGEuZnJhbWUoZCA9IHByZSRtIC0gaW5jJG0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZCA9IHByZSR2ICsgaW5jJHYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlID0gdW5pcXVlKGlkJFR5cGUpKQogICAgICAgICAgZGlmJHZkIDwtIGlmZWxzZShpcy5uYShkaWYkdmQpLCBtZWFuLnJlcC52YXIsIGRpZiR2ZCkKICAgICAgICAgIHJldHVybihkaWYpCiAgICAgICAgICB9KSwgLmlkID0gIklEIikKICAgICAgdHJ0LmRpZi5wb29sIDwtIGxhcHBseShzcGxpdCh0cnQuZGlmLCB0cnQuZGlmJFR5cGUpLCBmdW5jdGlvbihpZC5zdW0pIHsKICAgICAgICBkZWNvbXAgPC0gc2FtcGxlLmRlY29tcChuID0gcmVwKDIsIGxlbmd0aChpZC5zdW0kZCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZS5tZWFuID0gaWQuc3VtJGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlLnZhciA9IGlkLnN1bSR2ZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlLnNkID0gVFJVRSkKICAgICAgICBwb29sZWQgPC0gZGVjb21wW25yb3coZGVjb21wKSwgXQogICAgICAgIHBsdXNNaW51cyA8LSBwb29sZWQkc2FtcGxlLnNkIC8gc3FydChwb29sZWQkbikgKiBxdCguOTUsIHBvb2xlZCRuIC0gMSkKICAgICAgICBjaTk1IDwtIGMocG9vbGVkJHNhbXBsZS5tZWFuIC0gcGx1c01pbnVzLCBwb29sZWQkc2FtcGxlLm1lYW4gKyBwbHVzTWludXMpCiAgICAgICAgcmV0dXJuKGxpc3QoZGVjb21wID0gZGVjb21wLCBjaTk1ID0gY2k5NSkpCiAgICAgICAgfSkKICAgICAgcmV0dXJuKHRydC5kaWYucG9vbCkKICAgICAgfSkKICAgIH0pCiMgcmVtb3ZlIEhFVzIyIGZyb20gcmV3ZXQgY29udHJvbApwcmUuaW5jLmRpZiRyZXdldCRjb250cm9sJEYkZGVjb21wIDwtIHByZS5pbmMuZGlmJHJld2V0JGNvbnRyb2wkRiRkZWNvbXBbLTEsIF0KcHJlLmluYy5kaWYuYWxsIDwtIGJpbmRfcm93cyhsYXBwbHkocHJlLmluYy5kaWYsIGZ1bmN0aW9uKGV4cCkgCiAgYmluZF9yb3dzKGxhcHBseShleHAsIGZ1bmN0aW9uKHRydCkgCiAgICBiaW5kX3Jvd3MobGFwcGx5KHRydCwgZnVuY3Rpb24odHlwKQogICAgICB0eXAkZGVjb21wWzE6bnJvdyh0eXAkZGVjb21wKSAtIDEsIF0pLCAKICAgICAgLmlkID0gIlR5cGUiKSksIC5pZCA9ICJ0cmVhdC5iaSIpKSwgLmlkID0gIkV4cGVyaW1lbnQiKQpwcmUuaW5jLmRpZi5hbGwucG9vbGVkIDwtIHNhbXBsZS5kZWNvbXAobiA9IHByZS5pbmMuZGlmLmFsbCRuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlLm1lYW4gPSBwcmUuaW5jLmRpZi5hbGwkc2FtcGxlLm1lYW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGUudmFyID0gcHJlLmluYy5kaWYuYWxsJHNhbXBsZS52YXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlLnNkID0gVFJVRSkKcHJlLmluYy5kaWYuYWxsLnBvb2xlZC5jaSA8LSBjKAogIHByZS5pbmMuZGlmLmFsbC5wb29sZWRbbnJvdyhwcmUuaW5jLmRpZi5hbGwucG9vbGVkKSwgInNhbXBsZS5tZWFuIl0gLQogICAgcHJlLmluYy5kaWYuYWxsLnBvb2xlZFtucm93KHByZS5pbmMuZGlmLmFsbC5wb29sZWQpLCAic2FtcGxlLnNkIl0gLyAKICAgIHNxcnQocHJlLmluYy5kaWYuYWxsLnBvb2xlZFtucm93KHByZS5pbmMuZGlmLmFsbC5wb29sZWQpLCAibiJdKSAqIAogICAgcXQoLjk1LCBwcmUuaW5jLmRpZi5hbGwucG9vbGVkW25yb3cocHJlLmluYy5kaWYuYWxsLnBvb2xlZCksICJuIl0gLSAxKSwKICBwcmUuaW5jLmRpZi5hbGwucG9vbGVkW25yb3cocHJlLmluYy5kaWYuYWxsLnBvb2xlZCksICJzYW1wbGUubWVhbiJdICsKICAgIHByZS5pbmMuZGlmLmFsbC5wb29sZWRbbnJvdyhwcmUuaW5jLmRpZi5hbGwucG9vbGVkKSwgInNhbXBsZS5zZCJdIC8gCiAgICBzcXJ0KHByZS5pbmMuZGlmLmFsbC5wb29sZWRbbnJvdyhwcmUuaW5jLmRpZi5hbGwucG9vbGVkKSwgIm4iXSkgKiAKICAgIHF0KC45NSwgcHJlLmluYy5kaWYuYWxsLnBvb2xlZFtucm93KHByZS5pbmMuZGlmLmFsbC5wb29sZWQpLCAibiJdIC0gMSkpCgojIDE0YyBjdGwtdHJ0CmFyYy5yZXdldC4xNGMuY3RsLnRydC5scyA8LSBsYXBwbHkoCiAgc3BsaXQoYXJjLnJld2V0LjE0Yy5yZXBzLCBhcmMucmV3ZXQuMTRjLnJlcHMkRXhwZXJpbWVudCksIGZ1bmN0aW9uKGV4cCkgewogICAgdHJ0LmRpZiA8LSBiaW5kX3Jvd3MoCiAgICAgICAgbGFwcGx5KHNwbGl0KGV4cCwgZXhwJElEKSwgZnVuY3Rpb24oaWQpIHsKICAgICAgICAgIGN0bC4xNGMgPC0gaWRbaWQkdHJlYXQuYmkgPT0gImNvbnRyb2wiLCAiZDE0Y19jb3JyX2luYyJdCiAgICAgICAgICBjdGwgPC0gZGF0YS5mcmFtZShtID0gbWVhbihjdGwuMTRjKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSB2YXIoY3RsLjE0YykpCiAgICAgICAgICBpZiAobnJvdyhjdGwpID09IDEpIHsKICAgICAgICAgICAgY3RsJHYgPC0gbWVhbi5yZXAudmFyCiAgICAgICAgICB9CiAgICAgICAgICB0cnQuMTRjIDwtIGlkW2lkJHRyZWF0LmJpID09ICJ0cmVhdG1lbnQiLCAiZDE0Y19jb3JyX2luYyJdCiAgICAgICAgICB0cnQgPC0gZGF0YS5mcmFtZShtID0gbWVhbih0cnQuMTRjKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSB2YXIodHJ0LjE0YykpCiAgICAgICAgICBpZiAobnJvdyh0cnQpID09IDEpIHsKICAgICAgICAgICAgdHJ0JHYgPC0gbWVhbi5yZXAudmFyCiAgICAgICAgICB9CiAgICAgICAgICBkaWYgPC0gZGF0YS5mcmFtZShkID0gY3RsJG0gLSB0cnQkbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZkID0gY3RsJHYgKyB0cnQkdiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgPSB1bmlxdWUoaWQkVHlwZSkpCiAgICAgICAgICByZXR1cm4oZGlmKQogICAgICAgICAgfSksIC5pZCA9ICJJRCIpCiAgICAgICAgICB0cnQuZGlmLnBvb2wgPC0gbGFwcGx5KHNwbGl0KHRydC5kaWYsIHRydC5kaWYkVHlwZSksIGZ1bmN0aW9uKGlkLnN1bSkgewogICAgICAgICAgICBkZWNvbXAgPC0gc2FtcGxlLmRlY29tcChuID0gcmVwKDIsIGxlbmd0aChpZC5zdW0kZCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGUubWVhbiA9IGlkLnN1bSRkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGUudmFyID0gaWQuc3VtJHZkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlLnNkID0gVFJVRSkKICAgICAgICAgICAgcG9vbGVkIDwtIGRlY29tcFtucm93KGRlY29tcCksIF0KICAgICAgICAgICAgcGx1c01pbnVzIDwtIHBvb2xlZCRzYW1wbGUuc2QgLyBzcXJ0KHBvb2xlZCRuKSAqIHF0KC45NSwgcG9vbGVkJG4gLSAxKQogICAgICAgICAgICBjaTk1IDwtIGMocG9vbGVkJHNhbXBsZS5tZWFuIC0gcGx1c01pbnVzLCBwb29sZWQkc2FtcGxlLm1lYW4gKyBwbHVzTWludXMpCiAgICAgICAgICAgIHJldHVybihsaXN0KGRlY29tcCA9IGRlY29tcCwgY2k5NSA9IGNpOTUpKQogICAgICAgICAgICB9KQogICAgICAgICAgcmV0dXJuKHRydC5kaWYucG9vbCkKICAgICAgfSkKCiMgMTNDCmxvYWQoImlzb19kZi5SRGF0YSIpCiMgY2FsYyBkaWZzCmlzb19kZiR0cmVhdC5iaSA8LSBpZmVsc2UoaXNvX2RmJFRyZWF0bWVudCA9PSAiY29udHJvbCIsICJjb250cm9sIiwgInRyZWF0bWVudCIpCm1lYW4ucmVwLnZhci4xM2MgPC0gbWVhbigKICB1bmxpc3QobGFwcGx5KHNwbGl0KGlzb19kZiwgaXNvX2RmJEV4cGVyaW1lbnQpLCBmdW5jdGlvbihleHApCiAgICBsYXBwbHkoc3BsaXQoZXhwLCBleHAkUGVyaW9kKSwgZnVuY3Rpb24ocGVyKQogICAgICBsYXBwbHkoc3BsaXQocGVyLCBwZXIkdHJlYXQuYmkpLCBmdW5jdGlvbih0cnQpCiAgICAgICAgbGFwcGx5KHNwbGl0KHRydCwgdHJ0JElEKSwgZnVuY3Rpb24oaWQpIHsKICAgICAgICAgIHZhcihpZCRkMTNjKQogICAgICAgIH0pCiAgICAgICkKICAgICkKICApKSwgbmEucm0gPSBUKQojIHByZS1pbmMKaXNvX2RmLnByZS5pbmMgPC0gbWVyZ2UoCiAgaXNvX2RmW2lzb19kZiRQZXJpb2QgPT0gInByZSIsIGMoIklEIiwgIkV4cGVyaW1lbnQiLCAidHJlYXQuYmkiLCAiVHlwZSIsICJkMTNjIildLAogIGlzb19kZltpc29fZGYkUGVyaW9kID09ICJpbmMiLCBjKCJJRCIsICJFeHBlcmltZW50IiwgInRyZWF0LmJpIiwgIlR5cGUiLCAiZDEzYyIpXSwKICBieSA9IGMoIklEIiwgIkV4cGVyaW1lbnQiLCAidHJlYXQuYmkiLCAiVHlwZSIpLCBzdWZmaXhlcyA9IGMoIl9wcmUiLCAiX2luYyIpKQppc29fZGYucHJlLmluYy5scyA8LSBsYXBwbHkoCiAgc3BsaXQoaXNvX2RmLnByZS5pbmMsIGlzb19kZi5wcmUuaW5jJEV4cGVyaW1lbnQpLCBmdW5jdGlvbihleHApIHsKICAgIGxhcHBseShzcGxpdChleHAsIGV4cCR0cmVhdC5iaSksIGZ1bmN0aW9uKHRydCkgewogICAgICB0cnQuZGlmIDwtIGJpbmRfcm93cygKICAgICAgICBsYXBwbHkoc3BsaXQodHJ0LCB0cnQkSUQpLCBmdW5jdGlvbihpZCkgewogICAgICAgICAgcHJlIDwtIGRhdGEuZnJhbWUobSA9IG1lYW4oaWQkZDEzY19wcmUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHZhcihpZCRkMTNjX3ByZSkpCiAgICAgICAgICBpbmMgPC0gZGF0YS5mcmFtZShtID0gbWVhbihpZCRkMTNjX2luYyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gdmFyKGlkJGQxM2NfaW5jKSkKICAgICAgICAgIGRpZiA8LSBkYXRhLmZyYW1lKGQgPSBwcmUkbSAtIGluYyRtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmQgPSBwcmUkdiArIGluYyR2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSA9IHVuaXF1ZShpZCRUeXBlKSkKICAgICAgICAgIHJldHVybihkaWYpCiAgICAgICAgICB9KSwgLmlkID0gIklEIikKICAgICAgdHJ0LmRpZi5wb29sIDwtIGxhcHBseShzcGxpdCh0cnQuZGlmLCB0cnQuZGlmJFR5cGUpLCBmdW5jdGlvbihpZC5zdW0pIHsKICAgICAgICBkZWNvbXAgPC0gc2FtcGxlLmRlY29tcChuID0gcmVwKDIsIGxlbmd0aChpZC5zdW0kZCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZS5tZWFuID0gaWQuc3VtJGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlLnZhciA9IGlkLnN1bSR2ZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlLnNkID0gVFJVRSkKICAgICAgICBwb29sZWQgPC0gZGVjb21wW25yb3coZGVjb21wKSwgXQogICAgICAgIHBsdXNNaW51cyA8LSBwb29sZWQkc2FtcGxlLnNkIC8gc3FydChwb29sZWQkbikgKiBxdCguOTUsIHBvb2xlZCRuIC0gMSkKICAgICAgICBjaTk1IDwtIGMocG9vbGVkJHNhbXBsZS5tZWFuIC0gcGx1c01pbnVzLCBwb29sZWQkc2FtcGxlLm1lYW4gKyBwbHVzTWludXMpCiAgICAgICAgcmV0dXJuKGxpc3QoZGVjb21wID0gZGVjb21wLCBjaTk1ID0gY2k5NSkpCiAgICAgICAgfSkKICAgICAgcmV0dXJuKHRydC5kaWYucG9vbCkKICAgICAgfSkKICAgIH0pCgojIGluYwppc29fZGYuaW5jLmxzIDwtIGxhcHBseSgKICBzcGxpdChpc29fZGZbaXNvX2RmJFBlcmlvZCA9PSAiaW5jIiwgXSwgCiAgICAgICAgaXNvX2RmW2lzb19kZiRQZXJpb2QgPT0gImluYyIsICJFeHBlcmltZW50Il0pLCBmdW5jdGlvbihleHApIHsKICAgICAgICAgIHRydC5kaWYgPC0gYmluZF9yb3dzKAogICAgICAgICAgICBsYXBwbHkoc3BsaXQoZXhwLCBleHAkSUQpLCBmdW5jdGlvbihpZCkgewogICAgICAgICAgICAgIGN0bCA8LSBkYXRhLmZyYW1lKG0gPSBtZWFuKGlkW2lkJHRyZWF0LmJpID09ICJjb250cm9sIiwgImQxM2MiXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHZhcihpZFtpZCR0cmVhdC5iaSA9PSAiY29udHJvbCIsICJkMTNjIl0pKQogICAgICAgICAgICAgIGlmIChucm93KGN0bCkgPT0gMSkgewogICAgICAgICAgICAgICAgY3RsJHYgPC0gbWVhbi5yZXAudmFyLjEzYwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB0cnQgPC0gZGF0YS5mcmFtZShtID0gbWVhbihpZFtpZCR0cmVhdC5iaSA9PSAidHJlYXRtZW50IiwgImQxM2MiXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHZhcihpZFtpZCR0cmVhdC5iaSA9PSAidHJlYXRtZW50IiwgImQxM2MiXSkpCiAgICAgICAgICAgICAgZGlmIDwtIGRhdGEuZnJhbWUoZCA9IGN0bCRtIC0gdHJ0JG0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmQgPSBjdGwkdiArIHRydCR2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgPSB1bmlxdWUoaWQkVHlwZSkpCiAgICAgICAgICAgICAgcmV0dXJuKGRpZikKICAgICAgICAgICAgICB9KSwgLmlkID0gIklEIikKICAgICAgICAgIHRydC5kaWYucG9vbCA8LSBsYXBwbHkoc3BsaXQodHJ0LmRpZiwgdHJ0LmRpZiRUeXBlKSwgZnVuY3Rpb24oaWQuc3VtKSB7CiAgICAgICAgICAgIGRlY29tcCA8LSBzYW1wbGUuZGVjb21wKG4gPSByZXAoMiwgbGVuZ3RoKGlkLnN1bSRkKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZS5tZWFuID0gaWQuc3VtJGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZS52YXIgPSBpZC5zdW0kdmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUuc2QgPSBUUlVFKQogICAgICAgICAgICBwb29sZWQgPC0gZGVjb21wW25yb3coZGVjb21wKSwgXQogICAgICAgICAgICBwbHVzTWludXMgPC0gcG9vbGVkJHNhbXBsZS5zZCAvIHNxcnQocG9vbGVkJG4pICogcXQoLjk1LCBwb29sZWQkbiAtIDEpCiAgICAgICAgICAgIGNpOTUgPC0gYyhwb29sZWQkc2FtcGxlLm1lYW4gLSBwbHVzTWludXMsIHBvb2xlZCRzYW1wbGUubWVhbiArIHBsdXNNaW51cykKICAgICAgICAgICAgcmV0dXJuKGxpc3QoZGVjb21wID0gZGVjb21wLCBjaTk1ID0gY2k5NSkpCiAgICAgICAgICAgIH0pCiAgICAgICAgICByZXR1cm4odHJ0LmRpZi5wb29sKQogICAgICB9KQpgYGAKCmBgYHtyIDE0Yy10cnQtZGlmc30KIyBMb2FkIGF0bW9zcGhlcmljIGRhdGEKRGF0bSA8LSByYmluZChncmF2ZW4sIGZ1dHVyZTE0QykKc2F2ZShEYXRtLCBmaWxlID0gIkRhdG0uUkRhdGEiKQp5cnMgPC0gRGF0bSREYXRlCgojIEZpbHRlciBkYXRhIHRvICJpbmMiLCBzcGxpdCBieSBiaW5hcnkgdHJlYXRtZW50IHZhcmlhYmxlLCB0aGVuIG1lcmdlCiMgY29sbGFwc2UgdHJlYXRtZW50IHZhcmlhYmxlIGludG8gYmluYXJ5IGNvbnRyb2wvdHJlYXRtZW50CmFsbC4xNGMuc3VtLmRmJHRyZWF0LmJpIDwtIGlmZWxzZShhbGwuMTRjLnN1bS5kZiRUcmVhdG1lbnQgPT0gImNvbnRyb2wiLCAiY29udHJvbCIsICJ0cmVhdG1lbnQiKQoKIyBpbmMgZGF0YQphbGwuMTRjLmN0bCA8LSBhbGwuMTRjLnN1bS5kZlthbGwuMTRjLnN1bS5kZiR0cmVhdC5iaSA9PSAiY29udHJvbCIgJiBhbGwuMTRjLnN1bS5kZiRQZXJpb2QgPT0gImluYyIsIF0KYWxsLjE0Yy5jdGwgPC0gcmVuYW1lX2F0KGFsbC4xNGMuY3RsLCB2YXJzKGNvbnRhaW5zKCdkMTRjJykpLCBsaXN0KH5wYXN0ZTAoLiwgIl9jdGwiKSkpCmFsbC4xNGMudHJ0IDwtIGFsbC4xNGMuc3VtLmRmW2FsbC4xNGMuc3VtLmRmJHRyZWF0LmJpID09ICJ0cmVhdG1lbnQiICYgYWxsLjE0Yy5zdW0uZGYkUGVyaW9kID09ICJpbmMiLCBdCmFsbC4xNGMudHJ0IDwtIHJlbmFtZV9hdChhbGwuMTRjLnRydCwgdmFycyhjb250YWlucygnZDE0YycpKSwgbGlzdCh+cGFzdGUwKC4sICJfdHJ0IikpKQphbGwuMTRjLmN0bC50cnQgPC0gaW5uZXJfam9pbihkYXRhLmZyYW1lKGFsbC4xNGMuY3RsKSAlPiUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KElELCBFeHBlcmltZW50LCBUeXBlLCBTaXRlLCBIb3Jpem9uLCBjb250YWlucygiZDE0Y19jb3JyIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmZyYW1lKGFsbC4xNGMudHJ0KSAlPiUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KElELCBFeHBlcmltZW50LCBUeXBlLCBTaXRlLCBIb3Jpem9uLCBjb250YWlucygiZDE0Y19jb3JyIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSA9IGMoIklEIiwgIkV4cGVyaW1lbnQiLCAiVHlwZSIsICJTaXRlIiwgIkhvcml6b24iKSkKCiMgRmlyc3QgYWRkIFllYXJTYW1wbGVkIGFuZCBZZWFyTWVhc3VyZWQgY29sdW1ucwphbGwuMTRjLmN0bC50cnQkWWVhclNhbXBsZWQgPC0gdW5saXN0KGFsbC4xNGMuc3VtLmRmW21hdGNoKGFsbC4xNGMuY3RsLnRydCRJRCwgYWxsLjE0Yy5zdW0uZGYkSUQpLCAiWWVhclNhbXBsZWQiXSkKIyBjb3JyZWN0IGFyY2hpdmUgc2FtcGxlIFllYXJTYW1wbGVkCmFsbC4xNGMuY3RsLnRydFthbGwuMTRjLmN0bC50cnQkRXhwZXJpbWVudCA9PSAiYXJjIiAmIGFsbC4xNGMuY3RsLnRydCRTaXRlID09ICJIYWluaWNoIiwgIlllYXJTYW1wbGVkIl0gPC0gMjAxMQoKIyBhZGQgeWVhciBtZWFzdXJlZCBjb2x1bW4sIG1vZGlmeSBmb3IgdG1lLm1pc2Mgc2FtcGxlcywgcmV3ZXQgc2FtcGxlcwphbGwuMTRjLmN0bC50cnQkWWVhck1lYXN1cmVkIDwtIDIwMTgKYWxsLjE0Yy5jdGwudHJ0W2FsbC4xNGMuY3RsLnRydCRFeHBlcmltZW50ID09ICJyZXdldCIsICJZZWFyTWVhc3VyZWQiXSA8LSAyMDE5CmFsbC4xNGMuY3RsLnRydFt3aGljaChhbGwuMTRjLmN0bC50cnQkSUQgJWluJSB0bWUubWlzYyRJRCksICJZZWFyTWVhc3VyZWQiXSA8LSAyMDA5CgojIGNhbGN1bGF0ZSBzdG9yYWdlIGR1cmF0aW9uIG51bWVyaWNhbGx5IGFuZCBhcyBmYWN0b3IKYWxsLjE0Yy5jdGwudHJ0JHRtZSA8LSB1bmxpc3QoYWxsLjE0Yy5jdGwudHJ0JFllYXJNZWFzdXJlZCAtIGFsbC4xNGMuY3RsLnRydCRZZWFyU2FtcGxlZCkKYWxsLjE0Yy5jdGwudHJ0JHRtZS5mIDwtIGZhY3RvcihhbGwuMTRjLmN0bC50cnQkdG1lKQoKIyBhZGQgZGlmZmVyZW5jZSBjb2x1bW4KIyAoZXhwcmVzc2VkIGFzIGRpZmZlcmVuY2Ugb2YgbWVhbnMpCmFsbC4xNGMuY3RsLnRydCRjdGwudHJ0LmQxNCA8LSBhbGwuMTRjLmN0bC50cnQkZDE0Y19jb3JyX21lYW5fY3RsIC0gYWxsLjE0Yy5jdGwudHJ0JGQxNGNfY29ycl9tZWFuX3RydAojIHRydC1jdGwgbWFrZXMgRmlnLiA0ICgxOjEgbGluZSkgYW5kIEZpZy4gNSAoc3RvcmFnZSBkdXJhdGlvbikgbW9yZSBjb21wYXRpYmxlCmFsbC4xNGMuY3RsLnRydCR0cnQuY3RsLmQxNCA8LSBhbGwuMTRjLmN0bC50cnQkZDE0Y19jb3JyX21lYW5fdHJ0IC0gYWxsLjE0Yy5jdGwudHJ0JGQxNGNfY29ycl9tZWFuX2N0bAoKIyBhZGQgYXRtIDE0QyBmb3IgeWVhciBzYW1wbGVkIGFuZCBjYWxjdWxhdGUgZGVsdGEtZGVsdGEKYWxsLjE0Yy5jdGwudHJ0JGF0bS55ci5zYW1wbGVkIDwtIERhdG1bbWF0Y2goYWxsLjE0Yy5jdGwudHJ0JFllYXJTYW1wbGVkLCBmbG9vcihEYXRtJERhdGUpKSwgIk5IYzE0Il0KYWxsLjE0Yy5jdGwudHJ0JGRkLmN0bCA8LSBhbGwuMTRjLmN0bC50cnQkZDE0Y19jb3JyX21lYW5fY3RsIC0gYWxsLjE0Yy5jdGwudHJ0JGF0bS55ci5zYW1wbGVkCmFsbC4xNGMuY3RsLnRydCRkZC50cnQgPC0gYWxsLjE0Yy5jdGwudHJ0JGQxNGNfY29ycl9tZWFuX3RydCAtIGFsbC4xNGMuY3RsLnRydCRhdG0ueXIuc2FtcGxlZAphbGwuMTRjLmN0bC50cnQkY3RsLnRydC5kZDE0IDwtIGFsbC4xNGMuY3RsLnRydCRkZC5jdGwgLSBhbGwuMTRjLmN0bC50cnQkZGQudHJ0CgojIHNhdmUgUmRhdCBmaWxlCnNhdmUoYWxsLjE0Yy5jdGwudHJ0LCBmaWxlID0gIi4vYWxsLjE0Yy5jdGwudHJ0LlJEYXRhIikKCiMgZGlmcwplMTIuMTRjLmN0bC50cnQuc3VtIDwtIGFsbC4xNGMuY3RsLnRydCAlPiUKICBmaWx0ZXIoRXhwZXJpbWVudCAhPSAidG1lIikgJT4lCiAgc2VsZWN0KEV4cGVyaW1lbnQsIFR5cGUsIGQxNGNfY29ycl9tZWFuX2N0bCwgZDE0Y19jb3JyX21lYW5fdHJ0LCB0cnQuY3RsLmQxNCwgZGQuY3RsLCBkZC50cnQsIGN0bC50cnQuZGQxNCkgJT4lCiAgZ3JvdXBfYnkoRXhwZXJpbWVudCwgVHlwZSkgJT4lCiAgYWRkX3RhbGx5KCkgJT4lCiAgc3VtbWFyaXplX2FsbChsaXN0KG1lYW4gPSBtZWFuLCBzZCA9IHNkKSwgbmEucm0gPSBUUlVFKQplMTIuMTRjLmN0bC50cnQuc3VtJHRydC5jdGwuZDE0X3NkIDwtIHNxcnQoZTEyLjE0Yy5jdGwudHJ0LnN1bSRkMTRjX2NvcnJfbWVhbl9jdGxfc2ReMi9lMTIuMTRjLmN0bC50cnQuc3VtJG5fbWVhbiArIGUxMi4xNGMuY3RsLnRydC5zdW0kZDE0Y19jb3JyX21lYW5fdHJ0X3NkXjIvZTEyLjE0Yy5jdGwudHJ0LnN1bSRuX21lYW4pCgojIGN0bC1jdGwgZGlmIHZzLiB0cnQtdHJ0CiMgZGlmcyBieSBJRApoYWkuaWQuZGYgPC0gYWxsLjE0Yy5jdGwudHJ0W2FsbC4xNGMuY3RsLnRydCRTaXRlID09ICJIYWluaWNoIiAmIGFsbC4xNGMuY3RsLnRydCRFeHBlcmltZW50ICE9ICJ0bWUiLCBdCmhhaS5jdGwuY3RsLnRydC50cnQgPC0gYmluZF9yb3dzKAogIGxhcHBseShzcGxpdChoYWkuaWQuZGYsIGhhaS5pZC5kZiRJRCksIGZ1bmN0aW9uKGRmKSB7CiAgICBkaWYuY3RsIDwtIGRmW2RmJFllYXJTYW1wbGVkID09IDIwMTEsICJkMTRjX2NvcnJfbWVhbl9jdGwiXSAtCiAgICAgIGRmW2RmJFllYXJTYW1wbGVkID09IDIwMTksICJkMTRjX2NvcnJfbWVhbl9jdGwiXQogICAgZGlmLnRydCA8LSBkZltkZiRZZWFyU2FtcGxlZCA9PSAyMDExLCAiZDE0Y19jb3JyX21lYW5fdHJ0Il0gLQogICAgICBkZltkZiRZZWFyU2FtcGxlZCA9PSAyMDE5LCAiZDE0Y19jb3JyX21lYW5fdHJ0Il0KICAgIHJldHVybihkYXRhLmZyYW1lKGRpZiA9IGMoZGlmLmN0bCwgZGlmLnRydCksCiAgICAgICAgICAgICAgICAgICAgICBUeXBlID0gZGYkVHlwZSwKICAgICAgICAgICAgICAgICAgICAgIHRyZWF0ID0gYygiY3RsIiwgInRydCIpKSkKICB9KQopCmhhaS5jdGwuY3RsLnRydC50cnQuZGYgPC0gaGFpLmN0bC5jdGwudHJ0LnRydCAlPiUgCiAgZ3JvdXBfYnkoVHlwZSwgdHJlYXQpICU+JQogIGFkZF90YWxseSgpICU+JQogIHN1bW1hcml6ZShhY3Jvc3MoZGlmOm4sIGxpc3QobWVhbiA9IG1lYW4sIHNkID0gc2QpKSkgJT4lCiAgbXV0YXRlKHNlID0gZGlmX3NkIC8gbl9tZWFuLAogICAgICAgICB0ID0gcXQocCA9IC4wNS8yLCBkZiA9IG5fbWVhbiAtIDEpLAogICAgICAgICBjaS45NS51ID0gZGlmX21lYW4gKyB0ICogc2UsCiAgICAgICAgIGNpLjk1LmwgPSBkaWZfbWVhbiAtIHQgKiBzZSkKaGFpLmN0bC5jdGwudHJ0LnRydC5kZiAlPiUKICBtdXRhdGUoVHJlYXRtZW50ID0gaWZlbHNlKHRyZWF0ID09ICJjdGwiLCAiY29udHJvbCIsICJhaXItZHJpZWQvcmV3ZXR0ZWQiKSkgJT4lCiAgZ2dwbG90KC4sIGFlcyhUcmVhdG1lbnQsIGRpZl9tZWFuLCBmaWxsID0gVHlwZSwgY29sb3IgPSBUeXBlKSkgKwogIGdlb21fY29sKHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAuOSkpICsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gY2kuOTUubCwgeW1heCA9IGNpLjk1LnUpLAogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IC45KSwgCiAgICAgICAgICAgICAgICB3aWR0aCA9IC41KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAnRWNvc3lzdGVtJywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygnRicgPSAnI2EzNTUxMycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0cnID0gJyMxMzYxYTMnKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnRicgPSAnRm9yZXN0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRycgPSAnR3Jhc3NsYW5kJykpICsKICBzY2FsZV9maWxsX21hbnVhbChuYW1lID0gJ0Vjb3N5c3RlbScsCiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygnRicgPSAnI2EzNTUxMycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRycgPSAnIzEzNjFhMycpLAogICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ0YnID0gJ0ZvcmVzdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRycgPSAnR3Jhc3NsYW5kJykpICsKICB5bGFiKGV4cHJlc3Npb24oJzIwMTEgJypEZWx0YSonJ14xNConQyAtIDIwMTkgJypEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCgpgYGB7ciBwbG90LTE0Yy1hbGwtY3RsLXRydH0KIyBsaXN0IG9mIGxvY2F0aW9ucyBmb3IgcmVjb2RpbmcKbG9jIDwtIGxpc3QoCiAgICAiRHVrZSIgPSAiRHVrZSBGQUNFIGNvbnRyb2wgKCMzKSIsCiAgICAiSG93bGFuZCIgPSAiSG93bGFuZCAoIzMpIiwKICAgICJIYXJ2YXJkIiA9ICJIYXJ2YXJkIEZvcmVzdCAoIzMpIiwKICAgICJIYWluaWNoIiA9ICJDZW50cmFsIEdlcm1hbnkiLAogICAgIlNjaG9yZmhlaWRlIiA9ICJDZW50cmFsIEdlcm1hbnkiLAogICAgIk11c2ljayIgPSAiU2llcnJhIE5ldmFkYSwgQ0EgKCMzKSIsCiAgICAiU2hhdmVyIiA9ICJTaWVycmEgTmV2YWRhLCBDQSAoIzMpIiwKICAgICJXYWxrZXIgQnJhbmNoIiA9ICJPYWsgUmlkZ2UgKCMzKSIsCiAgICAiVGVubmVzc2VlIFZhbGxleSIgPSAiT2FrIFJpZGdlICgjMykiKQoKIyBQbG90IG9uIDE6MSBsaW5lIHcvIGRpYWdvbmFsIGxpbmVzIHNob3dpbmcg4oCwIG9mZnNldHMKIyBmaXJzdCBjb2xsYXBzZSBzaXRlcyBmb3IgYmV0dGVyIHZpc3VhbHMKYWxsLjE0Yy5jdGwudHJ0ICU+JQogIGZpbHRlcihIb3Jpem9uID09ICJBIikgJT4lCiAgbXV0YXRlKExvY2F0aW9uID0gcmVjb2RlKFNpdGUsICEhIWxvYykpICU+JQogIG11dGF0ZShMb2NhdGlvbiA9IGlmZWxzZShMb2NhdGlvbiA9PSAiQ2VudHJhbCBHZXJtYW55IiAmIEV4cGVyaW1lbnQgPT0gInJld2V0IiwgIkNlbnRyYWwgR2VybWFueSAoIzIpIiwgaWZlbHNlKExvY2F0aW9uID09ICJDZW50cmFsIEdlcm1hbnkiICYgRXhwZXJpbWVudCA9PSAiYXJjIiwgIkNlbnRyYWwgR2VybWFueSAoIzEpIiwgaWZlbHNlKExvY2F0aW9uID09ICJDZW50cmFsIEdlcm1hbnkiICYgRXhwZXJpbWVudCA9PSAidG1lIiwgIkNlbnRyYWwgR2VybWFueSAoIzMpIiwgTG9jYXRpb24pKSkpICU+JQogIGdncGxvdCguLCBhZXMoZDE0Y19jb3JyX21lYW5fY3RsLCBkMTRjX2NvcnJfbWVhbl90cnQsIGNvbG9yID0gTG9jYXRpb24sIHNoYXBlID0gVHlwZSkpICsKICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDApICsKICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IC0yMCwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMjAsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IC00MCwgbGluZXR5cGUgPSAiZG90dGVkIikgKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gNDAsIGxpbmV0eXBlID0gImRvdHRlZCIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBjb2xvciA9ICJncmF5IikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGNvbG9yID0gImdyYXkiKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIGdlb21fZXJyb3JiYXIoCiAgICBhZXMoeW1pbiA9IGQxNGNfY29ycl9taW5fdHJ0LCAKICAgICAgICB5bWF4ID0gZDE0Y19jb3JyX21heF90cnQsIAogICAgICAgIGNvbG9yID0gTG9jYXRpb24pLCAKICAgIHdpZHRoID0gLjI1KSArCiAgZ2VvbV9lcnJvcmJhcmgoCiAgICBhZXMoeG1pbiA9IGQxNGNfY29ycl9taW5fY3RsLCAKICAgICAgICB4bWF4ID0gZDE0Y19jb3JyX21heF9jdGwsIAogICAgICAgIGNvbG9yID0gTG9jYXRpb24pLCAKICAgIGhlaWdodCA9IC45KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAiTG9jYXRpb24gKEV4cGVyaW1lbnQgIykiLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCdEdWtlIEZBQ0UgY29udHJvbCAoIzMpJyA9ICcjMDFCQjk3JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU2llcnJhIE5ldmFkYSwgQ0EgKCMzKScgPSAnI0ZGQzEwNycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NlbnRyYWwgR2VybWFueSAoIzEpJyA9ICdibGFjaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NlbnRyYWwgR2VybWFueSAoIzIpJyA9ICcjOTk5OTk5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ2VudHJhbCBHZXJtYW55ICgjMyknID0gJyNjNmM2YzYnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdIYXJ2YXJkIEZvcmVzdCAoIzMpJyA9ICcjMUU4OEU1JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnT2FrIFJpZGdlICgjMyknID0gJyNEODFCNjAnKSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gJ0Vjb3N5c3RlbScsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoJ0YnPSAxNywnRycgPSAxNiksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ0ZvcmVzdCcsJ0dyYXNzbGFuZCcpKSArCiAgeGxhYihleHByZXNzaW9uKCdDb250cm9sICcqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHlsYWIoZXhwcmVzc2lvbignVHJlYXRtZW50ICcqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLmtleS5oZWlnaHQ9dW5pdCguOCwgImNtIiksCiAgICAgICAgYXNwZWN0LnJhdGlvID0gMSkKCiMgZm9yIHBsb3R0aW5nIHdpdGggY29sb3IgPSBUeXBlIChjdXJyZW50bHkgc3VwcHJlc3NlZCkKIyBhbGwuMTRjLmN0bC50cnQgJT4lCiMgICBmaWx0ZXIoSG9yaXpvbiA9PSAiQSIpICU+JQojICAgbXV0YXRlKExvY2F0aW9uID0gZmFjdG9yKHJlY29kZShTaXRlLCAhISFsb2MpLCBleGNsdWRlID0gVFJVRSkpICU+JQojICAgZ2dwbG90KC4sIGFlcyhkMTRjX2NvcnJfbWVhbl9jdGwsIGQxNGNfY29ycl9tZWFuX3RydCwgY29sb3IgPSBUeXBlLCBzaGFwZSA9IExvY2F0aW9uKSkgKwojICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwKSArCiMgICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IC0yMCwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwojICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAyMCwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwojICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAtNDAsIGxpbmV0eXBlID0gImRvdGRhc2giKSArCiMgICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDQwLCBsaW5ldHlwZSA9ICJkb3RkYXNoIikgKwojICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgY29sb3IgPSAiZ3JheSIpICsKIyAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGNvbG9yID0gImdyYXkiKSArCiMgICBnZW9tX3BvaW50KHNpemUgPSAzKSArCiMgICBnZW9tX2Vycm9yYmFyKAojICAgICBhZXMoeW1pbiA9IGQxNGNfY29ycl9taW5fdHJ0LCAKIyAgICAgICAgIHltYXggPSBkMTRjX2NvcnJfbWF4X3RydCwgCiMgICAgICAgICBjb2xvciA9IFR5cGUpLCAKIyAgICAgd2lkdGggPSAuMjUpICsKIyAgIGdlb21fZXJyb3JiYXJoKAojICAgICBhZXMoeG1pbiA9IGQxNGNfY29ycl9taW5fY3RsLCAKIyAgICAgICAgIHhtYXggPSBkMTRjX2NvcnJfbWF4X2N0bCwgCiMgICAgICAgICBjb2xvciA9IFR5cGUpLCAKIyAgICAgaGVpZ2h0ID0gLjkpICsKIyAgIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gJ0Vjb3N5c3RlbScsCiMgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID1jKCdGJz0nI2EzNTUxMycsJ0cnPScjMTM2MWEzJyksCiMgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnRm9yZXN0JywnR3Jhc3NsYW5kJykpICsKIyAgIHhsYWIoZXhwcmVzc2lvbignQ29udHJvbCAnKkRlbHRhKicnXjE0KidDICjigLApJykpICsKIyAgIHlsYWIoZXhwcmVzc2lvbignVHJlYXRtZW50ICcqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwojICAgdGhlbWVfYncoKSArCiMgICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgbGVnZW5kLmtleS5oZWlnaHQ9dW5pdCguOCwgImNtIiksCiMgICAgICAgICBhc3BlY3QucmF0aW8gPSAxKQpgYGAKPioqRmlnLiBgciB7ZmlnLm4gKyAyfWAuIE92ZXJhbGwgdHJlYXRtZW50IGVmZmVjdCBvbiAkXERlbHRhJF4xNF5DLUNPfjJ+KioKCj4qQ2FwdGlvbjoqIFBvaW50cyBzaG93IGRhdGEgZnJvbSBFeHBlcmltZW50cyAxIGFuZCAzIChhaXItZHJ5ICsgc3RvcmFnZSB0cmVhdG1lbnQpIGFuZCBFeHBlcmltZW50IDIgKGFpci1kcnkgb25seSB0cmVhdG1lbnQpLiBQb2ludHMgYXJlIHRoZSBtZWFuIG9mIGxhYm9yYXRvcnkgcmVwbGljYXRlcyAoZm9yIHJlcGxpY2F0ZWQgc2FtcGxlcyk7IGVycm9yIGJhcnMgYXJlIDJ4IHN0YW5kYXJkIGVycm9yLiBTb2xpZCBsaW5lIGlzIDE6MS4gRm9yIGNvbnRleHQsIHRoZSBkYXNoZWQgYW5kIGRvdHRlZCBsaW5lcyBzaG93IGRpZmZlcmVuY2VzIG9mIMKxMjDigLAgYW5kIMKxJDQw4oCwLCBlcXVpdmFsZW50IHRvIHRoZSBkZWNsaW5lIGluICRcRGVsdGEkXjE0XkMgaW4gYXRtb3NwaGVyaWMgQ09+Mn4gb3ZlciA0IGFuZCA4IHkgcmVzcGVjdGl2ZWx5LCBkdXJpbmcgdGhlIHBlcmlvZCBvZiAyMDAwIHRvIDIwMjAgKEdyYXZlbiBldCBhbC4gMjAxNykuCgojIyBTdG9yYWdlIGR1cmF0aW9uIGVmZmVjdCBvbiBeMTReQy1DT34yfiAoRXhwZXJpbWVudCAzKQoKYGBge3IgcGxvdC1kdXItc3RvciwgZmlnLmhlaWdodD00fQojIG5ldyBsb2NhdGlvbiBjb2Rlcwpsb2MyIDwtIGxpc3QoCiAgICAiRHVrZSIgPSAiRHVrZSBGQUNFIGNvbnRyb2wiLAogICAgIkhvd2xhbmQiID0gIkhvd2xhbmQiLAogICAgIkhhcnZhcmQiID0gIkhhcnZhcmQgRm9yZXN0IiwKICAgICJIYWluaWNoIiA9ICJDZW50cmFsIEdlcm1hbnkiLAogICAgIlNjaG9yZmhlaWRlIiA9ICJDZW50cmFsIEdlcm1hbnkiLAogICAgIk11c2ljayIgPSAiU2llcnJhIE5ldmFkYSwgQ0EiLAogICAgIlNoYXZlciIgPSAiU2llcnJhIE5ldmFkYSwgQ0EiLAogICAgIldhbGtlciBCcmFuY2giID0gIk9hayBSaWRnZSIsCiAgICAiVGVubmVzc2VlIFZhbGxleSIgPSAiT2FrIFJpZGdlIikKCiMgUGxvdCBzdG9yYWdlIGR1cmF0aW9uCnN1cHByZXNzV2FybmluZ3MoCiAgYWxsLjE0Yy5jdGwudHJ0ICU+JQogICAgZmlsdGVyKEhvcml6b24gPT0gIkEiKSAlPiUKICAgIGZpbHRlcihFeHBlcmltZW50ICE9ICJyZXdldCIpICU+JQogICAgc2VsZWN0KFR5cGUsIHRtZS5mLCBTaXRlLCB0cnQuY3RsLmQxNCwgdG1lKSAlPiUKICAgIGdyb3VwX2J5KFR5cGUsIHRtZS5mLCBTaXRlKSAlPiUKICAgIGFkZF90YWxseSgpICU+JQogICAgc3VtbWFyaXNlX2FsbChsaXN0KG1lYW4gPSBtZWFuLCBzZCA9IHNkKSwgbmEucm0gPSBUUlVFKSAlPiUKICAgIG11dGF0ZShkaWZfc2UgPSB0cnQuY3RsLmQxNF9zZC9uX21lYW4sCiAgICAgICAgICAgZGlmX3UgPSB0cnQuY3RsLmQxNF9tZWFuICsgZGlmX3NlKjIsCiAgICAgICAgICAgZGlmX2wgPSB0cnQuY3RsLmQxNF9tZWFuIC0gZGlmX3NlKjIpICU+JQogICAgbXV0YXRlKExvY2F0aW9uID0gZmFjdG9yKHJlY29kZShTaXRlLCAhISFsb2MyKSwgZXhjbHVkZSA9IFRSVUUpKSAlPiUKICAgIGdncGxvdCguLCBhZXModG1lX21lYW4sIHRydC5jdGwuZDE0X21lYW4sIGNvbG9yID0gTG9jYXRpb24sIHNoYXBlID0gVHlwZSkpICsKICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0yMCwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMjAsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDQwLCBsaW5ldHlwZSA9ICJkb3R0ZWQiKSArCiAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtNDAsIGxpbmV0eXBlID0gImRvdHRlZCIpICsKICAgIGdlb21fcG9pbnQoc2l6ZSA9IDMsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UyKHdpZHRoID0gLjcsIHByZXNlcnZlID0gInNpbmdsZSIpKSArCiAgICBnZW9tX2Vycm9yYmFyKAogICAgICBhZXMoeW1pbiA9IGRpZl9sLAogICAgICAgICAgeW1heCA9IGRpZl91LCAKICAgICAgICAgIGNvbG9yID0gTG9jYXRpb24pLAogICAgICB3aWR0aCA9IC43LAogICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlMih3aWR0aCA9IC43LCBwcmVzZXJ2ZSA9ICJzaW5nbGUiKSkgKwogICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoJ0R1a2UgRkFDRSBjb250cm9sJyA9ICcjMDFCQjk3JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTaWVycmEgTmV2YWRhLCBDQScgPSAnI0ZGQzEwNycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ2VudHJhbCBHZXJtYW55JyA9ICdibGFjaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSGFydmFyZCBGb3Jlc3QnID0gJyMxRTg4RTUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ09hayBSaWRnZScgPSAnI0Q4MUI2MCcpKSArCiAgICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICdFY29zeXN0ZW0nLAogICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoJ0YnPSAxNywnRycgPSAxNiksCiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnRm9yZXN0JywnR3Jhc3NsYW5kJykpICsKICAgIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoNSwxMywyKSkgKwogICAgeWxhYihleHByZXNzaW9uKCdUcmVhdG1lbnQgLSBDb250cm9sICcqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogICAgeGxhYigiU3RvcmFnZSBkdXJhdGlvbiAoeWVhcnMpIikgKwogICAgdGhlbWVfYncoKSArCiAgICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKQogICkKYGBgCgo+KipGaWcuIGByIHtmaWcubiArIDN9YC4gQ2hhbmdlIGluIF4xNF5DLUNPfjJ+IGluIHJlbGF0aW9uIHRvIHN0b3JhZ2UgZHVyYXRpb24qKgoKPipDYXB0aW9uOiogRGF0YSBhcmUgZnJvbSBib3RoIEV4cGVyaW1lbnQgMSAoaW4gYmxhY2spIGFuZCBFeHBlcmltZW50IDMgKGFsbCBvdGhlciBwb2ludHMpLCBhdmVyYWdlZCBieSBzaXRlIGFuZCBlY29zeXN0ZW0gdHlwZS4gUG9pbnRzIGFyZSB0aGUgbWVhbiwgZXJyb3IgYmFycyBhcmUgMnggc3RhbmRhcmQgZXJyb3IuIEZvciBjb250ZXh0LCB0aGUgZGFzaGVkIGFuZCBkb3R0ZWQgbGluZXMgYXJlIHRoZSBzYW1lIGlzIGluIEZpZy4gYHIge2ZpZy5uICsgM31gIGFuZCBzaG93IGEgZGlmZmVyZW5jZSBvZiAyMOKAsCBhbmQgNDDigLAsIGVxdWl2YWxlbnQgdG8gdGhlIGRlY2xpbmUgaW4gJFxEZWx0YSReMTReQyBpbiBhdG1vc3BoZXJpYyBDT34yfiBvdmVyIDQgYW5kIDggeSByZXNwZWN0aXZlbHksIGR1cmluZyB0aGUgcGVyaW9kIG9mIDIwMDAgdG8gMjAyMCAoR3JhdmVuIGV0IGFsLiAyMDE3KS4gUG9zaXRpb24gb2YgcG9pbnRzIGppdHRlcmVkIHRvIGF2b2lkIG92ZXJwbG90dGluZzsgc3RvcmFnZSBkdXJhdGlvbiBoYXMgYmVlbiByb3VuZGVkIGRvd24gdG8gdGhlIG5lYXJlc3Qgd2hvbGUgeWVhci4KCmBgYHtyIHRyZWF0bWVudCBlZmZlY3RzIGJ5IHRpbWUsIGZpZy5oZWlnaHQ9NH0KIyAjIGNvZGUgZm9yIHBsb3R0aW5nIGRhdGEgYnkgSUQKIyBhbGwuMTRjLnN1bSAlPiUKIyAgIGZpbHRlcihQZXJpb2QgPT0gImluYyIpICU+JQojICAgZmlsdGVyKCFncmVwbCgiUyIsIElEKSkgJT4lCiMgICBtdXRhdGUoeWVhci5JRCA9IHBhc3RlKFllYXJTYW1wbGVkLCBJRCkpICU+JQojICAgZ2dwbG90KC4sIGFlcyhZZWFyU2FtcGxlZCwgZDE0Y19jb3JyX21lYW4sIGNvbG9yID0gVHlwZSkpICsKIyAgIGdlb21fcG9pbnQoYWVzKHNoYXBlID0gVHJlYXRtZW50KSwgc2l6ZSA9IDMpICsKIyAgIGdlb21fcGF0aChhZXMoZ3JvdXAgPSB5ZWFyLklEKSwgCiMgICAgICAgICAgICAgYXJyb3cgPSBhcnJvdyh0eXBlID0gIm9wZW4iLCBsZW5ndGggPSB1bml0KC4xLCAiaW5jaGVzIiksIGVuZHMgPSAibGFzdCIpLAojICAgICAgICAgICAgIHNob3cubGVnZW5kID0gRkFMU0UpICsKIyAgIGdlb21fcGF0aChkYXRhID0gRGF0bSwgYWVzKERhdGUsIE5IYzE0KSwgY29sb3IgPSAiZGFya2dyYXkiKSArCiMgICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICdFY29zeXN0ZW0nLAojICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9YygnRic9JyNhMzU1MTMnLCdHJz0nIzEzNjFhMycpLAojICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ0ZvcmVzdCcsJ0dyYXNzbGFuZCcpKSArCiMgICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICdUcmVhdG1lbnQnLAojICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFpci1kcnkiID0gMSwgCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeSArIHN0b3JhZ2UiID0gMCwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250cm9sIiA9IDE2KSkgKwojICAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMjAxMCwgMjAyMCksIGJyZWFrcyA9IGMoMjAxMywgMjAxNiwgMjAxOSkpICsKIyAgIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKC0xNSwgMTAwKSkgKwojICAgeGxhYignWWVhciBzYW1wbGVkJykgKwojICAgeWxhYihleHByZXNzaW9uKCdtZWFuICcqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwojICAgZmFjZXRfd3JhcCh+IElELCBuY29sID0gMykgKwojICAgdGhlbWVfYncoKSArCiMgICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKQoKIyBBZGQgIlR5cGUiIHRvIERhdG0gdG8gZGlzcGxheSBsZWdlbmQKRGF0bSRBdG1vc3BoZXJlIDwtICJhdG1vc3BoZXJlIgphdG0uZDE0Yy4yMDExIDwtIERhdG1bRGF0bSREYXRlID09IDIwMTEuNSwgIk5IYzE0Il0KYXRtLmQxNGMuMjAxOSA8LSBEYXRtW0RhdG0kRGF0ZSA9PSAyMDE5LjUsICJOSGMxNCJdCgojIHBsb3Qgb3ZlciB0aW1lLCBhdmVyYWdlZCBieSBUeXBlCiMgZmlyc3QgbmVlZCB0byBjYWxjdWxhdGUgZ3JvdXAgbWVhbnMKYXJjLnJld2V0LjE0Yy5pbmMuR00gPC0gYWxsLjE0Yy5zdW0uZGYgJT4lCiAgZmlsdGVyKEV4cGVyaW1lbnQgIT0gInRtZSIgJiBQZXJpb2QgPT0gImluYyIpICU+JQogIGdyb3VwX2J5KEV4cGVyaW1lbnQsIFR5cGUsIFllYXJTYW1wbGVkLCBUcmVhdG1lbnQpICU+JQogIHN1bW1hcml6ZShhY3Jvc3MoZDE0Y19jb3JyX21lYW4sIG1lYW4sIG5hLnJtID0gVFJVRSkpICU+JQogIG11dGF0ZSh5ZWFyLlR5cGUgPSBwYXN0ZShZZWFyU2FtcGxlZCwgVHlwZSksCiAgICAgICAgIGRkMTRjID0gaWZlbHNlKFllYXJTYW1wbGVkID09IDIwMTEsIAogICAgICAgICAgICAgICAgICAgICAgICAgIGF0bS5kMTRjLjIwMTEgLSBkMTRjX2NvcnJfbWVhbiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgYXRtLmQxNGMuMjAxOSAtIGQxNGNfY29ycl9tZWFuKSkKICAKIyAjIG9yaWdpbmFsIHBsb3QKIyBhbGwuMTRjLnN1bTIgJT4lCiMgICBmaWx0ZXIoUGVyaW9kID09ICJpbmMiKSAlPiUKIyAgIG11dGF0ZSh5ZWFyLlR5cGUgPSBwYXN0ZShZZWFyU2FtcGxlZCwgVHlwZSksCiMgICAgICAgICAgRWNvID0gaWZlbHNlKFR5cGUgPT0gIkYiLCAiRm9yZXN0IiwgIkdyYXNzbGFuZCIpKSAlPiUKIyAgIGdncGxvdCguLCBhZXMoWWVhclNhbXBsZWQsIGQxNGNfY29ycl9tZWFuLCBjb2xvciA9IFR5cGUpKSArCiMgICBnZW9tX3BvaW50KGFlcyhzaGFwZSA9IFRyZWF0bWVudCksIHNpemUgPSAzLCBzdHJva2UgPSAxLjUpICsKIyAgIGdlb21fcGF0aChhZXMoZ3JvdXAgPSB5ZWFyLlR5cGUpLCAKIyAgICAgICAgICAgICBhcnJvdyA9IGFycm93KHR5cGUgPSAib3BlbiIsIGxlbmd0aCA9IHVuaXQoLjEsICJpbmNoZXMiKSwgZW5kcyA9ICJmaXJzdCIpLAojICAgICAgICAgICAgIHNob3cubGVnZW5kID0gRkFMU0UsCiMgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDIsIHByZXNlcnZlID0gInNpbmdsZSIpLAojICAgICAgICAgICAgIHNpemUgPSAxLjIpICsKIyAgIGdlb21fcGF0aChkYXRhID0gRGF0bSwgYWVzKERhdGUsIE5IYzE0LCBsaW5ldHlwZSA9IEF0bW9zcGhlcmUpLCBjb2xvciA9ICJibGFjayIpICsKIyAgIGdlb21fZXJyb3JiYXIoCiMgICAgIGFlcyh5bWluID0gZDE0Y19jb3JyX2wsIAojICAgICAgICAgeW1heCA9IGQxNGNfY29ycl91LCAKIyAgICAgICAgIGNvbG9yID0gVHlwZSksIAojICAgICB3aWR0aCA9IC41LAojICAgICBhbHBoYSA9IC4zKSArCiMgICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICdFY29zeXN0ZW0nLAojICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoJ0YnID0gJyNhMzU1MTMnLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0cnID0gJyMxMzYxYTMnKSwKIyAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCdGb3Jlc3QnLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0dyYXNzbGFuZCcpKSArCiMgICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICdUcmVhdG1lbnQnLAojICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFpci1kcnkiID0gMSwgCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeSArIHN0b3JhZ2UiID0gMCwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250cm9sIiA9IDE2KSwKIyAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJhaXItZHJ5IiA9ICJhaXItZHJ5IiwgCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeSArIHN0b3JhZ2UiID0gImFpci1kcnkgKyBzdG9yYWdlIiwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250cm9sIiA9ICJjb250cm9sLTEgKDIwMTEpXG5jb250cm9sLTIgKDIwMTkpIikpICsKIyAgIGd1aWRlcyhsaW5ldHlwZSA9IGd1aWRlX2xlZ2VuZCh0aXRsZSA9IE5VTEwpKSArCiMgICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygyMDEwLCAyMDIwKSwgYnJlYWtzID0gYygyMDExLCAyMDE5KSkgKwojICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLTE1LCAxMDApKSArCiMgICB4bGFiKCdZZWFyIHNhbXBsZWQnKSArCiMgICB5bGFiKGV4cHJlc3Npb24oJ21lYW4gJypEZWx0YSonJ14xNConQy1DTydbMl0qJyAo4oCwKScpKSArCiMgICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKEVjbykpICsKIyAgIHRoZW1lX2J3KCkgKwojICAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKCiMgUGxvdCBhbGwgcG9pbnRzIGluIGJhY2tncm91bmQKYWxsLjE0Yy5zdW0uZGYgJT4lCiAgZmlsdGVyKEV4cGVyaW1lbnQgIT0gInRtZSIgJiBQZXJpb2QgPT0gImluYyIpICU+JQogIGdncGxvdCguLCBhZXMoWWVhclNhbXBsZWQsIGQxNGNfY29ycl9tZWFuLCBjb2xvciA9IFR5cGUpKSArCiAgZ2VvbV9wb2ludChkYXRhID0gYXJjLnJld2V0LjE0Yy5pbmMuR00sIAogICAgICAgICAgICAgYWVzKFllYXJTYW1wbGVkLCBkMTRjX2NvcnJfbWVhbiwgc2hhcGUgPSBUcmVhdG1lbnQpLAogICAgICAgICAgICAgc2l6ZSA9IDQsIHN0cm9rZSA9IDIpICsKICBnZW9tX3BvaW50KGFlcyhzaGFwZSA9IFRyZWF0bWVudCksIAogICAgICAgICAgICAgc2l6ZSA9IDIsIGFscGhhID0gLjUsIAogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDEuMTEsIHByZXNlcnZlID0gInNpbmdsZSIpLAogICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogIGdlb21fZXJyb3JiYXIoCiAgICBhZXMoeW1pbiA9IGQxNGNfY29ycl9taW4sIAogICAgICAgIHltYXggPSBkMTRjX2NvcnJfbWF4KSwgCiAgICB3aWR0aCA9IC40LCBhbHBoYSA9IC4zLCAKICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAxLjIsIHByZXNlcnZlID0gInNpbmdsZSIpKSArCiAgZ2VvbV9wYXRoKGRhdGEgPSBhcmMucmV3ZXQuMTRjLmluYy5HTSwKICAgICAgICAgICAgYWVzKFllYXJTYW1wbGVkLCBkMTRjX2NvcnJfbWVhbixncm91cCA9IHllYXIuVHlwZSksCiAgICAgICAgICAgIGFycm93ID0gYXJyb3codHlwZSA9ICJvcGVuIiwgbGVuZ3RoID0gdW5pdCguMSwgImluY2hlcyIpLCBlbmRzID0gImZpcnN0IiksCiAgICAgICAgICAgIHNob3cubGVnZW5kID0gRkFMU0UsCiAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAtMS40LCBwcmVzZXJ2ZSA9ICJzaW5nbGUiKSwKICAgICAgICAgICAgc2l6ZSA9IDEuMikgKwogIGdlb21fcGF0aChkYXRhID0gRGF0bSwgYWVzKERhdGUsIE5IYzE0LCBsaW5ldHlwZSA9IEF0bW9zcGhlcmUpLCBjb2xvciA9ICJibGFjayIpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICdFY29zeXN0ZW0nLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCdGJyA9ICcjYTM1NTEzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRycgPSAnIzEzNjFhMycpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCdGb3Jlc3QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdHcmFzc2xhbmQnKSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gJ1RyZWF0bWVudCcsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFpci1kcnkiID0gMSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpci1kcnkgKyBzdG9yYWdlIiA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRyb2wiID0gMTYpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJhaXItZHJ5IiA9ICJhaXItZHJ5IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpci1kcnkgKyBzdG9yYWdlIiA9ICJhaXItZHJ5ICsgc3RvcmFnZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRyb2wiID0gImNvbnRyb2wtMSAoMjAxMSlcbmNvbnRyb2wtMiAoMjAxOSkiKSkgKwogIGd1aWRlcyhsaW5ldHlwZSA9IGd1aWRlX2xlZ2VuZCh0aXRsZSA9IE5VTEwpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMjAxMCwgMjAyMCksIGJyZWFrcyA9IGMoMjAxMSwgMjAxOSkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtMTUsIDEwMCkpICsKICB4bGFiKCdZZWFyIHNhbXBsZWQnKSArCiAgeWxhYihleHByZXNzaW9uKCdtZWFuICcqRGVsdGEqJydeMTQqJ0MtQ08nWzJdKicgKOKAsCknKSkgKwogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoVHlwZSksCiAgICAgICAgICAgICBsYWJlbGxlciA9IGxhYmVsbGVyKFR5cGUgPSBjKCJGIiA9ICJGb3Jlc3QiLCAiRyIgPSAiR3Jhc3NsYW5kIikpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKCiMgcGxvdCBkZDE0YwphbGwuMTRjLnN1bS5kZiAlPiUKICBmaWx0ZXIoRXhwZXJpbWVudCAhPSAidG1lIiAmIFBlcmlvZCA9PSAiaW5jIikgJT4lCiAgbXV0YXRlKGF0bTE0YyA9IGlmZWxzZShZZWFyU2FtcGxlZCA9PSAyMDExLCBhdG0uZDE0Yy4yMDExLCBhdG0uZDE0Yy4yMDE5KSkgJT4lCiAgbXV0YXRlKGRkMTRjID0gYXRtMTRjIC0gZDE0Y19jb3JyX21lYW4sCiAgICAgICAgIGRkMTRjX21pbiA9IGF0bTE0YyAtICBkMTRjX2NvcnJfbWluLAogICAgICAgICBkZDE0Y19tYXggPSBhdG0xNGMgLSAgZDE0Y19jb3JyX21heCkgJT4lCiAgZ2dwbG90KC4sIGFlcyhZZWFyU2FtcGxlZCwgZGQxNGMsIGNvbG9yID0gVHlwZSkpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV9wb2ludChkYXRhID0gYXJjLnJld2V0LjE0Yy5pbmMuR00sIAogICAgICAgICAgICAgYWVzKFllYXJTYW1wbGVkLCBkZDE0Yywgc2hhcGUgPSBUcmVhdG1lbnQpLAogICAgICAgICAgICAgc2l6ZSA9IDQsIHN0cm9rZSA9IDIpICsKICBnZW9tX3BvaW50KGFlcyhzaGFwZSA9IFRyZWF0bWVudCksIAogICAgICAgICAgICAgc2l6ZSA9IDIsIGFscGhhID0gLjUsIAogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDEuMTEsIHByZXNlcnZlID0gInNpbmdsZSIpLAogICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogIGdlb21fZXJyb3JiYXIoCiAgICBhZXMoeW1pbiA9IGRkMTRjX21pbiwgCiAgICAgICAgeW1heCA9IGRkMTRjX21heCksIAogICAgd2lkdGggPSAuNCwgYWxwaGEgPSAuMywgCiAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMS4yLCBwcmVzZXJ2ZSA9ICJzaW5nbGUiKSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gJ0Vjb3N5c3RlbScsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoJ0YnID0gJyNhMzU1MTMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdHJyA9ICcjMTM2MWEzJyksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ0ZvcmVzdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0dyYXNzbGFuZCcpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAnVHJlYXRtZW50JywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYWlyLWRyeSIgPSAxLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeSArIHN0b3JhZ2UiID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udHJvbCIgPSAxNiksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoImFpci1kcnkiID0gImFpci1kcnkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeSArIHN0b3JhZ2UiID0gImFpci1kcnkgKyBzdG9yYWdlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udHJvbCIgPSAiY29udHJvbC0xICgyMDExKVxuY29udHJvbC0yICgyMDE5KSIpKSArCiAgZ3VpZGVzKGxpbmV0eXBlID0gZ3VpZGVfbGVnZW5kKHRpdGxlID0gTlVMTCkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygyMDEwLCAyMDIwKSwgYnJlYWtzID0gYygyMDExLCAyMDE5KSkgKwogIHhsYWIoJ1llYXIgc2FtcGxlZCcpICsKICB5bGFiKGV4cHJlc3Npb24oJ21lYW4gJypEZWx0YSpEZWx0YSonJ14xNConQy1DTydbMl0qJyAo4oCwKScpKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhUeXBlKSwKICAgICAgICAgICAgIGxhYmVsbGVyID0gbGFiZWxsZXIoVHlwZSA9IGMoIkYiID0gIkZvcmVzdCIsICJHIiA9ICJHcmFzc2xhbmQiKSkpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKQoKIyBQbG90IEhhaW5pY2ggcG9pbnRzIG9ubHksIG5vIGFycm93cwphbGwuMTRjLnN1bS5kZiAlPiUKICBmaWx0ZXIoRXhwZXJpbWVudCAhPSAidG1lIiAmIFBlcmlvZCA9PSAiaW5jIiAmIFNpdGUgPT0gIkhhaW5pY2giKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKFllYXJTYW1wbGVkLCBkMTRjX2NvcnJfbWVhbiwgY29sb3IgPSBUeXBlKSkgKwogIGdlb21fcG9pbnQoZGF0YSA9IGFyYy5yZXdldC4xNGMuaW5jLkdNLCAKICAgICAgICAgICAgIGFlcyhZZWFyU2FtcGxlZCwgZDE0Y19jb3JyX21lYW4sIHNoYXBlID0gVHJlYXRtZW50KSwKICAgICAgICAgICAgIHNpemUgPSA0LCBzdHJva2UgPSAyLAogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IC0uNSwgcHJlc2VydmUgPSAic2luZ2xlIikpICsKICBnZW9tX3BvaW50KGFlcyhzaGFwZSA9IFRyZWF0bWVudCksIAogICAgICAgICAgICAgc2l6ZSA9IDIsIGFscGhhID0gLjUsIAogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IC41LCBwcmVzZXJ2ZSA9ICJzaW5nbGUiKSwKICAgICAgICAgICAgIHNob3cubGVnZW5kID0gRkFMU0UpICsKICBnZW9tX2Vycm9yYmFyKAogICAgYWVzKHltaW4gPSBkMTRjX2NvcnJfbWluLCAKICAgICAgICB5bWF4ID0gZDE0Y19jb3JyX21heCksIAogICAgd2lkdGggPSAuNSwgYWxwaGEgPSAuMywgCiAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gLjYsIHByZXNlcnZlID0gInNpbmdsZSIpKSArCiAgZ2VvbV9wYXRoKGRhdGEgPSBEYXRtLCBhZXMoRGF0ZSwgTkhjMTQsIGxpbmV0eXBlID0gQXRtb3NwaGVyZSksIGNvbG9yID0gImJsYWNrIikgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gJ0Vjb3N5c3RlbScsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoJ0YnID0gJyNhMzU1MTMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdHJyA9ICcjMTM2MWEzJyksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ0ZvcmVzdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0dyYXNzbGFuZCcpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAnVHJlYXRtZW50JywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYWlyLWRyeSIgPSAxLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeSArIHN0b3JhZ2UiID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udHJvbCIgPSAxNiksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoImFpci1kcnkiID0gImFpci1kcnkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeSArIHN0b3JhZ2UiID0gImFpci1kcnkgKyBzdG9yYWdlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udHJvbCIgPSAiY29udHJvbC0xICgyMDExKVxuY29udHJvbC0yICgyMDE5KSIpKSArCiAgZ3VpZGVzKGxpbmV0eXBlID0gZ3VpZGVfbGVnZW5kKHRpdGxlID0gTlVMTCkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygyMDEwLCAyMDIwKSwgYnJlYWtzID0gYygyMDExLCAyMDE5KSkgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKC0xNSwgMTAwKSkgKwogIHhsYWIoJ1llYXIgc2FtcGxlZCcpICsKICB5bGFiKGV4cHJlc3Npb24oJ21lYW4gJypEZWx0YSonJ14xNConQy1DTydbMl0qJyAo4oCwKScpKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhUeXBlKSwKICAgICAgICAgICAgIGxhYmVsbGVyID0gbGFiZWxsZXIoVHlwZSA9IGMoIkYiID0gIkZvcmVzdCIsICJHIiA9ICJHcmFzc2xhbmQiKSkpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKQoKIyBwbG90IHRyZW5kcyBvdmVyIHRpbWUgYnkgc2FtcGxlLCB0cmVhdG1lbnQKYWxsLjE0Yy5zdW0uZGYgJT4lCiAgZmlsdGVyKEV4cGVyaW1lbnQgIT0gInRtZSIgJiBQZXJpb2QgPT0gImluYyIgJiBTaXRlID09ICJIYWluaWNoIikgJT4lCiAgbXV0YXRlKHRyZWF0LklEID0gcGFzdGUwKHRyZWF0LmJpLCBJRCkpICU+JQogIGdncGxvdCguLCBhZXMoWWVhclNhbXBsZWQsIGQxNGNfY29ycl9tZWFuLCBjb2xvciA9IFR5cGUpKSArCiAgZ2VvbV9wb2ludChhZXMoc2hhcGUgPSBUcmVhdG1lbnQpLCAKICAgICAgICAgICAgIHNpemUgPSAyLCBhbHBoYSA9IC41KSArCiAgZ2VvbV9wYXRoKGFlcyhncm91cCA9IHRyZWF0LklELCBsaW5ldHlwZSA9IHRyZWF0LmJpKSkgKwogIGdlb21fZXJyb3JiYXIoCiAgICBhZXMoeW1pbiA9IGQxNGNfY29ycl9taW4sIAogICAgICAgIHltYXggPSBkMTRjX2NvcnJfbWF4KSwgCiAgICB3aWR0aCA9IC41LCBhbHBoYSA9IC4zKSArCiAgZ2VvbV9wYXRoKGRhdGEgPSBEYXRtLCBhZXMoRGF0ZSwgTkhjMTQpLCBjb2xvciA9ICJibGFjayIpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICdFY29zeXN0ZW0nLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCdGJyA9ICcjYTM1NTEzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRycgPSAnIzEzNjFhMycpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCdGb3Jlc3QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdHcmFzc2xhbmQnKSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gJ1RyZWF0bWVudCcsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFpci1kcnkiID0gMSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpci1kcnkgKyBzdG9yYWdlIiA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRyb2wiID0gMTYpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJhaXItZHJ5IiA9ICJhaXItZHJ5IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpci1kcnkgKyBzdG9yYWdlIiA9ICJhaXItZHJ5ICsgc3RvcmFnZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRyb2wiID0gImNvbnRyb2wtMSAoMjAxMSlcbmNvbnRyb2wtMiAoMjAxOSkiKSkgKwogIGd1aWRlcyhsaW5ldHlwZSA9IGd1aWRlX2xlZ2VuZCh0aXRsZSA9IE5VTEwpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMjAxMCwgMjAyMCksIGJyZWFrcyA9IGMoMjAxMSwgMjAxOSkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtMTUsIDEwMCkpICsKICB4bGFiKCdZZWFyIHNhbXBsZWQnKSArCiAgeWxhYihleHByZXNzaW9uKCdtZWFuICcqRGVsdGEqJydeMTQqJ0MtQ08nWzJdKicgKOKAsCknKSkgKwogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoVHlwZSksCiAgICAgICAgICAgICBsYWJlbGxlciA9IGxhYmVsbGVyKFR5cGUgPSBjKCJGIiA9ICJGb3Jlc3QiLCAiRyIgPSAiR3Jhc3NsYW5kIikpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKCiMgcGxvdCBTRCBpbnN0ZWFkIG9mIFNFCmFyYy5yZXdldC5wb29sZWQgPC0gYmluZF9yb3dzKGxhcHBseSgKICBzcGxpdCgKICAgIGFsbC4xNGMuc3VtLmRmW2FsbC4xNGMuc3VtLmRmJEV4cGVyaW1lbnQgIT0gInRtZSIgJiBhbGwuMTRjLnN1bS5kZiRQZXJpb2QgPT0gImluYyIsIF0sCiAgICBhbGwuMTRjLnN1bS5kZlthbGwuMTRjLnN1bS5kZiRFeHBlcmltZW50ICE9ICJ0bWUiICYgYWxsLjE0Yy5zdW0uZGYkUGVyaW9kID09ICJpbmMiLCAiRXhwZXJpbWVudCJdKSwgZnVuY3Rpb24oZXhwKSB7CiAgICAgIGJpbmRfcm93cyhsYXBwbHkoc3BsaXQoZXhwLCBleHAkVHlwZSksIGZ1bmN0aW9uKHR5cCkgewogICAgICAgIGJpbmRfcm93cyhsYXBwbHkoc3BsaXQodHlwLCB0eXAkdHJlYXQuYmkpLCBmdW5jdGlvbih0cnQpIHsKICAgICAgICAgIHRydCRkMTRjX2NvcnJfc2QgPC0gaWZlbHNlKAogICAgICAgICAgICBpcy5uYSh0cnQkZDE0Y19jb3JyX3NkKSwgc3FydChtZWFuLnJlcC52YXIpLCB0cnQkZDE0Y19jb3JyX3NkKQogICAgICAgICAgcmV0dXJuKHNhbXBsZS5kZWNvbXAobiA9IHJlcCgyLCBucm93KHRydCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlLm1lYW4gPSB0cnQkZDE0Y19jb3JyX21lYW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGUuc2QgPSB0cnQkZDE0Y19jb3JyX3NkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZS5zZCA9IFRSVUUpKQogICAgICAgIH0pLCAuaWQgPSAidHJlYXQuYmkiKQogICAgICB9KSwgLmlkID0gIlR5cGUiKQogICAgfSksIC5pZCA9ICJFeHBlcmltZW50IikKc2F2ZShhcmMucmV3ZXQucG9vbGVkLCBmaWxlID0gInRzLnBvb2xlZC5SZGF0YSIpCiMgcGxvdAphcmMucmV3ZXQucG9vbGVkW2dyZXAoInBvb2xlZCIsIHJvdy5uYW1lcyhhcmMucmV3ZXQucG9vbGVkKSksXSAlPiUKICBtdXRhdGUoWWVhclNhbXBsZWQgPSBpZmVsc2UoRXhwZXJpbWVudCA9PSAiYXJjIiwgMjAxMSwgMjAxOSksCiAgICAgICAgIFRyZWF0bWVudCA9IGZhY3RvcihpZmVsc2UodHJlYXQuYmkgPT0gInRyZWF0bWVudCIgJiBFeHBlcmltZW50ID09ICJhcmMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5L3Jld2V0ICsgc3RvcmFnZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHRyZWF0LmJpID09ICJ0cmVhdG1lbnQiICYgRXhwZXJpbWVudCA9PSAicmV3ZXQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpci1kcnkvcmV3ZXQiLCB0cmVhdC5iaSkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250cm9sIiwgImFpci1kcnkvcmV3ZXQgKyBzdG9yYWdlIiwgImFpci1kcnkvcmV3ZXQiKSksCiAgICAgICAgIHVwcGVyID0gc2FtcGxlLm1lYW4gKyBzYW1wbGUuc2QsCiAgICAgICAgIGxvd2VyID0gc2FtcGxlLm1lYW4gLSBzYW1wbGUuc2QpICU+JQogIGdncGxvdCguLCBhZXMoWWVhclNhbXBsZWQsIHNhbXBsZS5tZWFuLCBjb2xvciA9IFR5cGUpKSArCiAgZ2VvbV9wb2ludChhZXMoc2hhcGUgPSBUcmVhdG1lbnQpLAogICAgICAgICAgICAgc2l6ZSA9IDQsIHN0cm9rZSA9IDEuNSwKICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAxKSkgKwogIGdlb21fZXJyb3JiYXIoCiAgICBhZXMoeW1pbiA9IHVwcGVyLCAKICAgICAgICB5bWF4ID0gbG93ZXIsCiAgICAgICAgbGluZXR5cGUgPSBUcmVhdG1lbnQpLCAKICAgIHdpZHRoID0gLjQsIGFscGhhID0gLjMsIAogICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDEpLAogICAgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogIGdlb21fcGF0aChkYXRhID0gRGF0bSwgYWVzKERhdGUsIE5IYzE0KSwgY29sb3IgPSAiYmxhY2siKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAnRWNvc3lzdGVtJywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygnRicgPSAnI2EzNTUxMycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0cnID0gJyMxMzYxYTMnKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnRm9yZXN0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnR3Jhc3NsYW5kJykpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICdUcmVhdG1lbnQnLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhaXItZHJ5L3Jld2V0IiA9IDEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5L3Jld2V0ICsgc3RvcmFnZSIgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250cm9sIiA9IDE2KSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiYWlyLWRyeS9yZXdldCIgPSAiYWlyLWRyeS9yZXdldCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5L3Jld2V0ICsgc3RvcmFnZSIgPSAiYWlyLWRyeS9yZXdldCArIHN0b3JhZ2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250cm9sIiA9ICJjb250cm9sLTEgKDIwMTEpXG5jb250cm9sLTIgKDIwMTkpIikpICsKICBzY2FsZV9saW5ldHlwZV9tYW51YWwodmFsdWVzID0gYygiYXRtb3NwaGVyZSIgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5L3Jld2V0IiA9IDEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5L3Jld2V0ICsgc3RvcmFnZSIgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250cm9sIiA9IDEpKSArCiAgZ3VpZGVzKGxpbmV0eXBlID0gIm5vbmUiKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMjAxMCwgMjAyMCksIGJyZWFrcyA9IGMoMjAxMSwgMjAxOSkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtMTUsIDEwNSkpICsKICB4bGFiKCdZZWFyIHNhbXBsZWQnKSArCiAgeWxhYihleHByZXNzaW9uKCdtZWFuICcqRGVsdGEqJydeMTQqJ0MtQ08nWzJdKicgKOKAsCknKSkgKwogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoVHlwZSksCiAgICAgICAgICAgICBsYWJlbGxlciA9IGxhYmVsbGVyKFR5cGUgPSBjKCJGIiA9ICJGb3Jlc3QiLCAiRyIgPSAiR3Jhc3NsYW5kIikpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCkpCmBgYAo+KipGaWcgYHIge2ZpZy5uICsgNH1gLiBUaW1lIHNlcmllcyBvZiBjb250cm9sIGFuZCB0cmVhdG1lbnQgJFxEZWx0YSReMTReQy1DT34yfiAoRXhwZXJpbWVudHMgMSBhbmQgMikqKgo+KkNhcHRpb246KiBGaWxsZWQgY2lyY2xlcyBzaG93ICRcRGVsdGEkXjE0XkMtQ09+Mn4gb2JzZXJ2ZWQgZm9yIGJvdGggY29udHJvbC0xIGFuZCBjb250cm9sLTIgc2FtcGxlcyAoMjAxMSBhbmQgMjAxOSBwb2ludHMsIHJlc3BlY3RpdmVseSkuIE9wZW4gc3ltYm9scyBzaG93ICRcRGVsdGEkXjE0XkMtQ09+Mn4gb2JzZXJ2ZWQgZm9yIHRyZWFtZW50IHNhbXBsZXM6IG9wZW4gc3F1YXJlcyA9IGFpci1kcnkgKyBzdG9yYWdlIHRyZWF0bWVudCwgRXhwZXJpbWVudCAxOyBvcGVuIGNpcmNsZXMgPSBhaXItZHJ5IG9ubHkgdHJlYXRtZW50LCBFeHBlcmltZW50IDIuIFBvaW50cyBhcmUgbWVhbnMgYW5kIGVycm9yIGJhcnMgc2hvdyB0aGUgcG9vbGVkIHN0YW5kYXJkIGRldmlhdGlvbi4gVGhlIGJsYWNrIGxpbmUgc2hvd3MgJFxEZWx0YSReMTReQyBvZiB0aGUgYXRtb3NwaGVyZS4KCj4qKlN1cHBsZW1lbnRhbCBGaWcgYHIge3NmaWcubiArIDJ9YC4gVGltZSBzZXJpZXMgb2YgY29udHJvbCBhbmQgdHJlYXRtZW50ICRcZGVsdGEkXjEzXkMtQ09+Mn4gKEV4cGVyaW1lbnRzIDEgYW5kIDIpKioKCj4qQ2FwdGlvbjoqIEZpbGxlZCBjaXJjbGVzIHNob3cgJFxkZWx0YSReMTNeQy1DT34yfiBvYnNlcnZlZCBmb3IgY29udHJvbCBzYW1wbGVzLCB3aGlsZSBvcGVuIHN5bWJvbHMgc2hvdyAkXGRlbHRhJF4xM15DLUNPfjJ+IG9ic2VydmVkIGZvciB0cmVhbWVudCBzYW1wbGVzIChvcGVuIHNxdWFyZXMgPSBhaXItZHJ5ICsgc3RvcmFnZSB0cmVhdG1lbnQsIEV4cGVyaW1lbnQgMSwgMjAxMTsgb3BlbiBjaXJjbGVzID0gYWlyLWRyeSBvbmx5IHRyZWF0bWVudCwgRXhwZXJpbWVudCAyLCAyMDE5KS4gUG9pbnRzIGFyZSBtZWFucyBhbmQgZXJyb3IgYmFycyBzaG93IHN0YW5kYXJkIGRldmlhdGlvbnMuIAoKKkVmZmVjdCBvZiBjdW11bGF0aXZlIHJlc3BpcmVkIGNhcmJvbiBvbiBeMTReQy1DT34yfioKCmBgYHtyIGN0bC10cnQtc3RhdHMsIGluY2x1ZGUgPSBGQUxTRX0KIyBjYWxjdWxhdGUgZGlmcyBjdGwtdHJ0LCBsb29rIGF0IGVmZmVjdCBvZiBDIHJlc3AKYXJjLnJld2V0LmluYy4xNGMkdHJlYXQuYmkgPC0gaWZlbHNlKGFyYy5yZXdldC5pbmMuMTRjJFRyZWF0bWVudCA9PSAiY29udHJvbCIsICJjb250cm9sIiwgInRyZWF0bWVudCIpCmFyYy5yZXdldC5pbmMuMTRjLnN1bSA8LSBhcmMucmV3ZXQuaW5jLjE0YyAlPiUKICBncm91cF9ieShJRCwgRXhwZXJpbWVudCwgVHlwZSwgdHJlYXQuYmkpICU+JQogIGFkZF9jb3VudCgpICU+JQogIHN1bW1hcmlzZV9pZigucHJlZGljYXRlID0gZnVuY3Rpb24oeCkgaXMubnVtZXJpYyh4KSwKICAgICAgICAgICAgICAgLmZ1bnMgPSBsaXN0KG1lYW4gPSAibWVhbiIsIHNkID0gInNkIikpCiAgCmFyYy5yZXdldC5pbmMuMTRjLnN1bSRuX3NkIDwtIE5VTEwKCmoudmFycyA8LSBjKCJJRCIsICJFeHBlcmltZW50IiwgIlR5cGUiLCAiZDE0Y19jb3JyX21lYW4iLCAibWdDTzIuQ19nQ19tZWFuIiwgImQxNGNfY29ycl9zZCIsICJtZ0NPMi5DX2dDX3NkIikKYXJjLnJld2V0LjE0Yy5jdGwudHJ0IDwtIGxlZnRfam9pbigKICBhcmMucmV3ZXQuaW5jLjE0Yy5zdW1bYXJjLnJld2V0LmluYy4xNGMuc3VtJHRyZWF0LmJpID09ICJjb250cm9sIiwgai52YXJzXSwKICBhcmMucmV3ZXQuaW5jLjE0Yy5zdW1bYXJjLnJld2V0LmluYy4xNGMuc3VtJHRyZWF0LmJpICE9ICJjb250cm9sIiwgai52YXJzXSwKICBieSA9IGMoai52YXJzWzE6M10pLAogIHN1ZmZpeCA9IGMoIi5jdGwiLCAiLnRydCIpKQoKCmFyYy5yZXdldC4xNGMuY3RsLnRydCRkMTRjX2RpZiA8LSBhcmMucmV3ZXQuMTRjLmN0bC50cnQkZDE0Y19jb3JyX21lYW4uY3RsIC0gYXJjLnJld2V0LjE0Yy5jdGwudHJ0JGQxNGNfY29ycl9tZWFuLnRydAphcmMucmV3ZXQuMTRjLmN0bC50cnQkY19kaWYgPC0gYXJjLnJld2V0LjE0Yy5jdGwudHJ0JG1nQ08yLkNfZ0NfbWVhbi5jdGwgLSBhcmMucmV3ZXQuMTRjLmN0bC50cnQkbWdDTzIuQ19nQ19tZWFuLnRydAoKIyBzYXZlIFJkYXQKc2F2ZShhcmMucmV3ZXQuMTRjLmN0bC50cnQsIGZpbGUgPSAiLi9hcmMucmV3ZXQuMTRjLmN0bC50cnQuUmRhdGEiKQoKIyMgTG9vayBhdCBlZmZlY3Qgb2YgY19kaWYgYnkgZXhwZXJpbWVudCBhbmQgaW50ZXJhY3Rpb24gd2l0aCB0eXBlCiMgYWlyLWRyeSArIHN0b3JhZ2UKc3VtbWFyeShsbShkMTRjX2RpZiB+IGNfZGlmICogVHlwZSwgYXJjLnJld2V0LjE0Yy5jdGwudHJ0W2FyYy5yZXdldC4xNGMuY3RsLnRydCRFeHBlcmltZW50ID09ICJhcmMiLCBdKSkKIyBlZmZlY3Qgb2YgY19kaWYgb24gZDE0Y19kaWYgbnM7IGludGVyYWN0aW9uIGFsc28gbnMKCiMgcmV3ZXQKc3VtbWFyeShsbShkMTRjX2RpZiB+IGNfZGlmICogVHlwZSwgYXJjLnJld2V0LjE0Yy5jdGwudHJ0W2FyYy5yZXdldC4xNGMuY3RsLnRydCRFeHBlcmltZW50ID09ICJyZXdldCIsIF0pKQojIGVmZmVjdCBvZiBjX2RpZiBtYXJnaW5hbGx5IHNpZ25pZmljYW50IChwID0gMC4wNjMyKQoKIyBMb29rIGF0IGVmZmVjdCBvZiBjX2RpZiBhbmQgaW50ZXJhY3Rpb24gd2l0aCB0eXBlIG92ZXJhbGwKc3VtbWFyeShsbShkMTRjX2RpZiB+IFR5cGUgKiBjX2RpZiAqIEV4cGVyaW1lbnQsIGFyYy5yZXdldC4xNGMuY3RsLnRydCkpCiMgbm8gc2lnbmlmaWNhbmNlIG9mIGNfZGlmIG92ZXJhbGwKcm0oai52YXJzKQpgYGAKCmBgYHtyIHBsb3QtMTRjLWJ5LWMtcmVzcH0KIyAxMC4gUGxvdCAkXERlbHRhJF4xNF5DIGFnYWluc3QgcHJvcG9ydGlvbiBvZiBzb2lsIEMgcmVzcGlyZWQgYnkgZXhwZXJpbWVudCwgbGFuZCBjb3ZlciwgYW5kIHNhbXBsaW5nIHBlcmlvZC4KCiMgSEVXMjIgY29udHJvbCBwcmUgcG9pbnQgZXhjbHVkZWQgdG8gbWFrZSBmaWd1cmUgbW9yZSByZWFkYWJsZSAKYWxsLjE0Yy5zdW0uZGYgJT4lCiAgZmlsdGVyKEV4cGVyaW1lbnQgIT0gInRtZSIpICU+JQogIG11dGF0ZShJRC50cmVhdCA9IHBhc3RlKElELCBUcmVhdG1lbnQpKSAlPiUKICBtdXRhdGUoSUQudHJlYXQuUGVyaW9kID0gcGFzdGUoSUQudHJlYXQsIFBlcmlvZCkpICU+JQogIGZpbHRlcihJRC50cmVhdC5QZXJpb2QgIT0gIkhFVzIyIGNvbnRyb2wgcHJlIikgJT4lCiAgbXV0YXRlKHRyZWF0LlBlcmlvZCA9IHBhc3RlKHRyZWF0LmJpLCBQZXJpb2QpLAogICAgICAgICBFY28gPSBpZmVsc2UoVHlwZSA9PSAiRiIsICJGb3Jlc3QiLCAiR3Jhc3NsYW5kIikpICU+JQogIGdncGxvdCguLCBhZXMobWdDTzIuQ19nQ19tZWFuLCBkMTRjX2NvcnJfbWVhbiwgY29sb3IgPSBUeXBlLCBzaGFwZSA9IHRyZWF0LlBlcmlvZCkpICsKICBnZW9tX3BvaW50KHNpemUgPSAzKSArCiAgZ2VvbV9wYXRoKGFlcyhncm91cCA9IElELnRyZWF0KSkgKwogIGdlb21fZXJyb3JiYXIoCiAgICBhZXMoeW1pbiA9IGQxNGNfY29ycl9taW4sIAogICAgICAgIHltYXggPSBkMTRjX2NvcnJfbWF4LCAKICAgICAgICBjb2xvciA9IFR5cGUpLCAKICAgIHdpZHRoID0gLjI1KSArCiAgZ2VvbV9lcnJvcmJhcmgoCiAgICBhZXMoeG1pbiA9IG1nQ08yLkNfZ0NfbWluLCAKICAgICAgICB4bWF4ID0gbWdDTzIuQ19nQ19tYXgsIAogICAgICAgIGNvbG9yID0gVHlwZSksIAogICAgaGVpZ2h0ID0gLjkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICdFY29zeXN0ZW0nLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPWMoJ0YnPScjYTM1NTEzJywnRyc9JyMxMzYxYTMnKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnRm9yZXN0JywnR3Jhc3NsYW5kJykpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICdTYW1wbGluZyBwZXJpb2QgKHRyZWF0bWVudCknLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPWMoMTYsIDE3LCAxLCAyKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiY29udHJvbCBwcmUiID0gJ3ByZS1pbmN1YmF0aW9uXG4oY29udHJvbCknLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udHJvbCBpbmMiID0gJ2VxdWlsaWJyaXVtIHJlc3BpcmF0aW9uXG4oY29udHJvbCknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmVhdG1lbnQgcHJlIiA9ICdwcmUtaW5jdWJhdGlvblxuKGFpci1kcnkvYWlyLWRyeSArIHN0b3JhZ2UpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJlYXRtZW50IGluYyIgPSAnZXF1aWxpYnJpdW0gcmVzcGlyYXRpb25cbihhaXItZHJ5L2Fpci1kcnkgKyBzdG9yYWdlKScpKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhFY28pLCByb3dzID0gdmFycyhZZWFyU2FtcGxlZCkpICsKICB4bGFiKGV4cHJlc3Npb24oJ1Jlc3BpcmVkIEMgKG1nIENPJ1syXSonLUMnKicgZyBzb2lsIEMnXi0xKicpJykpICsKICB5bGFiKGV4cHJlc3Npb24oJ21lYW4gJypEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQua2V5LmhlaWdodD11bml0KC44LCAiY20iKSkKYGBgCgo+KipTdXBwbGVtZW50YXJ5IEZpZy4gYHIge3NmaWcubiArIDN9YC4gQ2hhbmdlIGluIF4xNF5DLUNPfjJ+IGluIHJlbGF0aW9uIHRvIGN1bXVsYXRpdmUgc29pbCBjYXJib24gcmVzcGlyZWQqKgoKPipDYXB0aW9uOiogTm90ZSB0aGF0IHByZS1pbmN1YmF0aW9uICRcRGVsdGEkXjE0XkMgd2FzIG5vdCBtZWFzdXJlZCBmb3IgdGhlIGNvbnRyb2wtMSBzYW1wbGVzIGluIDIwMTEuIExpbWl0cyBleGNsdWRlIG91dGxpZXIgcG9pbnQgKEhFVzIyIGNvbnRyb2wtMiwgcHJlLWluY3ViYXRpb24pIGZvciBpbXByb3ZlZCBsZWdpYmlsaXR5LiBQb2ludHMgYXJlIG1lYW5zLCBlcnJvciBiYXJzIHNob3cgbWluIGFuZCBtYXggb2YgZHVwbGljYXRlIHNhbXBsZXMuCgpgYGB7ciBwbG90IDE0YyBieSBjIHJlc3Agd2l0aCBvdXRsaWVyLCBpbmNsdWRlID0gRkFMU0V9CiMgQ29kZSBmb3IgYSB0aGlyZCBwbG90IHdpdGggb3V0bGllciBkYXRhCiMgYXZlcmFnZSBjb250cm9sIGFuZCB0cmVhdG1lbnQgZGF0YQphbGwuMTRjLnN1bTMgPC0gc2VsZWN0KGFsbC4xNGMubHNbWzJdXSwgVHlwZSwgUGVyaW9kLCBUcmVhdG1lbnQsIEV4cGVyaW1lbnQsIFllYXJTYW1wbGVkLCBkMTRjX2NvcnIsIG1nQ08yLkNfZ0MpICU+JQogIGdyb3VwX2J5KFR5cGUsIFBlcmlvZCwgVHJlYXRtZW50LCBFeHBlcmltZW50LCBZZWFyU2FtcGxlZCkgJT4lCiAgYWRkX2NvdW50KCkgJT4lCiAgc3VtbWFyaXplX2FsbChsaXN0KG1lYW4gPSBtZWFuLCBzZCA9IHNkKSwgbmEucm0gPSBUUlVFKSAlPiUKICBtdXRhdGUoZDE0Y19jb3JyX3NlID0gZDE0Y19jb3JyX3NkL25fbWVhbiwKICAgICAgICAgZDE0Y19jb3JyX3UgPSBkMTRjX2NvcnJfbWVhbiArIGQxNGNfY29ycl9zZSoyLAogICAgICAgICBkMTRjX2NvcnJfbCA9IGQxNGNfY29ycl9tZWFuIC0gZDE0Y19jb3JyX3NlKjIsCiAgICAgICAgIG1nQ08yLkNfZ0Nfc2UgPSBtZ0NPMi5DX2dDX3NkL25fbWVhbiwKICAgICAgICAgbWdDTzIuQ19nQ191ID0gbWdDTzIuQ19nQ19tZWFuICsgbWdDTzIuQ19nQ19zZSoyLAogICAgICAgICBtZ0NPMi5DX2dDX2wgPSBtZ0NPMi5DX2dDX21lYW4gLSBtZ0NPMi5DX2dDX3NlKjIpIAoKYWxsLjE0Yy5zdW0zJHRyZWF0LmJpIDwtIGlmZWxzZShhbGwuMTRjLnN1bTMkVHJlYXRtZW50ID09ICJjb250cm9sIiwgImNvbnRyb2wiLCJ0cmVhdG1lbnQiKQphbGwuMTRjLnN1bTMgJT4lCiAgbXV0YXRlKHRyZWF0LlBlcmlvZCA9IHBhc3RlKHRyZWF0LmJpLCBQZXJpb2QpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKG1nQ08yLkNfZ0NfbWVhbiwgZDE0Y19jb3JyX21lYW4sIGNvbG9yID0gVHlwZSwgc2hhcGUgPSB0cmVhdC5QZXJpb2QpKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIGdlb21fcGF0aChhZXMoZ3JvdXAgPSBUcmVhdG1lbnQpKSArCiAgZ2VvbV9lcnJvcmJhcigKICAgIGFlcyh5bWluID0gZDE0Y19jb3JyX3UsIAogICAgICAgIHltYXggPSBkMTRjX2NvcnJfbCwgCiAgICAgICAgY29sb3IgPSBUeXBlKSwgCiAgICB3aWR0aCA9IC4yNSkgKwogIGdlb21fZXJyb3JiYXJoKAogICAgYWVzKHhtaW4gPSBtZ0NPMi5DX2dDX3UsIAogICAgICAgIHhtYXggPSBtZ0NPMi5DX2dDX2wsIAogICAgICAgIGNvbG9yID0gVHlwZSksIAogICAgaGVpZ2h0ID0gLjkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICdFY29zeXN0ZW0nLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPWMoJ0YnPScjYTM1NTEzJywnRyc9JyMxMzYxYTMnKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnRm9yZXN0JywnR3Jhc3NsYW5kJykpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICdTYW1wbGluZyBwZXJpb2QgKHRyZWF0bWVudCknLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPWMoMTYsIDE3LCAxLCAyKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiY29udHJvbCBwcmUiID0gJ3ByZS1pbmN1YmF0aW9uXG4oY29udHJvbCknLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udHJvbCBpbmMiID0gJ2VxdWlsaWJyaXVtIHJlc3BpcmF0aW9uXG4oY29udHJvbCknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmVhdG1lbnQgcHJlIiA9ICdwcmUtaW5jdWJhdGlvblxuKGFpci1kcnkvYWlyLWRyeSArIHN0b3JhZ2UpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJlYXRtZW50IGluYyIgPSAnZXF1aWxpYnJpdW0gcmVzcGlyYXRpb25cbihhaXItZHJ5L2Fpci1kcnkgKyBzdG9yYWdlKScpKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhUeXBlKSwgcm93cyA9IHZhcnMoWWVhclNhbXBsZWQpKSArCiAgeGxhYihleHByZXNzaW9uKCdSZXNwaXJlZCBDIChtZ0NPJ1syXSonLUMnKicgZyBzb2lsIEMnXi0xKicpJykpICsKICB5bGFiKGV4cHJlc3Npb24oJ21lYW4gJypEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQua2V5LmhlaWdodD11bml0KC44LCAiY20iKSkKYGBgCgojIERpc2N1c3Npb24KYGBge3IgY29uY2VwdHVhbC1tb2RlbC1jYWxjcywgaW5jbHVkZSA9IEZBTFNFfQojIGF0bSAxNEMKRGF0bSA8LSByYmluZChncmF2ZW4sIGZ1dHVyZTE0QykKc2F2ZShEYXRtLCBmaWxlID0gIkRhdG0uUkRhdGEiKQp5cnMgPC0gRGF0bSREYXRlCgojIGhlbHBlciBmeHMKbGFtYmRhIDwtICgxLzgyNjcpCgprIDwtIGZ1bmN0aW9uKEZtKSB7CiAgKEZtKmxhbWJkYSkvKDEtRm0pCn0KZm0gPC0gZnVuY3Rpb24oayl7CiAgay8oaytsYW1iZGEpCn0KZm1fMTRjIDwtIGZ1bmN0aW9uKGZtLCBkYXRlKSB7CiAgKGZtKmV4cChsYW1iZGEqKDE5NTAgLSBkYXRlKSkgLSAxKSoxMDAwCn0KCiMgY2FsY3VsYXRlIHJlc3AgZmx1eCBwb2ludHMgYXQgMTk5MSBhbmQgMjAxOSBhbmQgcHV0IGluIGRhdGEgZnJhbWUKYXJjLnJld2V0LnJzcCA8LSBhcmMucmV3ZXQuMTRjW2FyYy5yZXdldC4xNGMkU2l0ZSA9PSAiSGFpbmljaCIgJiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJjLnJld2V0LjE0YyRUeXBlID09ICJGIiAmIAogICAgICAgICAgICAgICAgICAgICAgICAgICBhcmMucmV3ZXQuMTRjJHRyZWF0LmJpID09ICJjb250cm9sIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAiZDE0Y19jb3JyX2luYyJdCnlycy5zbXAgPC0gYXJjLnJld2V0LjE0Y1thcmMucmV3ZXQuMTRjJFNpdGUgPT0gIkhhaW5pY2giICYgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyYy5yZXdldC4xNGMkVHlwZSA9PSAiRiIgJiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJjLnJld2V0LjE0YyR0cmVhdC5iaSA9PSAiY29udHJvbCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlllYXJTYW1wbGVkIl0gKyAuNQpvYnMucnNwIDwtIGRhdGEuZnJhbWUodGltZSA9IHlycy5zbXAsCiAgICAgICAgICAgICAgICAgICAgICByZXNwID0gYXJjLnJld2V0LnJzcCkKCmFyYy5yZXdldC5yc3AudCA8LSBhcmMucmV3ZXQuMTRjW2FyYy5yZXdldC4xNGMkU2l0ZSA9PSAiSGFpbmljaCIgJiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmMucmV3ZXQuMTRjJFR5cGUgPT0gIkYiICYgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJjLnJld2V0LjE0YyR0cmVhdC5iaSA9PSAidHJlYXRtZW50IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkMTRjX2NvcnJfaW5jIl0KeXJzLnNtcC50IDwtIGFyYy5yZXdldC4xNGNbYXJjLnJld2V0LjE0YyRTaXRlID09ICJIYWluaWNoIiAmIAogICAgICAgICAgICAgICAgICAgICAgICAgICBhcmMucmV3ZXQuMTRjJFR5cGUgPT0gIkYiICYgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyYy5yZXdldC4xNGMkdHJlYXQuYmkgPT0gInRyZWF0bWVudCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgIlllYXJTYW1wbGVkIl0gKyAuNQpvYnMucnNwLnQgPC0gZGF0YS5mcmFtZSh0aW1lID0geXJzLnNtcC50LAogICAgICAgICAgICAgICAgICAgICAgICByZXNwID0gYXJjLnJld2V0LnJzcC50KQojIyMjIwojIG1vZCBmaXQgZnhucwojIyMjIwpjZ2FtIDwtIGZ1bmN0aW9uKHBhcnMsIEluID0gMSwgQyA9IDM4Ljk2MTA0LCBmcmMgPSAuMSkgewogIAogICMgY3N0b2NrCiAgQ2Zhc3QgPC0gZnJjICogQwogIENzbG93IDwtIEMgLSBDZmFzdAoKICAjIGRlZmluZSBwYXJzCiAgZmFzdC5mbSA8LSBmbShwYXJzWzFdKQogIHNsb3cuZm0gPC0gZm0ocGFyc1syXSkKICBGMF9EZWx0YTE0QyA8LSBmbV8xNGMoYyhmYXN0LmZtLCBzbG93LmZtKSwgZGF0ZSA9IGMoMTkwMCwgMTkwMCkpCiAgZ2FtIDwtIChDICogQ2Zhc3QgKiBwYXJzWzFdKS8oQyAqIENmYXN0ICogcGFyc1sxXSArIEMgKiBDc2xvdyAqIHBhcnNbMl0pCiAgCiAgIyBtb2RlbCBtYXRyaXgKICBBIDwtIC1kaWFnKHBhcnNbMToyXSkKICAKICAjIHN0ZWFkeS1zdGF0ZSBDIHN0b2NrcwogIHNzLmNzdG9jayA8LSAoLTEgKiBzb2x2ZShBKSAlKiUgYyhJbiAqIGdhbSwgSW4gKiAoMSAtIGdhbSkpKQogIAogICMgcmV0dXJuCiAgcmV0dXJuKGxpc3QoZ2FtID0gZ2FtLCBzcy5jc3RvY2sgPSBzcy5jc3RvY2spKQp9Cgptb2RGdW5fMnBwIDwtIGZ1bmN0aW9uKHBhcnMsIEluID0gMSwgbGFnID0gMCwgcGFzcyA9IFRSVUUsIG91dCA9ICJtb2RGaXQiLCAKICAgICAgICAgICAgICAgICAgICAgICBnYW0gPSBGQUxTRSwgeXJzID0gRGF0bSREYXRlKSB7CiAgIyBjb25zdGFudHMKICBjc3RvY2sgPC0gMzguOTYxMDQgIyBmb3Jlc3QgQyBwb29sLCB0b3RhbCAobWVhbiBIYWluaWNoIGZvcmVzdCBDICA9IDI0IGcga2deLTEpOyBuYiBAIHNzID0gc3VtKC0xKnNvbHZlKEEpJSolYyhmLmluKmYuZ2FtLCBmLmluKigxLWYuZ2FtKSkpCiAgZi5pbiA8LSBJbiAjIGlucHV0cyAoMTIuNT1tZWFuIGVxdWlsaWJyaXVtIEMgZmx1eCwgYW5udWFsIGV4dHJhcG9sYXRpb24sIGdDIHlyLTEsIDIwMTEgaW5jdWJhdGlvbiBkYXRhKTsgdHJ5IG11Y2ggbGVzcy4uLgogIGYuZnJjIDwtIC4xICMgQy1zdG9jayBwYXJ0aXRpb25pbmcgY29lZmZpY2llbnQgKGZyb20gU2NocnVtcGYgMjAxMywgSGFpbmljaCAwLTUsIGZyZWUgbGlnaHQpCiAgZi5DZmFzdCA8LSBmLmZyYyAqIGNzdG9jawogIGYuQ3Nsb3cgPC0gY3N0b2NrIC0gZi5DZmFzdAogIAogICMgZGVmaW5lIHBhcnMKICBmLmtmYXN0IDwtIHBhcnNbMV0gIyB1bmtub3duCiAgZi5rc2xvdyA8LSBwYXJzWzJdICMgdW5rbm93bgogIGYuZmFzdC5mbSA8LSBmbShmLmtmYXN0KQogIGYuc2xvdy5mbSA8LSBmbShmLmtzbG93KQogIGYuRjBfRGVsdGExNEMgPC0gZm1fMTRjKGMoZi5mYXN0LmZtLCBmLnNsb3cuZm0pLCBkYXRlID0gYygxOTAwLCAxOTAwKSkKICBmLmdhbSA8LSAoY3N0b2NrKmYuQ2Zhc3QqZi5rZmFzdCkvKGNzdG9jaypmLkNmYXN0KmYua2Zhc3QrY3N0b2NrKmYuQ3Nsb3cqZi5rc2xvdykgIyBpbnB1dCBwYXJ0aXRpb25pbmcgY29lZmZpY2llbnQgKHByb3BvcnRpb24gdG8gZmFzdCBwb29sLCBmdW5jdGlvbiBvZiBrcykKICBpZiAoZ2FtKSB7CiAgICBmLmdhbSA8LSBwYXJzWzNdCiAgfQogIAogICMgbW9kZWwgbWF0cml4CiAgQSA8LSAtZGlhZyhwYXJzWzE6Ml0pCiAgCiAgIyBzdGVhZHktc3RhdGUgQyBzdG9ja3MKICBzcy5jc3RvY2sgPC0gKC0xICogc29sdmUoQSkgJSolIGMoSW4gKiBmLmdhbSwgSW4gKiAoMSAtIGYuZ2FtKSkpCiAgCiAgIyB0aW1lIGluZGV4CiAgaXgudCA8LSBjKChsYWcgKyAxKTpsZW5ndGgoeXJzKSkKICAKICAjIG1vZGVsCiAgbW9kIDwtIFR3b3BQYXJhbGxlbE1vZGVsMTQodCA9IHlyc1tpeC50XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrcyA9IGMoZi5rZmFzdCwgZi5rc2xvdyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzAgPSBjKGYuQ2Zhc3QsIGYuQ3Nsb3cpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEYwX0RlbHRhMTRDID0gZi5GMF9EZWx0YTE0QywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbiA9IGYuaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2FtID0gZi5nYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRGYyA9IERhdG0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFnID0gbGFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgPSBwYXNzKQoKICAjIGdldCBtb2QgdmFsdWVzCiAgQzE0bSA8LSBnZXRGMTRDKG1vZCkKICBDMTRwIDwtIGdldEYxNChtb2QpCiAgQzE0ciA8LSBnZXRGMTRSKG1vZCkKICBDdG90IDwtIGdldEMobW9kKQogICAgCiAgaWYob3V0ID09ICJtb2RGaXQiKSB7CiAgICAjIGRhdGFmcmFtZSBmb3IgbW9kRml0IGZ4CiAgICByZXR1cm4oZGF0YS5mcmFtZSgKICAgICAgdGltZSA9IERhdG0kRGF0ZVtpeC50XSwgCiAgICAgIHJlc3AgPSBDMTRyKSkKICB9IGVsc2UgewogICAgIyBkYXRhIGZyYW1lIGZvciBwbG90dGluZwogICAgcmV0dXJuKGRhdGEuZnJhbWUoCiAgICAgIHllYXJzID0gcmVwKERhdG0kRGF0ZVtpeC50XSwgNSksCiAgICAgIGQxNEMgPSBjKEMxNHBbLDFdLCAKICAgICAgICAgICAgICAgQzE0cFssMl0sIAogICAgICAgICAgICAgICBDMTRtLAogICAgICAgICAgICAgICBDMTRyLAogICAgICAgICAgICAgICBEYXRtJE5IYzE0W2l4LnRdKSwKICAgICAgcG9vbCA9IHJlcChjKCJmYXN0IiwgInNsb3ciLCAiYnVsayBDIiwgInJlc3BpcmF0aW9uIiwgImF0bSIpLCBlYWNoID0gbnJvdyhDMTRwKSkpKQogIH0KICB9CgojIFVzZSBtZWRpYW4gdmFsdWVzIGZvciBrcyBhbmQgbGFnIHZhbHVlIGZyb20gU2NocnVtcGYgMjAxNQpzY2hydW1wZi4yMDE1IDwtIG1vZEZ1bl8ycHAocGFyID0gYygxLzQsIDEvMTE1KSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbiA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWcgPSA4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0ID0gInBsb3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2FtID0gRkFMU0UpCiMgY2hhbmdlIGZhY3RvciBsZXZlbHMKc2NocnVtcGYuMjAxNSRwb29sIDwtIGZhY3RvcihzY2hydW1wZi4yMDE1JHBvb2wsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoImF0bSIsICJidWxrIEMiLCAicmVzcGlyYXRpb24iLCAiZmFzdCIsICJzbG93IikpCmNnYW0oYygxLzQsIDEvMTE1KSkKCiMgYWxzbyBmb3IgbWVkaWFucwpwYXIuMjUuMjUgPC0gYygxLCAxLzgwKQpwYXIuMjUuNzUgPC0gYygxLCAxLzIwMCkKcGFyLjc1LjI1IDwtIGMoMS83LCAxLzgwKQpwYXIuNzUuNzUgPC0gYygxLzcsIDEvMjAwKQpMOC4yNS4yNSA8LSBtb2RGdW5fMnBwKHBhciA9IHBhci4yNS4yNSwKICAgICAgICAgICAgICAgICAgICAgICBJbiA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgbGFnID0gOCwKICAgICAgICAgICAgICAgICAgICAgICBvdXQgPSAicGxvdCIsCiAgICAgICAgICAgICAgICAgICAgICAgZ2FtID0gRkFMU0UpCkw4LjI1Ljc1IDwtIG1vZEZ1bl8ycHAocGFyID0gcGFyLjI1Ljc1LAogICAgICAgICAgICAgICAgICAgICAgIEluID0gMSwKICAgICAgICAgICAgICAgICAgICAgICBsYWcgPSA4LAogICAgICAgICAgICAgICAgICAgICAgIG91dCA9ICJwbG90IiwKICAgICAgICAgICAgICAgICAgICAgICBnYW0gPSBGQUxTRSkKTDguNzUuMjUgPC0gbW9kRnVuXzJwcChwYXIgPSBwYXIuNzUuMjUsCiAgICAgICAgICAgICAgICAgICAgICAgSW4gPSAxLAogICAgICAgICAgICAgICAgICAgICAgIGxhZyA9IDgsCiAgICAgICAgICAgICAgICAgICAgICAgb3V0ID0gInBsb3QiLAogICAgICAgICAgICAgICAgICAgICAgIGdhbSA9IEZBTFNFKQpMOC43NS43NSA8LSBtb2RGdW5fMnBwKHBhciA9IHBhci43NS43NSwKICAgICAgICAgICAgICAgICAgICAgICBJbiA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgbGFnID0gOCwKICAgICAgICAgICAgICAgICAgICAgICBvdXQgPSAicGxvdCIsCiAgICAgICAgICAgICAgICAgICAgICAgZ2FtID0gRkFMU0UpCnNjaHJ1bXBmLjIwMTUkcTI1LjI1IDwtIEw4LjI1LjI1JGQxNEMgLSBzY2hydW1wZi4yMDE1JGQxNEMKc2NocnVtcGYuMjAxNSRxMjUuNzUgPC0gTDguMjUuNzUkZDE0QyAtIHNjaHJ1bXBmLjIwMTUkZDE0QwpzY2hydW1wZi4yMDE1JHE3NS4yNSA8LSBMOC43NS4yNSRkMTRDIC0gc2NocnVtcGYuMjAxNSRkMTRDCnNjaHJ1bXBmLjIwMTUkcTc1Ljc1IDwtIEw4Ljc1Ljc1JGQxNEMgLSBzY2hydW1wZi4yMDE1JGQxNEMKCiMgT2JzZXJ2ZWQgcmVzcGlyYXRpb24KIyBjdGwKb2JzLnJzcC5tIDwtIG9icy5yc3AgJT4lCiAgZ3JvdXBfYnkodGltZSkgJT4lCiAgc3VtbWFyaXplKGFjcm9zcyhyZXNwLCAuZm5zID0gYyhtZWFuID0gbWVhbiwgc2QgPSBzZCkpKSAlPiUKICByZW5hbWUoZDE0QyA9IHJlc3BfbWVhbikgJT4lCiAgbXV0YXRlKHllYXJzID0gdGltZSAtIC4yNSwKICAgICAgICAgVHJlYXRtZW50ID0gImNvbnRyb2wiKQpzYXZlKG9icy5yc3AubSwgZmlsZSA9ICIvVXNlcnMvamVmZi9hcmMtaW5jL3NyYy9vYnMucnNwLm0uUkRhdGEiKQojIHRydApvYnMucnNwLnQubSA8LSBvYnMucnNwLnQgJT4lCiAgZ3JvdXBfYnkodGltZSkgJT4lCiAgc3VtbWFyaXplKGFjcm9zcyhyZXNwLCAuZm5zID0gYyhtZWFuID0gbWVhbiwgc2QgPSBzZCkpKSAlPiUKICByZW5hbWUoZDE0QyA9IHJlc3BfbWVhbikgJT4lCiAgbXV0YXRlKHllYXJzID0gdGltZSArIC4yNSwKICAgICAgICAgVHJlYXRtZW50ID0gaWZlbHNlKHRpbWUgPT0gIjIwMTEuNSIsICJhaXItZHJ5L3Jld2V0ICsgc3RvcmFnZSIsICJhaXItZHJ5L3Jld2V0IikpCnNhdmUob2JzLnJzcC50Lm0sIGZpbGUgPSAiL1VzZXJzL2plZmYvYXJjLWluYy9zcmMvb2JzLnJzcC50Lm0uUkRhdGEiKQoKIyBwbG90IG1lZGlhbnMgdy8gcG90ZW50aWFsIGVycm9yIHJhbmdlcwpzY2hydW1wZi4yMDE1ICU+JQogIGZpbHRlcihwb29sICE9ICJidWxrIEMiKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHllYXJzLCBkMTRDKSkgKwogIGdlb21fcGF0aChkYXRhID0gTDguMjUuMjVbd2hpY2goTDguMjUuMjUkcG9vbCAhPSAiYnVsayBDIiksIF0sCiAgICAgICAgICAgIGFlcyh5ZWFycywgZDE0QywgY29sb3IgPSBwb29sKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgbGluZXR5cGUgPSAiZG90dGVkIikgKwogIGdlb21fcGF0aChkYXRhID0gTDguMjUuNzVbd2hpY2goTDguMjUuNzUkcG9vbCAhPSAiYnVsayBDIiksIF0sCiAgICAgICAgICAgIGFlcyh5ZWFycywgZDE0QywgY29sb3IgPSBwb29sKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGdlb21fcGF0aChkYXRhID0gTDguNzUuMjVbd2hpY2goTDguNzUuMjUkcG9vbCAhPSAiYnVsayBDIiksIF0sCiAgICBhZXMoeWVhcnMsIGQxNEMsIGNvbG9yID0gcG9vbCksIHNob3cubGVnZW5kID0gRkFMU0UsIGxpbmV0eXBlID0gImRvdGRhc2giKSArCiAgZ2VvbV9wYXRoKGRhdGEgPSBMOC43NS43NVt3aGljaChMOC43NS43NSRwb29sICE9ICJidWxrIEMiKSwgXSwKICAgIGFlcyh5ZWFycywgZDE0QywgY29sb3IgPSBwb29sKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgbGluZXR5cGUgPSAibG9uZ2Rhc2giKSArCiAgZ2VvbV9wYXRoKGFlcyhjb2xvciA9IHBvb2wpKSArCiAgZ2VvbV9wb2ludChkYXRhID0gb2JzLnJzcC5tLCBhZXMoeWVhcnMsIGQxNEMsIHNoYXBlID0gVHJlYXRtZW50KSwgCiAgICAgICAgICAgICBjb2xvciA9ICIjRkZDMTA3Iiwgc2l6ZSA9IDMpICsKICBnZW9tX3BvaW50KGRhdGEgPSBvYnMucnNwLnQubSwgYWVzKHllYXJzLCBkMTRDLCBzaGFwZSA9IFRyZWF0bWVudCksIAogICAgICAgICAgICAgY29sb3IgPSAiI0ZGQzEwNyIsIHNpemUgPSAzKSArCiAgZ2VvbV9lcnJvcmJhcihkYXRhID0gb2JzLnJzcC5tLCAKICAgICAgICAgICAgICAgIGFlcyh5bWluID0gZDE0QyAtIHJlc3Bfc2QsIHltYXggPSBkMTRDICsgcmVzcF9zZCksCiAgICAgICAgICAgICAgICBjb2xvciA9ICIjRkZDMTA3Iiwgd2lkdGggPSAuMikgKwogIGdlb21fZXJyb3JiYXIoZGF0YSA9IG9icy5yc3AudC5tLCAKICAgICAgICAgICAgICAgIGFlcyh5bWluID0gZDE0QyAtIHJlc3Bfc2QsIHltYXggPSBkMTRDICsgcmVzcF9zZCksCiAgICAgICAgICAgICAgICBjb2xvciA9ICIjRkZDMTA3Iiwgd2lkdGggPSAuMikgKwogIHNjYWxlX2NvbG9yX21hbnVhbCgKICAgIG5hbWUgPSAiTW9kZWwgcG9vbCIsCiAgICB2YWx1ZXMgPSBjKCJhdG0iID0gImJsYWNrIiwKICAgICAgICAgICAgICAgImZhc3QiID0gIiNEODFCNjAiLCAKICAgICAgICAgICAgICAgInJlc3BpcmF0aW9uIiA9ICIjRkZDMTA3IiwgCiAgICAgICAgICAgICAgICJzbG93IiA9ICIjMUU4OEU1IiksCiAgICBsYWJlbHMgPSBjKCJhdG0iID0gImF0bW9zcGhlcmVcbihtZWFzdXJlZCkiLAogICAgICAgICAgICAgICAiZmFzdCIgPSAiZmFzdCIsCiAgICAgICAgICAgICAgICJzbG93IiA9ICJzbG93IikpICsKICBzY2FsZV9maWxsX21hbnVhbCgKICAgIHZhbHVlcyA9IGMoImF0bSIgPSA4LAogICAgICAgICAgICAgICAiZmFzdCIgPSAiI0Q4MUI2MCIsIAogICAgICAgICAgICAgICAicmVzcGlyYXRpb24iID0gIiNGRkMxMDciLCAKICAgICAgICAgICAgICAgInNsb3ciID0gIiMxRTg4RTUiKSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbCgKICAgIHZhbHVlcyA9IGMoImNvbnRyb2wiID0gMTYsCiAgICAgICAgICAgICAgICJhaXItZHJ5L3Jld2V0IiA9IDEsIAogICAgICAgICAgICAgICAiYWlyLWRyeS9yZXdldCArIHN0b3JhZ2UiID0gMCksCiAgICBsYWJlbHMgPSBjKCJjb250cm9sIiA9ICJjb250cm9sLTEgKDIwMTEpXG5jb250cm9sLTIgKDIwMTkpIiwKICAgICAgICAgICAgICAgImFpci1kcnkvcmV3ZXQiID0gImFpci1kcnkvcmV3ZXQiLCAKICAgICAgICAgICAgICAgImFpci1kcnkvcmV3ZXQgKyBzdG9yYWdlIiA9ICJhaXItZHJ5L3Jld2V0ICsgc3RvcmFnZSIpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMjAwMCwgMjAyMikpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtMTAwLCAxODApKSArCiAgeGxhYigiWWVhciIpICsKICB5bGFiKGV4cHJlc3Npb24oJycqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCgojIFNhdmUgdy8gZXJyb3IgYmFycwpzY2hydW1wZi4yMDE1JHltaW4gPC0gaWZlbHNlKHNjaHJ1bXBmLjIwMTUkcG9vbCA9PSAicmVzcGlyYXRpb24iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hydW1wZi4yMDE1JGQxNEMgKyBzY2hydW1wZi4yMDE1JHEyNS43NSwgTkEpCnNjaHJ1bXBmLjIwMTUkeW1heCA8LSBpZmVsc2Uoc2NocnVtcGYuMjAxNSRwb29sID09ICJyZXNwaXJhdGlvbiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaHJ1bXBmLjIwMTUkZDE0QyArIHNjaHJ1bXBmLjIwMTUkcTc1LjI1LCBOQSkKc2F2ZShzY2hydW1wZi4yMDE1LCBmaWxlID0gInNjaHJ1bXBmLjIwMTUubW9kLlJEYXRhIikKYGBgCgpgYGB7ciBmaWc2LXNjaHJ1bXBmMTUtbWVkaWFufQojIHBsb3Qgd2hvbGUgYm9tYiBwZXJpb2QKc2NocnVtcGYuMjAxNSAlPiUKICBmaWx0ZXIocG9vbCAhPSAiYnVsayBDIikgJT4lCiAgZ2dwbG90KC4sIGFlcyh5ZWFycywgZDE0QykpICsKICBnZW9tX3BhdGgoYWVzKGNvbG9yID0gcG9vbCkpICsKICBnZW9tX3BvaW50KGRhdGEgPSBvYnMucnNwLm0sIGFlcyh5ZWFycywgZDE0Qywgc2hhcGUgPSBUcmVhdG1lbnQpLCAKICAgICAgICAgICAgIGNvbG9yID0gIiNGRkMxMDciLCBzaXplID0gMykgKwogIGdlb21fcG9pbnQoZGF0YSA9IG9icy5yc3AudC5tLCBhZXMoeWVhcnMsIGQxNEMsIHNoYXBlID0gVHJlYXRtZW50KSwgCiAgICAgICAgICAgICBjb2xvciA9ICIjRkZDMTA3Iiwgc2l6ZSA9IDMpICsKICBnZW9tX2Vycm9yYmFyKGRhdGEgPSBvYnMucnNwLm0sIAogICAgICAgICAgICAgICAgYWVzKHltaW4gPSBkMTRDIC0gcmVzcF9zZCwgeW1heCA9IGQxNEMgKyByZXNwX3NkKSwKICAgICAgICAgICAgICAgIGNvbG9yID0gIiNGRkMxMDciLCB3aWR0aCA9IC4yKSArCiAgZ2VvbV9lcnJvcmJhcihkYXRhID0gb2JzLnJzcC50Lm0sIAogICAgICAgICAgICAgICAgYWVzKHltaW4gPSBkMTRDIC0gcmVzcF9zZCwgeW1heCA9IGQxNEMgKyByZXNwX3NkKSwKICAgICAgICAgICAgICAgIGNvbG9yID0gIiNGRkMxMDciLCB3aWR0aCA9IC4yKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKAogICAgbmFtZSA9ICJNb2RlbCBwb29sIiwKICAgIHZhbHVlcyA9IGMoImF0bSIgPSAiYmxhY2siLAogICAgICAgICAgICAgICAiZmFzdCIgPSAiI0Q4MUI2MCIsIAogICAgICAgICAgICAgICAicmVzcGlyYXRpb24iID0gIiNGRkMxMDciLCAKICAgICAgICAgICAgICAgInNsb3ciID0gIiMxRTg4RTUiKSwKICAgIGxhYmVscyA9IGMoImF0bSIgPSAiYXRtb3NwaGVyZVxuKG1lYXN1cmVkKSIsCiAgICAgICAgICAgICAgICJmYXN0IiA9ICJmYXN0IiwKICAgICAgICAgICAgICAgInNsb3ciID0gInNsb3ciKSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKAogICAgdmFsdWVzID0gYygiYXRtIiA9IDgsCiAgICAgICAgICAgICAgICJmYXN0IiA9ICIjRDgxQjYwIiwgCiAgICAgICAgICAgICAgICJyZXNwaXJhdGlvbiIgPSAiI0ZGQzEwNyIsIAogICAgICAgICAgICAgICAic2xvdyIgPSAiIzFFODhFNSIpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKAogICAgdmFsdWVzID0gYygiY29udHJvbCIgPSAxNiwKICAgICAgICAgICAgICAgImFpci1kcnkvcmV3ZXQiID0gMSwgCiAgICAgICAgICAgICAgICJhaXItZHJ5L3Jld2V0ICsgc3RvcmFnZSIgPSAwKSwKICAgIGxhYmVscyA9IGMoImNvbnRyb2wiID0gImNvbnRyb2wtMSAoMjAxMSlcbmNvbnRyb2wtMiAoMjAxOSkiLAogICAgICAgICAgICAgICAiYWlyLWRyeS9yZXdldCIgPSAiYWlyLWRyeS9yZXdldCIsIAogICAgICAgICAgICAgICAiYWlyLWRyeS9yZXdldCArIHN0b3JhZ2UiID0gImFpci1kcnkvcmV3ZXQgKyBzdG9yYWdlIikpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygxOTUwLCAyMDIyKSkgKwogIHhsYWIoIlllYXIiKSArCiAgeWxhYihleHByZXNzaW9uKCcnKkRlbHRhKicnXjE0KidDICjigLApJykpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKQpgYGAKPioqRmlnIGByIHsoZmlnLm4gKyA1KX1gYS4gVHJhamVjdG9yaWVzIG9mICRcRGVsdGEkXjE0XkMgb3ZlciB0aW1lIGluIHNvaWwgQyBhbmQgcmVzcGlyZWQgQ09+Mn4gZm9yIGEgMi1wb29sIG1vZGVsIGZpdCB0byB0aGUgSGFpbmljaC1Ew7xuIGZvcmVzdCBzaXRlcyBpbiByZWxhdGlvbiB0byBhdG1vc3BoZXJpYyAkXERlbHRhJF4xNF5DKioKCj4qQ2FwdGlvbjoqIE1vZGVsZWQgY3VydmVzIGRlcml2ZWQgZnJvbSBhIHR3by1wb29sIHBhcmFsbGVsIG1vZGVsIHBhcmFtZXRlcml6ZWQgd2l0aCBkYXRhIGZyb20gU2NocnVtcGYgZXQgYWwuICgyMDE1KTogKCprfmZhc3R+KiA9IDEvNCkgYW5kIGEgbW9yZSBzbG93bHkgY3ljbGluZyBwb29sICgqa35zbG93fiogPSAxLzExNSkuIEdvbGQgcG9pbnRzIHNob3cgb2JzZXJ2ZWQgJFxEZWx0YSReMTReQy1DT34yfiBmcm9tIHRoaXMgc3R1ZHkuIFNvbGlkIHN5bWJvbHMgc2hvdyBjb250cm9sIHNhbXBsZXMsIG9wZW4gc3ltYm9scyBzaG93IHRyZWF0bWVudCBzYW1wbGVzLiBBdG1vc3BoZXJpYyAkXERlbHRhJF4xNF5DIGRhdGEgdXAgdG8gdGhlIHllYXIgMjAxNSBhcmUgZnJvbSBHcmF2ZW4gZXQgYWwuICgyMDE3KSwgd2hpbGUgZGF0YSBwb2ludHMgYmV5b25kIDIwMTUgdXNlIHRoZSBleHRyYXBvbGF0aW9uIG1ldGhvZCBmcm9tIFNpZXJyYSAoMjAxOCkuIEFsbCBhdG1vc3BoZXJpYyByYWRpb2NhcmJvbiBkYXRhIGlzIGZvciB0aGUgbm9ydGhlcm4gaGVtaXNwaGVyZSAoem9uZSAyKS4KCmBgYHtyIGNvbmNlcHR1YWwtbW9kZWwtZmlnMWJ9CiMgcGxvdCB6b29tIHcvIDI1dGgtNzV0aCBxdWFydGlsZSBlcnJvciBvbiByZXNwCnNjaHJ1bXBmLjIwMTUgJT4lCiAgZmlsdGVyKHBvb2wgIT0gImJ1bGsgQyIpICU+JQogIGdncGxvdCguLCBhZXMoeWVhcnMsIGQxNEMpKSArCiAgZ2VvbV9yaWJib24oYWVzKHltaW4gPSB5bWluLCB5bWF4ID0geW1heCwgZmlsbCA9IHBvb2wpLAogICAgICAgICAgICAgIGFscGhhID0gLjEsIHNob3cubGVnZW5kID0gRkFMU0UpICsKICBnZW9tX3BhdGgoYWVzKGNvbG9yID0gcG9vbCkpICsKICBnZW9tX3BvaW50KGRhdGEgPSBvYnMucnNwLm0sIGFlcyh5ZWFycywgZDE0Qywgc2hhcGUgPSBUcmVhdG1lbnQpLCAKICAgICAgICAgICAgIGNvbG9yID0gIiNGRkMxMDciLCBzaXplID0gMykgKwogIGdlb21fcG9pbnQoZGF0YSA9IG9icy5yc3AudC5tLCBhZXMoeWVhcnMsIGQxNEMsIHNoYXBlID0gVHJlYXRtZW50KSwgCiAgICAgICAgICAgICBjb2xvciA9ICIjRkZDMTA3Iiwgc2l6ZSA9IDMpICsKICBnZW9tX2Vycm9yYmFyKGRhdGEgPSBvYnMucnNwLm0sIAogICAgICAgICAgICAgICAgYWVzKHltaW4gPSBkMTRDIC0gcmVzcF9zZCwgeW1heCA9IGQxNEMgKyByZXNwX3NkKSwKICAgICAgICAgICAgICAgIGNvbG9yID0gIiNGRkMxMDciLCB3aWR0aCA9IC4yKSArCiAgZ2VvbV9lcnJvcmJhcihkYXRhID0gb2JzLnJzcC50Lm0sIAogICAgICAgICAgICAgICAgYWVzKHltaW4gPSBkMTRDIC0gcmVzcF9zZCwgeW1heCA9IGQxNEMgKyByZXNwX3NkKSwKICAgICAgICAgICAgICAgIGNvbG9yID0gIiNGRkMxMDciLCB3aWR0aCA9IC4yKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKAogICAgbmFtZSA9ICJNb2RlbCBwb29sIiwKICAgIHZhbHVlcyA9IGMoImF0bSIgPSAiYmxhY2siLAogICAgICAgICAgICAgICAiZmFzdCIgPSAiI0Q4MUI2MCIsIAogICAgICAgICAgICAgICAicmVzcGlyYXRpb24iID0gIiNGRkMxMDciLCAKICAgICAgICAgICAgICAgInNsb3ciID0gIiMxRTg4RTUiKSwKICAgIGxhYmVscyA9IGMoImF0bSIgPSAiYXRtb3NwaGVyZVxuKG1lYXN1cmVkKSIsCiAgICAgICAgICAgICAgICJmYXN0IiA9ICJmYXN0IiwKICAgICAgICAgICAgICAgInNsb3ciID0gInNsb3ciKSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKAogICAgdmFsdWVzID0gYygiYXRtIiA9IDgsCiAgICAgICAgICAgICAgICJmYXN0IiA9ICIjRDgxQjYwIiwgCiAgICAgICAgICAgICAgICJyZXNwaXJhdGlvbiIgPSAiI0ZGQzEwNyIsIAogICAgICAgICAgICAgICAic2xvdyIgPSAiIzFFODhFNSIpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKAogICAgdmFsdWVzID0gYygiY29udHJvbCIgPSAxNiwKICAgICAgICAgICAgICAgImFpci1kcnkvcmV3ZXQiID0gMSwgCiAgICAgICAgICAgICAgICJhaXItZHJ5L3Jld2V0ICsgc3RvcmFnZSIgPSAwKSwKICAgIGxhYmVscyA9IGMoImNvbnRyb2wiID0gImNvbnRyb2wtMSAoMjAxMSlcbmNvbnRyb2wtMiAoMjAxOSkiLAogICAgICAgICAgICAgICAiYWlyLWRyeS9yZXdldCIgPSAiYWlyLWRyeS9yZXdldCIsIAogICAgICAgICAgICAgICAiYWlyLWRyeS9yZXdldCArIHN0b3JhZ2UiID0gImFpci1kcnkvcmV3ZXQgKyBzdG9yYWdlIikpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygyMDAwLCAyMDIyKSkgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKC0yNSwgMTgwKSkgKwogIHhsYWIoIlllYXIiKSArCiAgeWxhYihleHByZXNzaW9uKCcnKkRlbHRhKicnXjE0KidDICjigLApJykpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKQpgYGAKCj4qKkZpZyBgciB7KGZpZy5uICsgNSl9YGIuIFBvdGVudGlhbCBzaGlmdHMgaW4gJFxEZWx0YSReMTReQyBvZiByZXNwaXJlZCBDT34yfiBpbiByZXNwb25zZSB0byB0cmVhdG1lbnQqKgoKPipDYXB0aW9uOiogWm9vbWluZyBpbiBvbiB0aGUgc3R1ZHkgcGVyaW9kLCB3ZSBjYW4gc2VlIHRoYXQgdGhlIHRyZWF0bWVudCBzYW1wbGUgJFxEZWx0YSReMTReQy1DT34yfiBzaGlmdHMgaW4gdGhlIGRpcmVjdGlvbiBvZiB0aGUgc2xvd2x5IGN5Y2xpbmcgc29pbCBDIHBvb2wgKGJsdWUgbGluZSksIGluZGljYXRpbmcgaW5jcmVhc2VkIGNvbnRyaWJ1dGlvbiBmcm9tIHRoaXMgcG9vbCB0byByZXNwaXJhdGlvbiBmb2xsb3dpbmcgYWlyLWRyeWluZyBhbmQgcmV3ZXR0aW5nLiBOb3RlIHRoYXQgdGhlIGluY3JlYXNlZCBjb250cmlidXRpb24gZnJvbSB0aGUgc2xvdyBjeWNsaW5nIHBvb2wgbGVhZHMgdG8gZGVwbGV0aW9uIGluICRcRGVsdGEkXjE0XkMtQ09+Mn4gcmVsYXRpdmUgdG8gdGhlIGNvbnRyb2xzIGluIDIwMTEsIGJ1dCBlbnJpY2htZW50IGluIDIwMTkgZHVlIHRvIHRoZSBjcm9zc2luZyBvZiB0aGUgc2xvdyBhbmQgZmFzdCBjeWNsaW5nIHBvb2wgY3VydmVzIGluIDIwMTYuIFNoYWRlZCByaWJib24gYXJvdW5kIHRoZSByZXNwaXJhdGlvbiBjdXJ2ZSBzaG93cyB0aGUgbW9kZWwgcGFyYW1ldGVyaXplZCB3aXRoIHRoZSA3NXRoIHF1YXJ0aWxlIGVzdGltYXRlcyBmb3IgKmt+ZmFzdH4qICgxLzcpIGFuZCAqa35zbG93fiogKDEvMjAwKS4KCgpgYGB7ciByZXAtdmFyfQojIGNhbGN1bGF0ZSB2YXJpYWJpbGl0eSBiZXR3ZWVuIHJlcHMKIyBjYWxjIGRpZmZlcmVuY2UgYmV0d2VlbiByZXBzIGFuZCBjb21wYXJlIHRvIGRpZiBiZXR3ZWVuIGN0bCBhbmQgdHJlYXQKZTEyLmQxNCA8LSBhbGwuMTRjLmxzW1syXV0KZTEyLmQxNC5pbmMgPC0gZTEyLmQxNFtlMTIuZDE0JFBlcmlvZCA9PSAiaW5jIiwgXQoKIyBzcGxpdCBieSBFeHBlcmltZW50IGFuZCBUeXBlIHRvIGNvbXBhcmUgd2l0aCBjdGwtdHJ0IGRpZnMKZTEyLmQxNC5pbmMubHMgPC0gbGFwcGx5KHNwbGl0KGUxMi5kMTQuaW5jLCBlMTIuZDE0LmluYyRFeHBlcmltZW50KSwgZnVuY3Rpb24oeCkgewogICAgbGFwcGx5KHNwbGl0KHgsIHgkVHlwZSksIGZ1bmN0aW9uKHkpIHsKICAgICAgeSA8LSBsYXBwbHkoc3BsaXQoeSwgeSRUcmVhdG1lbnQpLCBmdW5jdGlvbih6KSB7CiAgICAgICAgeiA8LSBsYXBwbHkoc3BsaXQoeiwgeiRJRCksIGZ1bmN0aW9uKG0pIHsKICAgICAgICAgIGlmKG5yb3cobSkgPiAxKSB7CiAgICAgICAgICAgIG0gPC0gYWJzKG1bMiwgImQxNGMiXSAtIG1bMSwgImQxNGMiXSkKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG0gPC0gTkEKICAgICAgICAgIH0KICAgICAgICB9KQogICAgICAgIG1lYW4gPC0gbWVhbih1bmxpc3QoeikpCiAgICAgICAgc2QgPC0gc2QodW5saXN0KHopKQogICAgICAgIHZhciA8LSB2YXIodW5saXN0KHopKQogICAgICAgIG4gPC0gbGVuZ3RoKHopCiAgICAgICAgei5scyA8LSBsaXN0KG1lYW4gPSBtZWFuLAogICAgICAgICAgICAgICAgICAgICBzZCA9IHNkLAogICAgICAgICAgICAgICAgICAgICB2YXIgPSB2YXIsCiAgICAgICAgICAgICAgICAgICAgIG4gPSBuLAogICAgICAgICAgICAgICAgICAgICBzZSA9IHNkL3NxcnQobikpCiAgICAgICAgfSkKICB9KQp9KQoKIyByZWR1Y2UgbGlzdAp2YXIubmFtZXMgPC0gYygiRXhwZXJpbWVudCIsICJUeXBlIiwgIlRyZWF0bWVudCIsICJkaXNwZXJzaW9uIikKdmFsdWVzIDwtIHVubGlzdChlMTIuZDE0LmluYy5scykKZTEyLmQxNC5zZGlmLm1hdCA8LSBtYXRyaXgobmNvbCA9IGxlbmd0aCh2YXIubmFtZXMpICsgMSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG5yb3cgPSBsZW5ndGgodmFsdWVzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZGltbmFtZXMgPSBsaXN0KE5VTEwsIGModmFyLm5hbWVzLCAidmFsdWUiKSkpCmZvcihpIGluIHNlcV9hbG9uZyh2YXIubmFtZXMpKSB7CiAgZTEyLmQxNC5zZGlmLm1hdFssIGldIDwtIHVubGlzdChsYXBwbHkoc3Ryc3BsaXQobmFtZXModmFsdWVzKSwgIlxcLiIpLCAiW1siLCBpKSkKfQoKZTEyLmQxNC5zZGlmIDwtIGRhdGEuZnJhbWUoZTEyLmQxNC5zZGlmLm1hdCkKZTEyLmQxNC5zZGlmJHZhbHVlIDwtIHZhbHVlcwogCiMgd2lkZW4gYW5kIHJlbW92ZSBOQXMKZTEyLmQxNC5zZGlmIDwtIHBpdm90X3dpZGVyKGUxMi5kMTQuc2RpZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzX2Zyb20gPSAiZGlzcGVyc2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNfZnJvbSA9ICJ2YWx1ZSIpCmUxMi5kMTQuc2RpZiA8LSBlMTIuZDE0LnNkaWZbIWlzLm5hKGUxMi5kMTQuc2RpZiRtZWFuKSwgXQoKIyBtYWtlIGZ1cnRoZXIgcmVkdWNlZCBkZiAoY29sbGFwc2UgdHJlYXRtZW50KQplMTIuZDE0LnNkaWYyIDwtIGRhdGEuZnJhbWUoRXhwZXJpbWVudCA9IHJlcChjKCJhcmMiLCAicmV3ZXQiKSwgZWFjaCA9IDIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSA9IHJlcChjKCJGIiwgIkciKSwgMikpCmUxMi5kMTQuc2RpZjIkbWVhbiA8LSB1bmxpc3QoYyhlMTIuZDE0LnNkaWZbZTEyLmQxNC5zZGlmJEV4cGVyaW1lbnQgPT0gImFyYyIgJmUxMi5kMTQuc2RpZiRUeXBlID09ICJGIiwgIm1lYW4iXSwKICAgICAgICAgICAgICAgICAgICAgICAgZTEyLmQxNC5zZGlmW2UxMi5kMTQuc2RpZiRFeHBlcmltZW50ID09ICJhcmMiICZlMTIuZDE0LnNkaWYkVHlwZSA9PSAiRyIsICJtZWFuIl0sCiAgICAgICAgICAgICAgICAgICAgICAgIG1lYW4odW5saXN0KGUxMi5kMTQuc2RpZltlMTIuZDE0LnNkaWYkRXhwZXJpbWVudCA9PSAicmV3ZXQiICZlMTIuZDE0LnNkaWYkVHlwZSA9PSAiRiIsICJtZWFuIl0pKSwKICAgICAgICAgICAgICAgICAgICAgICAgbWVhbih1bmxpc3QoZTEyLmQxNC5zZGlmW2UxMi5kMTQuc2RpZiRFeHBlcmltZW50ID09ICJyZXdldCIgJmUxMi5kMTQuc2RpZiRUeXBlID09ICJHIiwgIm1lYW4iXSkpKSkKCiMgZnVuY3Rpb24gZm9yIGNhbGN1bGF0aW5nIHN0ZCBlcnIgb2YgZGlmcwpzdGQuZXJyLmRpZiA8LSBmdW5jdGlvbihzZHMsIG5zKSB7c3FydChzZHNbMV1eMi9uc1sxXSArIHNkc1syXV4yL25zWzJdKX0KIyBmdW5jdGlvbiBmb3IgY2FsY3VsYXRpbmcgbWVhbiBzdGQgZGV2CnN0ZC5kZXYubWVhbiA8LSBmdW5jdGlvbih2YXJzKSB7c3FydChtZWFuKHZhcnMpKX0KCmUxMi5kMTQuc2RpZjIkc2UgPC0gdW5saXN0KGMoZTEyLmQxNC5zZGlmW2UxMi5kMTQuc2RpZiRFeHBlcmltZW50ID09ICJhcmMiICZlMTIuZDE0LnNkaWYkVHlwZSA9PSAiRiIsICJzZSJdLAogICAgICAgICAgICAgICAgICAgICAgICBlMTIuZDE0LnNkaWZbZTEyLmQxNC5zZGlmJEV4cGVyaW1lbnQgPT0gImFyYyIgJmUxMi5kMTQuc2RpZiRUeXBlID09ICJHIiwgInNlIl0sCiAgICAgICAgICAgICAgICAgICAgICBzdGQuZXJyLmRpZih1bmxpc3QoZTEyLmQxNC5zZGlmW2UxMi5kMTQuc2RpZiRFeHBlcmltZW50ID09ICJyZXdldCIgJmUxMi5kMTQuc2RpZiRUeXBlID09ICJGIiwgInNkIl0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5saXN0KGUxMi5kMTQuc2RpZltlMTIuZDE0LnNkaWYkRXhwZXJpbWVudCA9PSAicmV3ZXQiICZlMTIuZDE0LnNkaWYkVHlwZSA9PSAiRiIsICJuIl0pKSwKICAgICAgICAgICAgICAgICAgICAgIHN0ZC5lcnIuZGlmKHVubGlzdChlMTIuZDE0LnNkaWZbZTEyLmQxNC5zZGlmJEV4cGVyaW1lbnQgPT0gInJld2V0IiAmZTEyLmQxNC5zZGlmJFR5cGUgPT0gIkciLCAic2QiXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmxpc3QoZTEyLmQxNC5zZGlmW2UxMi5kMTQuc2RpZiRFeHBlcmltZW50ID09ICJyZXdldCIgJmUxMi5kMTQuc2RpZiRUeXBlID09ICJHIiwgIm4iXSkpKSkKCiMgY2FsYyBtZWFuIHZhcmlhbmNlCmUxMi5kMTQuc2RpZjIkdmFyIDwtIHVubGlzdChjKGUxMi5kMTQuc2RpZltlMTIuZDE0LnNkaWYkRXhwZXJpbWVudCA9PSAiYXJjIiAmZTEyLmQxNC5zZGlmJFR5cGUgPT0gIkYiLCAidmFyIl0sCiAgICAgICAgICAgICAgICAgICAgICAgIGUxMi5kMTQuc2RpZltlMTIuZDE0LnNkaWYkRXhwZXJpbWVudCA9PSAiYXJjIiAmZTEyLmQxNC5zZGlmJFR5cGUgPT0gIkciLCAidmFyIl0sCiAgICAgICAgICAgICAgICAgICAgICBtZWFuKHVubGlzdChlMTIuZDE0LnNkaWZbZTEyLmQxNC5zZGlmJEV4cGVyaW1lbnQgPT0gInJld2V0IiAmZTEyLmQxNC5zZGlmJFR5cGUgPT0gIkYiLCAidmFyIl0pKSwKICAgICAgICAgICAgICAgICAgICAgIG1lYW4odW5saXN0KGUxMi5kMTQuc2RpZltlMTIuZDE0LnNkaWYkRXhwZXJpbWVudCA9PSAicmV3ZXQiICZlMTIuZDE0LnNkaWYkVHlwZSA9PSAiRyIsICJ2YXIiXSkpKSkKCiMgIyBtZWFuIHN0ZCBkZXYgZm9yIGZvcmVzdHMKIyBzdGQuZGV2Lm1lYW4oYyhlMTIuZDE0LnNkaWYyW2UxMi5kMTQuc2RpZjIkVHlwZSA9PSAiRiIsICJ2YXIiXSkpCiMgIyBtZWFuIHN0ZCBkZXYgZm9yIGdyYXNzbGFuZHMKIyBzdGQuZGV2Lm1lYW4oYyhlMTIuZDE0LnNkaWYyW2UxMi5kMTQuc2RpZjIkVHlwZSA9PSAiRyIsICJ2YXIiXSkpCgojIGNvbXBhcmUgdG8gY3RsIHRyZWF0IGRpZgplMTIuMTRjLmN0bC50cnQgPC0gYWxsLjE0Yy5jdGwudHJ0ICU+JQogIHNlbGVjdChFeHBlcmltZW50LCBUeXBlLCBjdGwudHJ0LmQxNCkgJT4lCiAgZ3JvdXBfYnkoRXhwZXJpbWVudCwgVHlwZSkgJT4lCiAgYWRkX3RhbGx5KCkgJT4lCiAgc3VtbWFyaXplX2FsbChsaXN0KG1lYW4gPSBtZWFuLCBzZCA9IHNkLCB2YXIgPSB2YXIpLCBuYS5ybSA9IFRSVUUpICU+JQogIG11dGF0ZShjdGwudHJ0LnNlID0gY3RsLnRydC5kMTRfc2Qvbl9tZWFuKQoKIyBjb21iaW5lCnZhci5jZiA8LSBjYmluZC5kYXRhLmZyYW1lKGUxMi4xNGMuY3RsLnRydFsxOjQsIF0sIGUxMi5kMTQuc2RpZjJbICwgYygibWVhbiIsICJzZSIpXSkgJT4lCiAgc2VsZWN0KGMoRXhwZXJpbWVudCwgVHlwZSwgbl9tZWFuLCBjdGwudHJ0LmQxNF9tZWFuLCBjdGwudHJ0LnNlLCBtZWFuLCBzZSkpCiMga25pdHI6OmthYmxlKHZhci5jZlssIGMoIkV4cGVyaW1lbnQiLCAiVHlwZSIsICJjdGwudHJ0LmQxNF9tZWFuIiwgImN0bC50cnQuc2UiLCAibWVhbiIsICJzZSIpXSwKIyAgICAgICAgICAgICAgY29sLm5hbWVzID0gYygiRXhwZXJpbWVudCIsICJUeXBlIiwgIkN0bC1UcnQgbWVhbiBkaWYiLCAiQ3RsLVRydCBTRSIsICJSZXBsaWNhdGUgbWVhbiBkaWYiLCAiUmVwbGljYXRlIFNFIiksCiMgICAgICAgICAgICAgIGNhcHRpb24gPSAiQ29tcGFyaXNvbiBvZiB0cmVhdG1lbnQgZGlmZmVyZW5jZXMgdmVyc3VzIHZhcmlhYmlsaXR5IGFtb25nIHJlcGxpY2F0ZXMiLAojICAgICAgICAgICAgICBhbGlnbiA9ICJjIiwKIyAgICAgICAgICAgICAgZGlnaXRzID0gMSkKYGBgCgpgYGB7ciBkZWx0YS1kZWx0YS1wbG90LCBpbmNsdWRlID0gRkFMU0V9CiMgY2FsY3VsYXRlIGRkMTRjCmRkMTRjLnN1bSA8LSBlMTIuZDE0LmluYwpkZDE0Yy5zdW0kYXRtMTRjIDwtIGlmZWxzZShkZDE0Yy5zdW0kWWVhclNhbXBsZWQgPT0gMjAxMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRtW3doaWNoKERhdG0kRGF0ZSA9PSAyMDExLjUpLCAiTkhjMTQiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRtW3doaWNoKERhdG0kRGF0ZSA9PSAyMDE5LjUpLCAiTkhjMTQiXSkKZGQxNGMuc3VtJGRkMTRjIDwtIGRkMTRjLnN1bSRkMTRjX2NvcnIgLSBkZDE0Yy5zdW0kYXRtMTRjCmRkMTRjLnN1bSA8LSBkZDE0Yy5zdW0gJT4lIAogIHNlbGVjdChFeHBlcmltZW50LCBUcmVhdG1lbnQsIFR5cGUsIGRkMTRjKSAlPiUKICBncm91cF9ieShFeHBlcmltZW50LCBUcmVhdG1lbnQsIFR5cGUpICU+JQogIGFkZF90YWxseSgpICU+JQogIHN1bW1hcml6ZV9hbGwobGlzdChtZWFuID0gbWVhbiwgc2QgPSBzZCksIG5hLnJtID0gVFJVRSkgJT4lCiAgbXV0YXRlKGRkMTRjX3NlID0gZGQxNGNfc2Qvbl9tZWFuKQoKZGQxNGMuc3VtICU+JQogIG11dGF0ZSh0cmVhdC5iaSA9IGlmZWxzZShUcmVhdG1lbnQgIT0gImNvbnRyb2wiLCAidHJlYXRtZW50IiwgImNvbnRyb2wiKSwKICAgICAgICAgZGQxNGNfbWluID0gZGQxNGNfbWVhbiAtIGRkMTRjX3NlKjIsCiAgICAgICAgIGRkMTRjX21heCA9IGRkMTRjX21lYW4gKyBkZDE0Y19zZSoyKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHRyZWF0LmJpLCBkZDE0Y19tZWFuLCBjb2xvciA9IFR5cGUpKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIGdlb21fZXJyb3JiYXIoCiAgICBhZXMoeW1pbiA9IGRkMTRjX21pbiwgCiAgICAgICAgeW1heCA9IGRkMTRjX21heCwgCiAgICAgICAgY29sb3IgPSBUeXBlKSwgCiAgICB3aWR0aCA9IC4xKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAnRWNvc3lzdGVtJywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID1jKCdGJz0nI2EzNTUxMycsJ0cnPScjMTM2MWEzJyksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ0ZvcmVzdCcsJ0dyYXNzbGFuZCcpKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhFeHBlcmltZW50KSkgKyAKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQpgYGAKCgojIENoYW5nZSBpbiBzb2lsIG1vaXN0dXJlIGNvbnRlbnQgd2l0aCBtb2lzdHVyZSBhZGp1c3RtZW50CgpgYGB7ciBkZWx0YS1tb2lzdHVyZS1jYWxjfQojIGNvbXBhcmUgdGhlIGNoYW5nZSBpbiBtb2lzdHVyZSB3aXRoIGNvbnRyb2wgc2FtcGxlcyB2ZXJzdXMgdHJlYXRtZW50IHNhbXBsZXMKd2hjRnJlc2ggPC0gbWVyZ2UoYXJjaGl2ZS5jdGwudHMud2lkZVthcmNoaXZlLmN0bC50cy53aWRlJEV4cGVyaW1lbnQgPT0gImFyYyIsIGMoIklEIiwgIndoY0ZyZXNoIildLAogICAgICAgICAgICAgICAgICBqYXJpbmZvLnJld2V0W2phcmluZm8ucmV3ZXQkVHJlYXRtZW50ID09ICJjb250cm9sIiwgYygiSUQiLCAid2hjRnJlc2giKV0sCiAgICAgICAgICAgICAgICAgIGJ5ID0gIklEIiwKICAgICAgICAgICAgICAgICAgYWxsLnggPSBUUlVFLAogICAgICAgICAgICAgICAgICBzdWZmaXhlcyA9IGMoIl8yMDExIiwgIl8yMDE5IikpCndoY0ZyZXNoJGRlbHRhV0hDXzIwMTEgPC0gLjYtd2hjRnJlc2gkd2hjRnJlc2hfMjAxMQp3aGNGcmVzaCRkZWx0YVdIQ18yMDE5IDwtIC42LXdoY0ZyZXNoJHdoY0ZyZXNoXzIwMTkKd2hjRnJlc2gkVHlwZSA8LSBpZmVsc2UoZ3JlcGwoIkciLCB3aGNGcmVzaCRJRCksICJHIiwgIkYiKQoKIyBzdW1hbXJpemUKd2hjRnJlc2hfc3VtIDwtIHdoY0ZyZXNoICU+JQogIHNlbGVjdChUeXBlLCBkZWx0YVdIQ18yMDExLCBkZWx0YVdIQ18yMDE5LCB3aGNGcmVzaF8yMDExLCB3aGNGcmVzaF8yMDE5KSAlPiUKICBncm91cF9ieShUeXBlKSAlPiUKICBhZGRfdGFsbHkoKSAlPiUKICBzdW1tYXJpemVfYWxsKGxpc3QobWVhbiA9IG1lYW4sIHNkID0gc2QpLCBuYS5ybSA9IFRSVUUpICU+JQogIG11dGF0ZShkZWx0YV9zZV8xMSA9IGRlbHRhV0hDXzIwMTFfc2Qvbl9tZWFuLAogICAgICAgICBkZWx0YV9zZV8xOSA9IGRlbHRhV0hDXzIwMTlfc2Qvbl9tZWFuLAogICAgICAgICBmcmVzaF9zZV8xMSA9IHdoY0ZyZXNoXzIwMTFfc2Qvbl9tZWFuLAogICAgICAgICBmcmVzaF9zZV8xOSA9IHdoY0ZyZXNoXzIwMTlfc2Qvbl9tZWFuKQoKIyBzd2l0Y2ggd2hjRnJlc2ggdG8gbG9uZwp3aGNGcmVzaC4yMDExIDwtIHdoY0ZyZXNoWyAsIGMoIklEIiwgIndoY0ZyZXNoXzIwMTEiLCAiZGVsdGFXSENfMjAxMSIpXQpuYW1lcyh3aGNGcmVzaC4yMDExKSA8LSBjKCJJRCIsICJ3aGNGcmVzaCIsICJkZWx0YVdIQyIpCndoY0ZyZXNoLjIwMTEkRXhwZXJpbWVudCA8LSAiYXJjIgp3aGNGcmVzaC4yMDE5IDwtIHdoY0ZyZXNoWyAsIGMoIklEIiwgIndoY0ZyZXNoXzIwMTkiLCAiZGVsdGFXSENfMjAxOSIpXQpuYW1lcyh3aGNGcmVzaC4yMDE5KSA8LSBjKCJJRCIsICJ3aGNGcmVzaCIsICJkZWx0YVdIQyIpCndoY0ZyZXNoLjIwMTkkRXhwZXJpbWVudCA8LSAicmV3ZXQiCndoY0ZyZXNoLjIwMTkgPC0gd2hjRnJlc2guMjAxOVt3aGljaChjb21wbGV0ZS5jYXNlcyh3aGNGcmVzaC4yMDE5KSksIF0Kd2hjRnJlc2gubG9uZyA8LSByYmluZCh3aGNGcmVzaC4yMDExLCB3aGNGcmVzaC4yMDE5KQoKIyBzdGF0cwp3aGMuY3RsLnRydCA8LSBtZXJnZShhcmMucmV3ZXQuMTRjLmN0bC50cnQsIHdoY0ZyZXNoLmxvbmcsIGJ5ID0gYygiSUQiLCAiRXhwZXJpbWVudCIpKQpzYXZlKHdoYy5jdGwudHJ0LCBmaWxlID0gIndoYy5jdGwudHJ0LlJkYXRhIikKZ2dwbG90KHdoYy5jdGwudHJ0LCBhZXMod2hjRnJlc2gsIGQxNGNfZGlmLCBjb2xvciA9IFR5cGUsIHNoYXBlID0gRXhwZXJpbWVudCkpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gJ0Vjb3N5c3RlbScsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9YygnRic9JyNhMzU1MTMnLCdHJz0nIzEzNjFhMycpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCdGb3Jlc3QnLCdHcmFzc2xhbmQnKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCgojIHN1bW1hcnkobG0oZDE0Y19kaWYgfiB3aGNGcmVzaCAqIFR5cGUsIHdoYy5jdGwudHJ0KSkKCiMgIyBjYWxjdWxhdGUgYXRtIDE0QyBjaGFuZ2UKIyBzbG9wZXMgPC0gZGF0YS5mcmFtZShEYXRtW0RhdG0kRGF0ZSA+IDIwMDAgJiBEYXRtJERhdGUgPCAyMDE2LCBdLAojICAgICAgICAgICAgICAgICAgICAgIHNsb3BlID0gTkEpCiMgZm9yKGkgaW4gc2VxX2Fsb25nKERhdG1bRGF0bSREYXRlID4gMjAwMCAmIERhdG0kRGF0ZSA8IDIwMTYsICJEYXRlIl0pKSB7CiMgICBpZihpICE9IG5yb3coc2xvcGVzKSkgewojICAgICBzbG9wZXMkc2xvcGVbaV0gPC0gKERhdG1bRGF0bSREYXRlID4gMjAwMCwgIk5IYzE0Il1baSsxXS1EYXRtW0RhdG0kRGF0ZSA+IDIwMDAsICJOSGMxNCJdW2ldKS8oRGF0bVtEYXRtJERhdGUgPiAyMDAwLCAiRGF0ZSJdW2krMV0tRGF0bVtEYXRtJERhdGUgPiAyMDAwLCAiRGF0ZSJdW2ldKQojICAgfQojIH0KIyBtZWFuKHNsb3BlcyRzbG9wZSwgbmEucm0gPSBUKQpgYGAKCj4qKlN1cHBsZW1lbnRhbCBGaWcgYHIgeyhzZmlnLm4gKyA0KX1gLiBDaGFuZ2UgaW4gJFxEZWx0YSReMTReQy1DT34yfiAoY29udHJvbCAtIHRyZWF0bWVudCkgcmVsYXRpdmUgdG8gZmllbGQgbW9pc3R1cmUqKgoKPipDYXB0aW9uOiogRGF0YSBhcmUgZnJvbSBFeHBlcmltZW50IDEgKCJhcmMiKSBhbmQgRXhwZXJpbWVudCAyICgicmV3ZXQiKS4gQWxsIHNhbXBsZXMgd2VyZSBtb2lzdHVyZS1hZGp1c3RlZCBwcmlvciB0byBpbmN1YmF0aW9uLCBidXQgY29udHJvbCBzYW1wbGVzIHdlcmUgYWRqdXN0ZWQgZnJvbSBmaWVsZCBtb2lzdHVyZSwgIndoY0ZyZXNoIiAocGVyY2VudCBvZiBXSEMpLCB3aGVyZWFzIHRyZWF0bWVudCBzYW1wbGVzIHdlcmUgbW9pc3R1cmUgYWRqdXN0ZWQgYWZ0ZXIgYWlyLWRyeWluZywgaS5lLiBhdCBhcHByb3hpbWF0ZWx5IDAlIG9mIFdIQy4=