Last Updated: 2020-08-17 13:00:49 UTC

1 Disclaimer

This article is an independent simulation and does not reflect any portuguese governmental position about the subject.

This article is a work in progress.

2 Concepts

3 Model Hypothesis

3.1 Compartments

The population is assumed to be divided in compartments, for example:

  • Susceptible individuals
  • Infected, symptomatic and infectious
  • Recovered, immune from further infection

3.2 Discrete-time

The observations, for simplicity, will be analyzed as a discrete time-series. In this case, we will use days.

3.3 Population

The total number of individuals is modelled using currently available data for birth and death rates.

3.4 Other assumptions

  • The population is considered large, so random effects can be ignored.
  • The population is considered homogeneous at any point in time. That means that the individuals of any compartment are distributed randomly.
  • The disease is transmitted by proximity or contact between an infected and a susceptible individual (individual contact model - ICM).
  • The susceptible individual becomes infected instantaneously.
  • The infected individuals may or may not be infectious until they get symptoms.
  • The infected eventually get recovered and become immune or die.
  • The population pyramid is taking into account for disease severity.

4 Extended Model

A more complex model is proposed by Tim Churches1, adding several compartments and permit a better exploration of the potential effects of various combinations and timings of interventions on COVID-19 spread.

Attention to the description of each compartment:

Compartment Functional definition
S Susceptible individuals
E Exposed and infected, not yet symptomatic but potentially infectious
I Infected, symptomatic and infectious
Q Infectious, but (self-)isolated
H Requiring hospitalisation (would normally be hospitalised if capacity available)
R Recovered, immune from further infection
F Case fatality (death due to COVID-19, not other causes)

4.1 Transition diagram

4.2 Parameters

There are many parameters. We will start with the defaults and adjust accordingly to new evidence.

The full list of parameters is available in the source code.

4.3 Time-variant parameters

Some parameters also accept a vector of values which allows the model to change itself accordingly, for example, to government policies like self-isolation, or social distancing. This feature is compelling for computational models such as this, and one very hard to incorporate into purely mathematical models.

Most of the parameters for which time-variation is useful supports it. If they do not, an error message is raised.

5 Evidence

6 Baseline simulation

6.1 Parameters used

  • Population: 3,574,394 (estimation of 2019 from Census)4
  • Birth rate: 7.7 ‰4
  • Baseline death rate (any cause): 9.86 ‰5
  • Baseline hospital death rate (any cause): 50.5 ‰5
  • Rates of exposition (table below)
  • Report rate (table below)
  • Ages and severity (table below)



Interaction rates between compartments
Date Event E-S* I-S* Q-S*
08 March Suspension of visits to health facilities and prisons 16 10 5.0
10 March Suspension of flights from the most affected areas of Italy 15 10 5.0
11 March WHO declares pandemic 15 10 5.0
13 March Portugal alert status statement 10 7 3.5
15 March Restrictions on access to commercial spaces 7 5 2.5
16 March Suspension of classes 5 3 1.5
18 March Declaration of State of Emergency 5 2 1.0
02 April Extension of the State of Emergency 3 2 1.0
04 May End of the State of Emergency 7 2 1.0
17 May Extension of the alert status 7 2 1.0
* Empirical values.




Age pyramid and disease fatality rate
Ages Population Prevalence Fatality rate*
>=0 8.03% 1.63% 0.00%
>=10 10.34% 3.00% 0.20%
>=20 11.16% 11.59% 0.20%
>=30 12.35% 14.04% 0.20%
>=40 15.51% 16.76% 0.40%
>=50 15.36% 16.95% 1.30%
>=60 12.76% 11.55% 3.60%
>=70 8.68% 8.76% 8.00%
>=80 5.79% 15.72% 14.80%
* Data from China CDC6.




6.2 Distribution of duration in key compartments

6.3 Baseline Prevalence

6.3.1 Overall - Interactive Plot

6.3.2 Comparison with real data - Interactive Plot

6.3.3 Basic reproduction number \(R_{0}\)

Estimated R is 1.22 (±0.01)

7 Running intervention experiments

Work in progress…

7.1 End of State of Emergency

First Scenario (pessimistic):

  • E-S, I-S, Q-S are set back to March, 15

Second Scenario (optimistic):

  • E-S, is set back to March, 15. I-S and Q-S still under control.

8 Acknowledgements

These simulations are heavily based on Tim Churches’ code, available here.

1. Churches T. Tim churches health data science blog: Modelling the effects of public health interventions on covid-19 transmission using r - part 2. Published online 2020. https://timchurches.github.io/blog/posts/2020-03-18-modelling-the-effects-of-public-health-interventions-on-covid-19-transmission-part-2/

3. CMMID. Inferring covid-19 cases from deaths of confirmed cases. https://cmmid.github.io/visualisations/inferring-covid19-cases-from-deaths

4. Instituto nacional de estatística. https://www.ine.pt

5. Transparência sns. https://transparencia.sns.gov.pt

6. Novel Coronavirus Pneumonia Emergency Response Epidemiology Team". "The epidemiological characteristics of an outbreak of 2019 novel coronavirus diseases (covid-19) — china, 2020". "China CDC Weekly". "2":"113". "http://weekly.chinacdc.cn//article/id/e53946e2-c6c4-41e9-9a9b-fea8db1a8f51"

LS0tCnRpdGxlOiAiU0lSIE1vZGVsIGZvciBQb3J0dWdhbCAtIE5vcnRoIFJlZ2lvbiIKYmlibGlvZ3JhcGh5OiByZWZlcmVuY2VzLmJpYgpjc2w6IGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9jaXRhdGlvbi1zdHlsZS1sYW5ndWFnZS9zdHlsZXMvbWFzdGVyL2FtZXJpY2FuLW1lZGljYWwtYXNzb2NpYXRpb24uY3NsCm91dHB1dDogCiAgaHRtbF9ub3RlYm9vazogCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICAgIGZpZ19jYXB0aW9uOiB5ZXMKICAgIG51bWJlcl9zZWN0aW9uczogeWVzCiAgICB0aGVtZTogdW5pdGVkCiAgICB0b2M6IHllcwpjcmVhdGl2ZV9jb21tb25zOiBDQyBCWS1TQQplZGl0b3Jfb3B0aW9uczogCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGlubGluZQotLS0KCjxoZWFkPgo8IS0tIEdsb2JhbCBzaXRlIHRhZyAoZ3RhZy5qcykgLSBHb29nbGUgQW5hbHl0aWNzIC0tPgo8c2NyaXB0IGFzeW5jIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xldGFnbWFuYWdlci5jb20vZ3RhZy9qcz9pZD1VQS0xNjAwMzM5NzEtMiI+PC9zY3JpcHQ+CjxzY3JpcHQ+CiAgd2luZG93LmRhdGFMYXllciA9IHdpbmRvdy5kYXRhTGF5ZXIgfHwgW107CiAgZnVuY3Rpb24gZ3RhZygpe2RhdGFMYXllci5wdXNoKGFyZ3VtZW50cyk7fQogIGd0YWcoJ2pzJywgbmV3IERhdGUoKSk7CgogIGd0YWcoJ2NvbmZpZycsICdVQS0xNjAwMzM5NzEtMicpOwo8L3NjcmlwdD4KPC9oZWFkPiAKCkxhc3QgVXBkYXRlZDogYHIgbHVicmlkYXRlOjpub3coIlVUQyIpYCBVVEMKCiMgRGlzY2xhaW1lcgoKVGhpcyBhcnRpY2xlIGlzIGFuIGluZGVwZW5kZW50IHNpbXVsYXRpb24gYW5kIGRvZXMgbm90IHJlZmxlY3QgYW55IHBvcnR1Z3Vlc2UgZ292ZXJubWVudGFsIHBvc2l0aW9uIGFib3V0IHRoZSBzdWJqZWN0LgoKVGhpcyBhcnRpY2xlIGlzIGEgd29yayBpbiBwcm9ncmVzcy4KCiMgQ29uY2VwdHMKCi0gKipJbmN1YmF0aW9uIFBlcmlvZCoqOiBpcyB0aGUgcGVyaW9kIGJldHdlZW4gaW5mZWN0aW9uIGFuZCB0aGUgdmlzaWJsZSBhcHBlYXJhbmNlIG9mIHN5bXB0b21zLgotICoqTGF0ZW5jeSBwZXJpb2QqKjogaXMgdGhlIHBlcmlvZCBiZXR3ZWVuIGluZmVjdGlvbiBhbmQgdGhlIGFiaWxpdHkgdG8gaW5mZWN0IHNvbWVvbmUuCgojIE1vZGVsIEh5cG90aGVzaXMKCiMjIENvbXBhcnRtZW50cwoKVGhlIHBvcHVsYXRpb24gaXMgYXNzdW1lZCB0byBiZSBkaXZpZGVkIGluIGNvbXBhcnRtZW50cywgZm9yIGV4YW1wbGU6CgotICoqU3VzY2VwdGlibGUqKiBpbmRpdmlkdWFscwotICoqSW5mZWN0ZWQqKiwgc3ltcHRvbWF0aWMgYW5kIGluZmVjdGlvdXMKLSAqKlJlY292ZXJlZCoqLCBpbW11bmUgZnJvbSBmdXJ0aGVyIGluZmVjdGlvbgoKIyMgRGlzY3JldGUtdGltZQoKVGhlIG9ic2VydmF0aW9ucywgZm9yIHNpbXBsaWNpdHksIHdpbGwgYmUgYW5hbHl6ZWQgYXMgYSAqZGlzY3JldGUqIHRpbWUtc2VyaWVzLgpJbiB0aGlzIGNhc2UsIHdlIHdpbGwgdXNlIGBkYXlzYC4KCiMjIFBvcHVsYXRpb24KClRoZSB0b3RhbCBudW1iZXIgb2YgaW5kaXZpZHVhbHMgaXMgbW9kZWxsZWQgdXNpbmcgY3VycmVudGx5IGF2YWlsYWJsZSBkYXRhIGZvciBiaXJ0aCBhbmQgZGVhdGggcmF0ZXMuCgojIyBPdGhlciBhc3N1bXB0aW9ucwoKLSBUaGUgcG9wdWxhdGlvbiBpcyBjb25zaWRlcmVkIGxhcmdlLCBzbyByYW5kb20gZWZmZWN0cyBjYW4gYmUgaWdub3JlZC4KLSBUaGUgcG9wdWxhdGlvbiBpcyBjb25zaWRlcmVkIGhvbW9nZW5lb3VzIGF0IGFueSBwb2ludCBpbiB0aW1lLiBUaGF0IG1lYW5zIHRoYXQgdGhlIGluZGl2aWR1YWxzIG9mIGFueSBjb21wYXJ0bWVudCBhcmUgZGlzdHJpYnV0ZWQgcmFuZG9tbHkuCi0gVGhlIGRpc2Vhc2UgaXMgdHJhbnNtaXR0ZWQgKmJ5IHByb3hpbWl0eSBvciBjb250YWN0KiBiZXR3ZWVuIGFuIGluZmVjdGVkIGFuZCBhIHN1c2NlcHRpYmxlIGluZGl2aWR1YWwgKGluZGl2aWR1YWwgY29udGFjdCBtb2RlbCAtIElDTSkuCi0gVGhlIHN1c2NlcHRpYmxlIGluZGl2aWR1YWwgYmVjb21lcyBpbmZlY3RlZCBpbnN0YW50YW5lb3VzbHkuCi0gVGhlIGluZmVjdGVkIGluZGl2aWR1YWxzIG1heSBvciBtYXkgbm90IGJlIGluZmVjdGlvdXMgdW50aWwgdGhleSBnZXQgc3ltcHRvbXMuCi0gVGhlIGluZmVjdGVkIGV2ZW50dWFsbHkgZ2V0IHJlY292ZXJlZCBhbmQgKmJlY29tZSBpbW11bmUqIG9yIGRpZS4KLSBUaGUgKnBvcHVsYXRpb24gcHlyYW1pZCogaXMgdGFraW5nIGludG8gYWNjb3VudCBmb3IgZGlzZWFzZSBzZXZlcml0eS4KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQp2ZXJzaW9uX2RhdGUgPC0gbHVicmlkYXRlOjp5bWQoIjIwMjAtMDUtMDIiKQoKa25pdHI6Om9wdHNfY2h1bmskc2V0KAogIHdhcm5pbmdzID0gVFJVRSwKICBlY2hvID0gRkFMU0UsCiAgY2FjaGUgPSBGQUxTRSwKICBwcm9tcHQgPSBGQUxTRSwKICB0aWR5ID0gVFJVRSwKICB0aWR5Lm9wdHMgPSBsaXN0KHdpZHRoLmN1dG9mZiA9IDYwKQopCiMgSW5zdGFsbCBwYWNrYWdlIGlmIG5lZWRlZAppZiAoIXJlcXVpcmVOYW1lc3BhY2UoIkVwaU1vZGVsIiwgcXVpZXRseSA9IFRSVUUpKSB7CiAgZGV2dG9vbHM6Omluc3RhbGxfZ2l0aHViKCJzdGF0bmV0L0VwaU1vZGVsIiwgcXVpZXQgPSBUUlVFKQp9CmlmICghcmVxdWlyZU5hbWVzcGFjZSgiZ2dyaWRnZXMiLCBxdWlldGx5ID0gVFJVRSkpIHsKICBpbnN0YWxsLnBhY2thZ2VzKCJnZ3JpZGdlcyIsIHF1aWV0ID0gVFJVRSkKfQppZiAoIXJlcXVpcmVOYW1lc3BhY2UoImluY2lkZW5jZSIsIHF1aWV0bHkgPSBUUlVFKSkgewogIGluc3RhbGwucGFja2FnZXMoImluY2lkZW5jZSIsIHF1aWV0ID0gVFJVRSkKfQppZiAoIXJlcXVpcmVOYW1lc3BhY2UoInNvZGl1bSIsIHF1aWV0bHkgPSBUUlVFKSkgewogIHN5c3RlbSgiYXB0IGluc3RhbGwgbGlic29kaXVtLWRldiIpCiAgaW5zdGFsbC5wYWNrYWdlcygic29kaXVtIiwgcXVpZXQgPSBUUlVFKQp9CmlmICghcmVxdWlyZU5hbWVzcGFjZSgiZXBpdHJpeCIsIHF1aWV0bHkgPSBUUlVFKSkgewogIGluc3RhbGwucGFja2FnZXMoImVwaXRyaXgiLCBxdWlldCA9IFRSVUUpCn0KaWYgKCFyZXF1aXJlTmFtZXNwYWNlKCJlYXJseVIiLCBxdWlldGx5ID0gVFJVRSkpIHsKICBpbnN0YWxsLnBhY2thZ2VzKCJlYXJseVIiLCBxdWlldCA9IFRSVUUpCn0KaWYgKCFyZXF1aXJlTmFtZXNwYWNlKCJqc29ubGl0ZSIsIHF1aWV0bHkgPSBUUlVFKSkgewogIGluc3RhbGwucGFja2FnZXMoImpzb25saXRlIiwgcXVpZXQgPSBUUlVFKQp9CmlmICghcmVxdWlyZU5hbWVzcGFjZSgiRGlhZ3JhbW1lUiIsIHF1aWV0bHkgPSBUUlVFKSkgewogIGluc3RhbGwucGFja2FnZXMoIkRpYWdyYW1tZVIiLCBxdWlldCA9IFRSVUUpCn0KaWYgKCFyZXF1aXJlTmFtZXNwYWNlKCJndCIsIHF1aWV0bHkgPSBUUlVFKSkgewogIGRldnRvb2xzOjppbnN0YWxsX2dpdGh1YigicnN0dWRpby9ndCIsIHF1aWV0ID0gVFJVRSkKfQppZiAoIXJlcXVpcmVOYW1lc3BhY2UoInBsb3RseSIsIHF1aWV0bHkgPSBUUlVFKSkgewogIGluc3RhbGwucGFja2FnZXMoInBsb3RseSIsIHF1aWV0ID0gVFJVRSkKfQoKIyBMb2FkIEVwaU1vZGVsCnN1cHByZXNzTWVzc2FnZXMobGlicmFyeShFcGlNb2RlbCkpCnN1cHByZXNzTWVzc2FnZXMobGlicmFyeShFcGlFc3RpbSkpCnN1cHByZXNzTWVzc2FnZXMobGlicmFyeSh0aWR5dmVyc2UpKQpzdXBwcmVzc01lc3NhZ2VzKGxpYnJhcnkoZ2dyaWRnZXMpKQpzdXBwcmVzc01lc3NhZ2VzKGxpYnJhcnkoaW5jaWRlbmNlKSkKc3VwcHJlc3NNZXNzYWdlcyhsaWJyYXJ5KGVhcmx5UikpCnN1cHByZXNzTWVzc2FnZXMobGlicmFyeShqc29ubGl0ZSkpCnN1cHByZXNzTWVzc2FnZXMobGlicmFyeShEaWFncmFtbWVSKSkKc3VwcHJlc3NNZXNzYWdlcyhsaWJyYXJ5KGd0KSkKc3VwcHJlc3NNZXNzYWdlcyhsaWJyYXJ5KGZvcmVhY2gpKQpzdXBwcmVzc01lc3NhZ2VzKGxpYnJhcnkocGFyYWxsZWwpKQpzdXBwcmVzc01lc3NhZ2VzKGxpYnJhcnkocGxvdGx5KSkKc3VwcHJlc3NNZXNzYWdlcyhsaWJyYXJ5KGx1YnJpZGF0ZSkpCgppZiAocmVxdWlyZU5hbWVzcGFjZSgiY29uZmxpY3RlZCIsIHF1aWV0bHkgPSBUUlVFKSkgewogIGNvbmZsaWN0ZWQ6OmNvbmZsaWN0X3ByZWZlcigibGFnIiwgImRwbHlyIikKICBjb25mbGljdGVkOjpjb25mbGljdF9wcmVmZXIoImZpbHRlciIsICJkcGx5ciIpCiAgY29uZmxpY3RlZDo6Y29uZmxpY3RfcHJlZmVyKCJsYXlvdXQiLCAicGxvdGx5IikKfQoKIyBFeHRlbnNpb24gdG8gRXBpTW9kZWwgcGF0Y2gsIGJ5IFRpbSBDaHVyY2hlcywgd2l0aCBsaXR0bGUgY2hhbmdlcwpzb3VyY2VfZmlsZXMgPC0gYygKICAiX2ljbS5tb2QuaW5pdC5zZWlxaHJmLlIiLAogICJfaWNtLm1vZC5zdGF0dXMuc2VpcWhyZi5SIiwKICAiX2ljbS5tb2Qudml0YWwuc2VpcWhyZi5SIiwKICAiX2ljbS5jb250cm9sLnNlaXFocmYuUiIsCiAgIl9pY20udXRpbHMuc2VpcWhyZi5SIiwKICAiX2ljbS5zYXZlb3V0LnNlaXFocmYuUiIsCiAgIl9pY20uaWNtLnNlaXFocmYuUiIKKQoKZm9yIChzb3VyY2VfZmlsZSBpbiBzb3VyY2VfZmlsZXMpIHsKICBzb3VyY2UocGFzdGUwKCIuL2V4dC8iLCBzb3VyY2VfZmlsZSkpCn0KCnNvdXJjZSgiLi4vUi9wbG90X3Npci5SIiwgZW5jb2RpbmcgPSAiVVRGLTgiKQoKbSA8LSAzCmBgYAoKYGBge3IgZmV0Y2ggZGF0YSwgZWNobz1GQUxTRX0KCiMgR2V0IGRhdGEgZnJvbSBER1MgaWYgdGhlIGNhY2hlIGZpbGUgaXMgZnJvbSB5ZXN0ZXJkYXkKaWYgKCFmaWxlLmV4aXN0cygiLi4vZGF0YS9kZ3MucmRhIikgfCBmaWxlLmluZm8oIi4uL2RhdGEvZGdzLnJkYSIpJG10aW1lIDwgbHVicmlkYXRlOjp0b2RheSgpKSB7CiAgZGdzX2Nhc2VzX3VybCA8LSAiaHR0cHM6Ly9zZXJ2aWNlcy5hcmNnaXMuY29tL0NDWmlHU0VRYkF4eEZWaDMvYXJjZ2lzL3Jlc3Qvc2VydmljZXMvQ09WSUQxOVBvcnR1Z2FsX3ZpZXcvRmVhdHVyZVNlcnZlci8wL3F1ZXJ5P2Y9anNvbiZ3aGVyZT0xPTEmcmV0dXJuR2VvbWV0cnk9ZmFsc2Umc3BhdGlhbFJlbD1lc3JpU3BhdGlhbFJlbEludGVyc2VjdHMmb3V0RmllbGRzPSomb3JkZXJCeUZpZWxkcz1kYXRhcmVsYXRvcmlvIGFzYyZyZXN1bHRPZmZzZXQ9MCZyZXN1bHRSZWNvcmRDb3VudD0xMDAwIgogIGRnc19leHRyYV91cmwgPC0gImh0dHBzOi8vc2VydmljZXMuYXJjZ2lzLmNvbS9DQ1ppR1NFUWJBeHhGVmgzL2FyY2dpcy9yZXN0L3NlcnZpY2VzL0FuJUMzJUExbGlzZXNfRXh0cmFfQ292aWQvRmVhdHVyZVNlcnZlci8wL3F1ZXJ5P2Y9anNvbiZ3aGVyZT0xJTNEMSZyZXR1cm5HZW9tZXRyeT1mYWxzZSZzcGF0aWFsUmVsPWVzcmlTcGF0aWFsUmVsSW50ZXJzZWN0cyZvdXRGaWVsZHM9KiZvcmRlckJ5RmllbGRzPURhdGFfZG9fUmVsYXQlQzMlQjNyaW8lMjBhc2MmcmVzdWx0T2Zmc2V0PTAmcmVzdWx0UmVjb3JkQ291bnQ9MjAwMCZjYWNoZUhpbnQ9dHJ1ZSIKICBkZ3NfZ2VvX3VybCA8LSAiaHR0cHM6Ly9zZXJ2aWNlcy5hcmNnaXMuY29tL0NDWmlHU0VRYkF4eEZWaDMvYXJjZ2lzL3Jlc3Qvc2VydmljZXMvQ09WSUQxOVBvcnR1Z2FsX3ZpZXcvRmVhdHVyZVNlcnZlci8xL3F1ZXJ5P2Y9anNvbiZ3aGVyZT0xPTEmcmV0dXJuR2VvbWV0cnk9ZmFsc2Umc3BhdGlhbFJlbD1lc3JpU3BhdGlhbFJlbEludGVyc2VjdHMmb3V0RmllbGRzPSomb3JkZXJCeUZpZWxkcz1kaXN0X2Nhc29zY29uZiBkZXNjJnJlc3VsdE9mZnNldD0wJnJlc3VsdFJlY29yZENvdW50PTEwMDAiCgogIGRnc19jYXNlcyA8LSBmcm9tSlNPTihVUkxlbmNvZGUoZGdzX2Nhc2VzX3VybCkpCiAgZGdzX2V4dHJhIDwtIGZyb21KU09OKFVSTGVuY29kZShkZ3NfZXh0cmFfdXJsKSkKICBkZ3NfZ2VvIDwtIGZyb21KU09OKFVSTGVuY29kZShkZ3NfZ2VvX3VybCkpCgogICMgc2F2ZSBjYWNoZSBmaWxlCiAgc2F2ZShkZ3NfY2FzZXMsIGRnc19leHRyYSwgZGdzX2dlbywgZmlsZSA9ICIuLi9kYXRhL2Rncy5yZGEiKQp9IGVsc2UgewogICMgbG9hZCBjYWNoZSBmaWxlCiAgbG9hZCgiLi4vZGF0YS9kZ3MucmRhIikKfQpgYGAKCmBgYHtyIHRpZHkgZGF0YSwgZWNobz1GQUxTRX0KCiMgZGF0YXNldCB3aXRoIGluZm9ybWF0aW9uIGJ5IGdlb2dyYXBoaWMgbG9jYXRpb24gLS0tLQpnZW9fZGF0YXNldCA8LSBkZ3NfZ2VvW1siZmVhdHVyZXMiXV1bWyJhdHRyaWJ1dGVzIl1dCmdlb19jb2xuYW1lcyA8LSBjKAogICJpZF9vYmpldG8iLCAiaWRfZ2xvYmFsIiwgImRhdGFfcmVsYXRvcmlvIiwgImRpc3RyaXRvIiwKICAiY2Fzb3NfY29uZmlybWFkb3MiLCAibl9vYml0b3MiLCAicmVjdXBlcmFkb3MiLCAiaWRfZ2xvYmFsX3BhaSIsCiAgImNyZWF0aW9uX2RhdGUiLCAiY3JlYXRvciIsICJlZGl0X2RhdGUiLCAiZWRpdG9yIiwgInVudGltb19yZWdpc3RvIgopCm5hbWVzKGdlb19kYXRhc2V0KSA8LSBnZW9fY29sbmFtZXMKCmdlb19kYXRhc2V0JGRhdGFfcmVsYXRvcmlvIDwtIGFzLkRhdGUoYXMuUE9TSVhjdChnZW9fZGF0YXNldCRkYXRhX3JlbGF0b3JpbyAvIDEwMDAsIG9yaWdpbiA9ICIxOTcwLTAxLTAxIikpCmdlb19kYXRhc2V0JGNyZWF0aW9uX2RhdGUgPC0gYXMuRGF0ZShhcy5QT1NJWGN0KGdlb19kYXRhc2V0JGNyZWF0aW9uX2RhdGUgLyAxMDAwLCBvcmlnaW4gPSAiMTk3MC0wMS0wMSIpKQpnZW9fZGF0YXNldCRlZGl0X2RhdGUgPC0gYXMuRGF0ZShhcy5QT1NJWGN0KGdlb19kYXRhc2V0JGVkaXRfZGF0ZSAvIDEwMDAsIG9yaWdpbiA9ICIxOTcwLTAxLTAxIikpCgojIGZpbHRlciBkYXRhIGZvciBvbmx5IG5vcnRoIG9mIFBvcnR1Z2FsIC0tLS0KZ2VvX25vcnRlIDwtIGdlb19kYXRhc2V0ICU+JQogIGZpbHRlcihkaXN0cml0byA9PSAiKzA0MS40NTc1Nl8tMDA3LjY3ODY1IikgJT4lCiAgZGlzdGluY3RfYXQodmFycyhkYXRhX3JlbGF0b3JpbyksIC5rZWVwX2FsbCA9IFRSVUUpICU+JQogIGFycmFuZ2UoZGF0YV9yZWxhdG9yaW8pICU+JQogIG11dGF0ZShpZF9vYmpldG8gPSBzZXEoMTMsIG4oKSArIDEzIC0gMSkpCgojIGVzdGltYXRlZCByZXBvcnQgcmF0ZSwgdXNpbmcgdGhlIGFsZ29yaXRobSBmcm9tIGh0dHBzOi8vY21taWQuZ2l0aHViLmlvL3Zpc3VhbGlzYXRpb25zL2luZmVycmluZy1jb3ZpZDE5LWNhc2VzLWZyb20tZGVhdGhzCgpyZXBvcnRfcmF0ZV9saXN0IDwtIGxpc3QoKQoKcmVwb3J0X3JhdGVfbGlzdFtbIjA0MDkiXV0gPC0gYyhyZXAoMC4yNSwgMjApLCByZXAoMC4yNSwgc3RlcHMgLSAyMCkpCgpyZXBvcnRfcmF0ZV9saXN0W1siMDQxOSJdXSA8LSBjKHJlcCgwLjE1LCAyOCksIDAuMTcsIDAuMTksIDAuMjIsIDAuMjYsIDAuMjgsIDAuMjgsIDAuMzAsIDAuMzEsCiAgMC4zMiwgMC4zMywgMC4zNCwgMC4zMywgMC4zMywgMC4zMiwgMC4zMywgMC4zNCwgMC4zNikKCnJlcG9ydF9yYXRlX2xpc3RbWyIwNTA1Il1dIDwtIGMoMC4yNDc3MDY0LCAwLjE4MDYwMiwgMC4xNjYyODE4LCAwLjE0NzQwMzcsIDAuMTI1Mjk1NSwgMC4xMzAzOTgsIDAuMTIzNTAxMiwgMC4xMTY0NTU3LCAwLjExNjk4LCAwLjEyMzY2MjgsIDAuMTE3NjI4OSwgMC4xMTE3MjQ0LCAwLjEwMTg3NDYsIDAuMTA0MTIwNywgMC4xMDAwOTk0LCAwLjA5NTg2MDIsIDAuMTE1MjM4NSwgMC4xMjU4OTc4LCAwLjE1MjAxMjksIDAuMTc0MDkwMSwgMC4xODc5MTUyLCAwLjE4NjE1MDIsIDAuMjAyNDAwNCwgMC4yMDc3MDMyLCAwLjIxMDk2NzMsIDAuMjE4OTQzNywgMC4yMTk0NjkyLCAwLjIxNTIyMDMsIDAuMjA5MTA1MSwgMC4yMDg0NDc5LCAwLjIwNzE0NjEsIDAuMjE2MjIzNCwgMC4yMjYwOTYyLCAwLjIyNTcyMjcsIDAuMjI4OTE1NywgMC4yMjU4NDE1LCAwLjIyNDc3MjUsIDAuMjI2NTg5NywgMC4yMjk1NDQ0LCAwLjIyMzk3NTksIDAuMjI1NTkxNSwgMC4yMjY0MTE2LCAwLjIyNzQ1NDksIDAuMjI2MTQ0NSwgMC4yMjU5MDQzLCAwLjIyNDUxNTEsIDAuMjI0MDU0OCwgMC4yMjQ0NDk5LCAwLjIyNDUxODEsIDAuMjIxMjYwNiwgMC4yMTk3MTE2LCAwLjIxNTQ4MjgsIDAuMjE2NTI3MiwgMC4yMTQ0MjQ1KQoKcmVwb3J0X3JhdGUgPC0gcmVwb3J0X3JhdGVfbGlzdFtbbV1dCgpyZXBvcnRfcmF0ZSA8LSBjKHJlcG9ydF9yYXRlLCByZXAodGFpbChyZXBvcnRfcmF0ZSwgMSksIHRhaWwoZ2VvX25vcnRlJGlkX29iamV0bywgMSkgLSBsZW5ndGgocmVwb3J0X3JhdGUpKSkKCmdlb19ub3J0ZSA8LSBjYmluZChnZW9fbm9ydGUsIHJlcG9ydF9yYXRlID0gaGVhZChyZXBvcnRfcmF0ZSwgbnJvdyhnZW9fbm9ydGUpKSkKCiMgd2hvbGUgUG9ydHVnYWwgZGF0YXNldCAtLS0tCgpjYXNlc19kYXRhc2V0IDwtIGRnc19jYXNlc1tbImZlYXR1cmVzIl1dW1siYXR0cmlidXRlcyJdXQpjb2xuYW1lcyA8LSBjKAogICJpZF9vYmpldG8iLCAiaWRfZ2xvYmFsIiwgImRhdGFfcmVsYXRvcmlvIiwgImNhc29zX2NvbmZpcm1hZG9zIiwKICAibl9vYml0b3MiLCAicmVjdXBlcmFkb3MiLCAiY2Fzb3Nfc3VzcGVpdG9zIiwgImNhc29zX21hc2N1bGlub3MiLAogICJjYXNvc19mZW1pbmlub3MiLCAiZ3JfZXRhcmlvXzBfOSIsICJncl9ldGFyaW9fMTBfMTkiLCAiZ3JfZXRhcmlvXzIwXzI5IiwKICAiZ3JfZXRhcmlvXzMwXzM5IiwgImdyX2V0YXJpb180MF80OSIsICJncl9ldGFyaW9fNTBfNTkiLCAiZ3JfZXRhcmlvXzYwXzY5IiwKICAiZ3JfZXRhcmlvXzcwXzc5IiwgImdyX2V0YXJpb184MF84OSIsICJncl9ldGFyaW9fOTBfOTkiLCAiY2Fzb3NfaW1wb3J0YWRvcyIsCiAgImNhc29zX2NvbnRhY3RvIiwgInNpbnRvbWFfZmVicmUiLCAic2ludG9tYV90b3NzZSIsICJzaW50b21hX2RvcmVzIiwKICAic2ludG9tYV9jZWZhbGVpYSIsICJzaW50b21hX2ZyYXF1ZXphIiwgImNyZWF0aW9uX2RhdGUiLCAiY3JlYXRvciIsICJlZGl0X2RhdGUiLAogICJlZGl0b3IiLCAiY2Fzb3Nfbm92b3MiLCAic2ludG9tYV9kaWZyZXNwaXJhdG9yaWEiLCAidWx0aW1vX3JlZ2lzdG8iLAogICJlc3RyYW5nZWlybyIsICJjYXNvc19hdGl2b3MiLCAiYWd1YXJkYV9yZXN1bHRhZG8iLCAiY29udGF0b3NfdmlnaWxhbmNpYSIsCiAgImNhZGVpYXNfdHJhbnNtaXNzYW8iLCAiY2Fzb3NfaW50ZXJuYWRvcyIsICJjYXNvc19pbnRlcm5hZG9zX3VjaSIKKQpuYW1lcyhjYXNlc19kYXRhc2V0KSA8LSBjb2xuYW1lcwpjYXNlc19kYXRhc2V0JGRhdGFfcmVsYXRvcmlvIDwtIGFzLkRhdGUoYXMuUE9TSVhjdChjYXNlc19kYXRhc2V0JGRhdGFfcmVsYXRvcmlvIC8gMTAwMCwgb3JpZ2luID0gIjE5NzAtMDEtMDEiKSkKY2FzZXNfZGF0YXNldCRlZGl0X2RhdGUgPC0gYXMuUE9TSVhjdChjYXNlc19kYXRhc2V0JGVkaXRfZGF0ZSAvIDEwMDAsIG9yaWdpbiA9ICIxOTcwLTAxLTAxIikKY2FzZXNfZGF0YXNldCRjcmVhdGlvbl9kYXRlIDwtIGFzLlBPU0lYY3QoY2FzZXNfZGF0YXNldCRjcmVhdGlvbl9kYXRlIC8gMTAwMCwgb3JpZ2luID0gIjE5NzAtMDEtMDEiKQoKIyByZW1vdmUgcm93cyB0aGF0IGhhdmUgYWxsIE5BIGluIGEgc2VsZWN0aW9uIG9mIGNvbHVtbnMKY2FzZXNfZGF0YXNldCA8LSBjYXNlc19kYXRhc2V0ICU+JSBmaWx0ZXJfYXQodmFycyhjYXNvc19jb25maXJtYWRvczpzaW50b21hX2ZyYXF1ZXphKSwgYW55X3ZhcnMoIWlzLm5hKC4pKSkKCmNhc2VzX2RhdGFzZXQgPC0gY2FzZXNfZGF0YXNldCAlPiUKICBzZWxlY3QoCiAgICBpZF9vYmpldG8sIGRhdGFfcmVsYXRvcmlvLCBjYXNvc19jb25maXJtYWRvcywgY2Fzb3Nfbm92b3MsCiAgICBjYXNvc19zdXNwZWl0b3MsIHJlY3VwZXJhZG9zLCBuX29iaXRvcywgY2Fzb3NfbWFzY3VsaW5vcywgY2Fzb3NfZmVtaW5pbm9zLAogICAgY2Fzb3NfaW1wb3J0YWRvcywgY2Fzb3NfY29udGFjdG8sIGVzdHJhbmdlaXJvLCBjYXNvc19hdGl2b3MsIGFndWFyZGFfcmVzdWx0YWRvLAogICAgZ3JfZXRhcmlvXzBfOSwgZ3JfZXRhcmlvXzEwXzE5LCBncl9ldGFyaW9fMjBfMjksIGdyX2V0YXJpb18zMF8zOSwKICAgIGdyX2V0YXJpb180MF80OSwgZ3JfZXRhcmlvXzUwXzU5LCBncl9ldGFyaW9fNjBfNjksIGdyX2V0YXJpb183MF83OSwKICAgIGdyX2V0YXJpb184MF84OSwgZ3JfZXRhcmlvXzkwXzk5LCBjb250YXRvc192aWdpbGFuY2lhLAogICAgY2Fzb3NfaW50ZXJuYWRvcywgY2Fzb3NfaW50ZXJuYWRvc191Y2ksIHNpbnRvbWFfZmVicmUsIHNpbnRvbWFfdG9zc2UsCiAgICBzaW50b21hX2RvcmVzLCBzaW50b21hX2NlZmFsZWlhLCBzaW50b21hX2ZyYXF1ZXphLCBzaW50b21hX2RpZnJlc3BpcmF0b3JpYQogICkgJT4lCiAgYXJyYW5nZShkYXRhX3JlbGF0b3JpbykgJT4lCiAgZGlzdGluY3RfYXQodmFycyhkYXRhX3JlbGF0b3JpbzpzaW50b21hX2RpZnJlc3BpcmF0b3JpYSksIC5rZWVwX2FsbCA9IFRSVUUpICU+JQogIG11dGF0ZShpZF9vYmpldG8gPSAxOm4oKSkKCiMgTmV3IGV4dHJhIGluZm9ybWF0aW9uIGZyb20gd2hvbGUgUG9ydHVnYWwgLS0tLQoKIyBleHRyYV9kYXRhc2V0IDwtIGRnc19leHRyYVtbImZlYXR1cmVzIl1dW1siYXR0cmlidXRlcyJdXQojIGNvbG5hbWVzIDwtIGMoCiMgICAiZGF0YV9yZWxhdG9yaW8iLCAiY2Fzb3NfY29uZmlybWFkb3MiLCAiY2Fzb3NfY29uZmlybWFkb3NfZXZvIiwKIyAgICJyZWN1cGVyYWRvcyIsICJyZWN1cGVyYWRvc19ldm8iLCAibl9vYml0b3MiLCAibl9vYml0b3NfZXZvIiwKIyAgICJjYXNvc19zdXNwZWl0b3MiLCAiY2Fzb3Nfc3VzcGVpdG9zX2V2byIsICJjYXNvc19uYW9fY29uZmlybWFkb3MiLAojICAgIyAiZ3JfZXRhcmlvXzBfOSIsICJncl9ldGFyaW9fMTBfMTkiLCAiZ3JfZXRhcmlvXzIwXzI5IiwgImdyX2V0YXJpb18zMF8zOSIsCiMgICAjICJncl9ldGFyaW9fNDBfNDkiLCAiZ3JfZXRhcmlvXzUwXzU5IiwgImdyX2V0YXJpb182MF82OSIsICJncl9ldGFyaW9fNzBfNzkiLAojICAgIyAiZ3JfZXRhcmlvXzgwXyIsCiMgICAiYWd1YXJkYV9yZXN1bHRhZG8iLCAiYW1vc3RyYXMiLCAiYW1vc3RyYXNfbm92YXMiLAojICAgImNhc29zX25vdm9zIiwgImZpZCIKIyApCiMgbmFtZXMoZXh0cmFfZGF0YXNldCkgPC0gY29sbmFtZXMKIyBleHRyYV9kYXRhc2V0JGRhdGFfcmVsYXRvcmlvIDwtIGFzLkRhdGUoYXMuUE9TSVhjdChleHRyYV9kYXRhc2V0JGRhdGFfcmVsYXRvcmlvIC8gMTAwMCwgb3JpZ2luID0gIjE5NzAtMDEtMDEiKSkKIyAKIyBleHRyYV9kYXRhc2V0IDwtIGV4dHJhX2RhdGFzZXQgJT4lCiMgICBhcnJhbmdlKGRhdGFfcmVsYXRvcmlvKSAlPiUKIyAgIG11dGF0ZShpZF9vYmpldG8gPSAxOm4oKSkKYGBgCgpgYGB7ciBjaGVjayBkYXRhLCBldmFsPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQojIEludGVybmFsIHF1YWxpdHkgY2hlY2sgLS0tLQoKYnlfYWdlIDwtIGNhc2VzX2RhdGFzZXQgJT4lCiAgc2VsZWN0KHN0YXJ0c193aXRoKCJncl9ldGFyaW8iKSkgJT4lCiAgcm93U3VtcyhuYS5ybSA9IFQpCmJ5X3NleCA8LSBjYXNlc19kYXRhc2V0JGNhc29zX21hc2N1bGlub3MgKyBjYXNlc19kYXRhc2V0JGNhc29zX2ZlbWluaW5vcwpieV90cmFuc21pc3Npb24gPC0gY2FzZXNfZGF0YXNldCRjYXNvc19jb250YWN0byArIGNhc2VzX2RhdGFzZXQkY2Fzb3NfaW1wb3J0YWRvcwpieV9zdGF0dXMgPC0gY2FzZXNfZGF0YXNldCRyZWN1cGVyYWRvcyArIGNhc2VzX2RhdGFzZXQkbl9vYml0b3MgKyBjYXNlc19kYXRhc2V0JGNhc29zX2F0aXZvcwoKaWYgKCFpZGVudGljYWwoY2FzZXNfZGF0YXNldCRjYXNvc19jb25maXJtYWRvcywgYnlfc3RhdHVzKSkgewogIGVyciA8LSB3aGljaChjYXNlc19kYXRhc2V0JGNhc29zX2NvbmZpcm1hZG9zICE9IGJ5X3N0YXR1cykKCiAgZm9yIChuIGluIGVycikgewogICAgY2F0KHBhc3RlMCgKICAgICAgIkluY29uZ3J1w6puY2lhIG5vIGRpYSAiLCBjYXNlc19kYXRhc2V0JGRhdGFfcmVsYXRvcmlvW25dLAogICAgICAiIENvbmZpcm1hZG9zOiAiLCBjYXNlc19kYXRhc2V0JGNhc29zX2NvbmZpcm1hZG9zW25dLAogICAgICAiLCBhdGl2b3MgKyBvYml0b3MrIHJlY3VwZXJhZG9zOiAiLCBieV9zdGF0dXNbbl0sICJcbiIKICAgICkpCiAgfQp9CgppZiAoIWlkZW50aWNhbChjYXNlc19kYXRhc2V0JGNhc29zX2NvbmZpcm1hZG9zLCBieV9hZ2UpKSB7CiAgZXJyIDwtIHdoaWNoKGNhc2VzX2RhdGFzZXQkY2Fzb3NfY29uZmlybWFkb3MgIT0gYnlfYWdlKQoKICBmb3IgKG4gaW4gZXJyKSB7CiAgICBjYXQocGFzdGUwKAogICAgICAiSW5jb25ncnXDqm5jaWEgbm8gZGlhICIsIGNhc2VzX2RhdGFzZXQkZGF0YV9yZWxhdG9yaW9bbl0sCiAgICAgICIgQ29uZmlybWFkb3M6ICIsIGNhc2VzX2RhdGFzZXQkY2Fzb3NfY29uZmlybWFkb3Nbbl0sCiAgICAgICIsIFNvbWEgZGFzIGZhaXhhcyBldMOhcmlhczogIiwgYnlfYWdlW25dLCAiXG4iCiAgICApKQogIH0KfQoKaWYgKCFpZGVudGljYWwoY2FzZXNfZGF0YXNldCRjYXNvc19jb25maXJtYWRvcywgYnlfc2V4KSkgewogIGVyciA8LSB3aGljaChjYXNlc19kYXRhc2V0JGNhc29zX2NvbmZpcm1hZG9zICE9IGJ5X3NleCkKCiAgZm9yIChuIGluIGVycikgewogICAgY2F0KHBhc3RlMCgKICAgICAgIkluY29uZ3J1w6puY2lhIG5vIGRpYSAiLCBjYXNlc19kYXRhc2V0JGRhdGFfcmVsYXRvcmlvW25dLAogICAgICAiIENvbmZpcm1hZG9zOiAiLCBjYXNlc19kYXRhc2V0JGNhc29zX2NvbmZpcm1hZG9zW25dLAogICAgICAiLCBIb21lbnMgKyBNdWxoZXJlczogIiwgYnlfc2V4W25dLCAiXG4iCiAgICApKQogIH0KfQoKaWYgKCFpZGVudGljYWwoY2FzZXNfZGF0YXNldCRjYXNvc19jb25maXJtYWRvcywgYnlfdHJhbnNtaXNzaW9uKSkgewogIGVyciA8LSB3aGljaChjYXNlc19kYXRhc2V0JGNhc29zX2NvbmZpcm1hZG9zICE9IGJ5X3RyYW5zbWlzc2lvbikKCiAgZm9yIChuIGluIGVycikgewogICAgY2F0KHBhc3RlMCgKICAgICAgIkluY29uZ3J1w6puY2lhIG5vIGRpYSAiLCBjYXNlc19kYXRhc2V0JGRhdGFfcmVsYXRvcmlvW25dLAogICAgICAiIENvbmZpcm1hZG9zOiAiLCBjYXNlc19kYXRhc2V0JGNhc29zX2NvbmZpcm1hZG9zW25dLAogICAgICAiLCBDb250YXRvICsgSW1wb3J0YWRvczogIiwgYnlfdHJhbnNtaXNzaW9uW25dLCAiXG4iCiAgICApKQogIH0KfQpgYGAKCiMgRXh0ZW5kZWQgTW9kZWwKCkEgbW9yZSBjb21wbGV4IG1vZGVsIGlzIHByb3Bvc2VkIGJ5IFRpbSBDaHVyY2hlc1tAY2h1cmNoZXMyMDIwbW9kZWxsaW5nY292aWQxOXJwYXJ0Ml0sIGFkZGluZyBzZXZlcmFsIGNvbXBhcnRtZW50cyBhbmQgcGVybWl0IGEgYmV0dGVyIGV4cGxvcmF0aW9uIG9mIHRoZSBwb3RlbnRpYWwgZWZmZWN0cyBvZiB2YXJpb3VzIGNvbWJpbmF0aW9ucyBhbmQgdGltaW5ncyBvZiBpbnRlcnZlbnRpb25zIG9uIENPVklELTE5IHNwcmVhZC4KCkF0dGVudGlvbiB0byB0aGUgZGVzY3JpcHRpb24gb2YgZWFjaCBjb21wYXJ0bWVudDoKCnwgQ29tcGFydG1lbnQgfCBGdW5jdGlvbmFsIGRlZmluaXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8LS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKfCBTICAgICAgICAgICB8IFN1c2NlcHRpYmxlIGluZGl2aWR1YWxzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgRSAgICAgICAgICAgfCBFeHBvc2VkICoqYW5kKiogaW5mZWN0ZWQsIG5vdCB5ZXQgc3ltcHRvbWF0aWMgYnV0IHBvdGVudGlhbGx5IGluZmVjdGlvdXMgICAgICAgICAgfAp8IEkgICAgICAgICAgIHwgSW5mZWN0ZWQsIHN5bXB0b21hdGljICoqYW5kKiogaW5mZWN0aW91cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKfCBRICAgICAgICAgICB8IEluZmVjdGlvdXMsIGJ1dCAoc2VsZi0paXNvbGF0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgSCAgICAgICAgICAgfCBSZXF1aXJpbmcgaG9zcGl0YWxpc2F0aW9uICh3b3VsZCBub3JtYWxseSBiZSBob3NwaXRhbGlzZWQgaWYgY2FwYWNpdHkgYXZhaWxhYmxlKSAgfAp8IFIgICAgICAgICAgIHwgUmVjb3ZlcmVkLCBpbW11bmUgZnJvbSBmdXJ0aGVyIGluZmVjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKfCBGICAgICAgICAgICB8IENhc2UgZmF0YWxpdHkgKGRlYXRoIGR1ZSB0byBDT1ZJRC0xOSwgbm90IG90aGVyIGNhdXNlcykgICAgICAgICAgICAgICAgICAgICAgICAgICB8CgojIyBUcmFuc2l0aW9uIGRpYWdyYW0KCmBgYHtyIGZsb3cgY2hhcnQsIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTEwLCBmaWcuYWxpZ249ImNlbnRlciJ9CmdyVml6KCIKZGlncmFwaCBTRUlRSFJGIHsKCiAgIyBhICdncmFwaCcgc3RhdGVtZW50CiAgZ3JhcGggW292ZXJsYXAgPSBmYWxzZSwgZm9udHNpemUgPSAxMiwgZm9udG5hbWUgPSBIZWx2ZXRpY2EKICBsYWJlbGxvYz0nYicsIGxhYmVsPSdcbkFkYXB0ZWQgZnJvbSB0aW1jaHVyY2hlcy5naXRodWIuaW8vYmxvZyddICMsIHJhbmtkaXIgPSBMUl0KCiAgIyBzZXZlcmFsICdub2RlJyBzdGF0ZW1lbnRzCiAgbm9kZSBbc2hhcGUgPSBib3gsIGZvbnRuYW1lID0gSGVsdmV0aWNhXQogIFNbbGFiZWw9J1M9U3VzY2VwdGlibGUnXTsKICBFW2xhYmVsPSdFPUV4cG9zZWQgYW5kIGluZmVjdGVkLFxuYXN5bXB0b21hdGljLFxucG90ZW50aWFsbHkgaW5mZWN0aW91cyddOwogIElbbGFiZWw9J0k9SW5mZWN0ZWQgYW5kIGluZmVjdGlvdXMnXTsKICBRW2xhYmVsPSdRPShTZWxmLSlpc29sYXRlZFxuKGluZmVjdGlvdXMpJ107CiAgSFtsYWJlbD0nSD1SZXF1aXJlc1xuaG9zcGl0YWxpc2F0aW9uJ107CiAgUltsYWJlbD0nUj1SZWNvdmVyZWQvaW1tdW5lJ107CiAgRltsYWJlbD0nRj1DYXNlIGZhdGFsaXR5J10KCiAgIyBzZXZlcmFsICdlZGdlJyBzdGF0ZW1lbnRzCiAgUy0+RVtsYWJlbD0nYSddCiAgSS0+U1tzdHlsZT0nZGFzaGVkJywgbGFiZWw9J3gnXQogIEUtPklbbGFiZWw9J2InXQogIEUtPlNbc3R5bGU9J2Rhc2hlZCcsIGxhYmVsPSd5J10KICBJLT5RW2xhYmVsPSdjJ10KICBRLT5TW3N0eWxlPSdkYXNoZWQnLCBsYWJlbD0neiddCiAgSS0+UltsYWJlbD0nZCddCiAgSS0+SFtsYWJlbD0nZSddCiAgSC0+RltsYWJlbD0nZiddCiAgSC0+UltsYWJlbD0nZyddCiAgUS0+UltsYWJlbD0naCddCiAgUS0+SFtsYWJlbD0naSddCn0KIikKYGBgCgojIyBQYXJhbWV0ZXJzCgpUaGVyZSBhcmUgbWFueSBwYXJhbWV0ZXJzLiBXZSB3aWxsIHN0YXJ0IHdpdGggdGhlIGRlZmF1bHRzIGFuZCBhZGp1c3QgYWNjb3JkaW5nbHkgdG8gbmV3IGV2aWRlbmNlLgoKVGhlIGZ1bGwgbGlzdCBvZiBwYXJhbWV0ZXJzIGlzIGF2YWlsYWJsZSBpbiB0aGUgc291cmNlIGNvZGUuCgpgYGB7ciBwYXJhbWV0ZXJzLCBldmFsPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQpwYXJhbV9kb2NzIDwtIHRyaWJibGUoCiAgfkRpYWdyYW1SZWYsIH5QYXJhbWV0ZXIsIH5EZWZhdWx0LCB+RXhwbGFuYXRpb24sCiAgIiIsICJ0eXBlIiwgIlNFSVFIUkYiLCAiVHlwZSBvZiBtb2RlbDogU0ksIFNJUiwgU0lTLCBTRUlSLCBTRUlRSFIgYW5kIFNFSVFIUkYgYXZhaWxhYmxlLCBidXQgb25seSBTRUlRSFJGIGlzIGxpa2VseSB0byB3b3JrIGluIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIGNvZGUuIiwKCiAgIiIsICJuc3RlcHMiLCAzNjYsICJOdW1iZXIgb2YgZGF5cyBmb3Igc2ltdWxhdGlvbi4gTm90ZSB0aGF0IGRheSAxIGlzIGZvciBpbml0aWFsaXNhdGlvbiwgZGF5IDIgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgc2ltdWxhdGlvbiwgaGVuY2UgZGVmYXVsdCBvZiAzNjYgZm9yIDEgeWVhci4iLAoKICAiIiwgIm5zaW1zIiwgMTAsICJOdW1iZXIgb2Ygc2ltdWxhdGlvbnMgdG8gcnVuIGFuZCB0aGVuIGF2ZXJhZ2UuIiwKCiAgIiIsICJuY29yZXMiLCAxMCwgIk51bWJlciBvZiBDUFUgY29yZXMgdG8gdXNlIGZvciBwYXJhbGxlbCBleGVjdXRpb24uIiwKCiAgImIiLCAicHJvZy5yYW5kIiwgRkFMU0UsICJNZXRob2QgZm9yIHByb2dyZXNzaW9uIGZyb20gRSBjb21wYXJ0bWVudCB0byBJLiBJZiBUUlVFLCByYW5kb20gYmlub21pYWwgZHJhd3MgYXQgYHByb2cucmF0ZWAsIGlmIEZBTFNFLCByYW5kb20gZHJhd3MgZnJvbSBhIFdlaWJ1bGwgZGlzdHJpYnV0aW9uICh5ZXMsIEkga25vdyBpdCBzaG91bGQgYmUgYSBkaXNjcmV0ZSBXZWlidWxsIGRpc3RyaWJ1dGlvbiBidXQgaXQgbWFrZXMgbGl0dGxlIGRpZmZlcmVuY2UgYW5kIHNwZWVkIG9mIGNvbXB1dGF0aW9uIG1hdHRlcnMpLCB3aXRoIHBhcmFtZXRlcnMgYHByb2cuZGlzdC5zY2FsZWAgYW5kICBgcHJvZy5kaXN0LnNoYXBlYCIsCgogICJkLGcsaCIsICJyZWMucmFuZCIsIEZBTFNFLCAiTWV0aG9kIGZvciByZWNvdmVyeSB0cmFuc2l0aW9uIGZyb20gSSwgUSBvciBIIHRvIFIuIElmIFRSVUUsIHJhbmRvbSBiaW5vbWlhbCBkcmF3cyBhdCBgcmVjLnJhdGVgLCBpZiBGQUxTRSwgcmFuZG9tIGRyYXdzIGZyb20gYSByYW5kb20gZHJhd3MgZnJvbSBhIFdlaWJ1bGwgZGlzdHJpYnV0aW9uLCB3aXRoIHBhcmFtZXRlcnMgYHJlYy5kaXN0LnNjYWxlYCBhbmQgIGByZWMuZGlzdC5zaGFwZWAiLAoKICAiZiIsICJmYXQucmFuZCIsIEZBTFNFLCAiTWV0aG9kIGZvciBjYXNlIGZhdGFsaXR5IHRyYW5zaXRpb24gZnJvbSBIIHRvIEYuIElmIFRSVUUsIHJhbmRvbSBiaW5vbWlhbCBkcmF3cyBhdCBgZmF0LnJhdGUuYmFzZWAsIGlmIEZBTFNFLCByYW5kb20gc2FtcGxlIHdpdGggYSBzYW1wbGUgZnJhY3Rpb24gYWxzbyBnaXZlbiBieSBgZmF0LnJhdGUuYmFzZWAuIEhvd2V2ZXIsIGlmIHRoZSBjdXJyZW50IG51bWJlciBvZiBwYXRpZW50cyBpbiB0aGUgSCAobmVlZHMgaG9zcGl0YWxpc2F0aW9uKSBjb21wYXJ0bWVudCBpcyBhYm92ZSBhIGhvc3BpdGFsIGNhcGFjaXR5IGxldmVsIHNwZWNpZmllZCBieSBgaG9zcC5jYXBgLCB0aGVuIHRoZSBmYXRhbGl0eSByYXRlIGlzIHRoZSBtZWFuIG9mIHRoZSBiYXNlIGZhdGFsaXR5IHJhdGUgd2VpZ2h0ZWQgYnkgdGhlIGhvc3BpdGFsIGNhcGFjaXR5LCBwbHVzIGEgaGlnaGVyIHJhdGUsIHNwZWNpZmllZCBieSBgZmF0LnJhdGUub3ZlcmNhcGAsIHdlaWdodGVkIGJ5IHRoZSBiYWxhbmNlIG9mIHRob3NlIHJlcXVpcmluZyBob3NwaXRhbGlzYXRpb24gKGJ1dCB3aG8gY2FuJ3QgYmUgYWNjb21tb2RhdGVkKS4gQnkgc2V0dGluZyBgZmF0LnJhdGUub3ZlcmNhcGAgaGlnaGVyLCB0aGUgZWZmZWN0IG9mIGV4Y2VlZGluZyB0aGUgY2FwYWNpdHkgb2YgdGhlIGhlYWx0aCBjYXJlIHN5c3RlbSBjYW4gYmUgc2ltdWxhdGVkLiBUaGVyZSBpcyBhbHNvIGEgY29lZmZpY2llbnQgYGZhdC50Y29lZmZgIGZvciB0aGUgZmF0YWxpdHkgcmF0ZXMgdGhhdCBpbmNyZWFzZXMgdGhlbSBhcyBhIGxpbmVhciBmdW5jdGlvbiBvZiB0aGUgbnVtYmVyIG9mIGRheXMgdGhlIGluZGl2aWR1YWwgaGFzIGJlZW4gaW4gdGhlIEggY29tcGFydG1lbnQuIFVzZSBvZiB0aGUgY28tZWZmaWNpZW50IGJldHRlciBhcHByb3hpbWF0ZXMgdGhlIHRyYXBlem9pZCBzdXJ2aXZhbCB0aW1lIGRpc3RyaWJ1dGlvbiB0eXBpY2FsIG9mIElDVSBwYXRpZW50cy4iLAoKICAiYyIsICJxdWFyLnJhbmQiLCBGQUxTRSwgIk1ldGhvZCBmb3Igc2VsZi1pc29sYXRpb24gdHJhbnNpdGlvbiBmcm9tIEkgdG8gUS4gSWYgVFJVRSwgcmFuZG9tIGJpbm9taWFsIGRyYXdzIGF0IGBxdWFyLnJhdGVgLCBpZiBGQUxTRSwgcmFuZG9tIHNhbXBsZSB3aXRoIGEgc2FtcGxlIGZyYWN0aW9uIGFsc28gZ2l2ZW4gYnkgYHF1YXIucmF0ZS4iLAoKICAiZSxpIiwgImhvc3AucmFuZCIsIEZBTFNFLCAiTWV0aG9kIGZvciB0cmFuc2l0aW9uIGZyb20gSSBvciBRIHRvIEggLS0gdGhhdCBpcywgZnJvbSBpbmZlY3Rpb3VzIG9yIGZyb20gc2VsZi1pc29sYXRlZCB0byByZXF1aXJpbmcgaG9zcGl0YWxpc2F0aW9uLiBJZiBUUlVFLCByYW5kb20gYmlub21pYWwgZHJhd3MgYXQgYGhvc3AucmF0ZWAsIGlmIEZBTFNFLCByYW5kb20gc2FtcGxlIHdpdGggYSBzYW1wbGUgZnJhY3Rpb24gYWxzbyBnaXZlbiBieSBgaG9zcC5yYXRlLiIsCgogICJnIiwgImRpc2NoLnJhbmQiLCBGQUxTRSwgIk1ldGhvZCBmb3IgdHJhbnNpdGlvbiBmcm9tIEggdG8gUiAtLSB0aGF0IGlzLCBmcm9tIHJlcXVpcmluZyBob3NwaXRhbGlzYXRpb24gdG8gcmVjb3ZlcmVkLiBJZiBUUlVFLCByYW5kb20gYmlub21pYWwgZHJhd3MgYXQgYGRpc2NoLnJhdGVgLCBpZiBGQUxTRSwgcmFuZG9tIHNhbXBsZSB3aXRoIGEgc2FtcGxlIGZyYWN0aW9uIGFsc28gZ2l2ZW4gYnkgYGRpc2NoLnJhdGVgLiBOb3RlIHRoYXQgdGhlIG9ubHkgd2F5IG91dCBvZiB0aGUgKipIKiogY29tcGFydG1lbnQgaXMgcmVjb3Zlcnkgb3IgZGVhdGguICAiLAoKICAiIiwgImluZmVjdGlvbi5GVU4iLCAiaW5mZWN0aW9uLnNlaXFocmYuaWNtIiwgIk5vLCBiZWluZyBpbmZlY3RlZCB3aXRoIFNBUlMtQ29WMiBpcyAqKm5vdCoqIGZ1bi4gUmF0aGVyIHRoaXMgaXMgdGhlIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiB0byBpbXBsZW1lbnQgaW5mZWN0aW9uIHByb2Nlc3Nlcy4gVXNlIHRoZSBkZWZhdWx0LiIsCgogICIiLCAiZGVwYXJ0dXJlcy5GVU4iLCAiZGVwYXJ0dXJlcy5zZWlxaHJmLmljbSIsICJIYW5kbGVzIGJhY2tncm91bmQgZGVtb2dyYXBoaWNzLCBzcGVjaWZpY2FsbHkgZGVwYXJ0dXJlcyAoZGVhdGhzIG5vdCBkdWUgdG8gdGhlIHZpcnVzLCBhbmQgZW1pZ3JhdGlvbikuIFVzZSB0aGUgZGVmYXVsdC4iLAoKICAiIiwgImFycml2YWxzLkZVTiIsICJhcnJpdmFscy5pY20iLCAiSGFuZGxlcyBiYWNrZ3JvdW5kIGRlbW9ncmFwaGljcywgc3BlY2lmaWNhbGx5IGFycml2YWxzIChiaXJ0aHMgYW5kIGltbWlncmF0aW9uKS4gVXNlcyB0aGUgb3JpZ2luYWwgRXBpTW9kZWwgY29kZSBjdXJyZW50bHkuIEEgcmVwbGFjZW1lbnQgdGhhdCBpbXBsZW1lbnRzIG1vZGVsbGluZyB0aGUgYXJyaXZhbCBvZiBpbmZlY3RlZCBpbmRpdmlkdWFscyBpcyB1bmRlciBkZXZlbG9wbWVudCAtLSBidXQgZm9yIG5vdywgYWxsIGFycml2YWxzIGdvIGludG8gdGhlICoqUyoqIGNvbXBhcnRtZW50LiIsCgogICIiLCAiZ2V0X3ByZXYuRlVOIiwgImdldF9wcmV2LnNlaXFocmYuaWNtIiwgIlV0aWxpdHkgZnVuY3Rpb24gdGhhdCBjb2xsZWN0cyBwcmV2YWxlbmNlIGFuZCB0cmFuc2l0aW9uIHRpbWUgZGF0YSBmcm9tIGVhY2ggcnVuIGFuZCBzdG9yZXMgaXQgYXdheSBpbiB0aGUgc2ltdWxhdGlvbiByZXN1bHQgb2JqZWN0LiBVc2UgdGhlIGRlZmF1bHQuIiwKCiAgIiIsICJzLm51bSIsICI5OTk3IiwgIkluaXRpYWwgbnVtYmVyIG9mICoqUyogY29tcGFydG1lbnQgaW5kaXZpZHVhbHMgaW4gdGhlIHNpbXVsYXRlZCBwb3B1bGF0aW9uLiBBbiBvdmVyYWxsIHBvcHVsYXRpb24gb2YgMTAsMDAwIGlzIGEgZ29vZCBjb21wcm9taXNlLiBBIHNldCBvZiBtb2RlbHMgd2lsbCBzdGlsbCB0YWtlIHNldmVyYWwgbWludXRlcyBvciBtb3JlIHRvIHJ1biwgaW4gcGFyYWxsZWwuICIsCgogICIiLCAiZS5udW0iLCAiMCIsICJJbml0aWFsIG51bWJlciBvZiAqKkUqKiBjb21wYXJ0bWVudCBpbmRpdmlkdWFscyBpbiB0aGUgc2ltdWxhdGVkIHBvcHVsYXRpb24uIiwKCiAgIiIsICJpLm51bSIsICIzIiwgIkluaXRpYWwgbnVtYmVyIG9mICoqSSoqIGNvbXBhcnRtZW50IGluZGl2aWR1YWxzIGluIHRoZSBzaW11bGF0ZWQgcG9wdWxhdGlvbi4iLAoKICAiIiwgInEubnVtIiwgIjAiLCAiSW5pdGlhbCBudW1iZXIgb2YgKipRKiogY29tcGFydG1lbnQgaW5kaXZpZHVhbHMgaW4gdGhlIHNpbXVsYXRlZCBwb3B1bGF0aW9uLiIsCgogICIiLCAiaC5udW0iLCAiMCIsICJJbml0aWFsIG51bWJlciBvZiAqKkgqKiBjb21wYXJ0bWVudCBpbmRpdmlkdWFscyBpbiB0aGUgc2ltdWxhdGVkIHBvcHVsYXRpb24uIiwKCiAgIiIsICJyLm51bSIsICIwIiwgIkluaXRpYWwgbnVtYmVyIG9mICoqUioqIGNvbXBhcnRtZW50IGluZGl2aWR1YWxzIGluIHRoZSBzaW11bGF0ZWQgcG9wdWxhdGlvbi4iLAoKICAiIiwgImYubnVtIiwgIjAiLCAiSW5pdGlhbCBudW1iZXIgb2YgKipGKiogY29tcGFydG1lbnQgaW5kaXZpZHVhbHMgaW4gdGhlIHNpbXVsYXRlZCBwb3B1bGF0aW9uLiIsCgogICJ4IiwgImFjdC5yYXRlLmkiLCAiMTAiLCAiVGhlIG51bWJlciBvZiBleHBvc3VyZSBldmVudHMgKF9hY3RzXykgYmV0d2VlbiBpbmZlY3Rpb3VzIGluZGl2aWR1YWxzIGluIHRoZSAqKkkqKiBjb21wYXJ0bWVudCBhbmQgc3VzY2VwdGlibGUgaW5kaXZpZHVhbHMgaW4gdGhlICoqUyoqIGNvbXBhcnRtZW50LCBwZXIgZGF5LiBJdCdzIHN0b2NoYXN0aWMsIHNvIHRoZSByYXRlIGlzIGFuIGF2ZXJhZ2UsIHNvbWUgaW5kaXZpZHVhbHMgbWF5IGhhdmUgbW9yZSBvciBsZXNzLiBOb3RlIHRoYXQgbm90IGV2ZXJ5IGV4cG9zdXJlIGV2ZW50IHJlc3VsdHMgaW4gaW5mZWN0aW9uIC0gdGhhdCBpcyBnb3Zlcm5lZCBieSB0aGUgYGluZi5wcm9iLmlgIHBhcmFtZXRlcnMgKHNlZSBiZWxvdykuIFJlZHVjaW5nIGBhY3QucmF0ZS5pYCBpcyBlcXVpdmFsZW50IHRvIGluY3JlYXNpbmcgc29jaWFsIGRpc3RhbmNpbmcgYnkgcGVvcGxlIGluIHRoZSAqKkkqKiBjb21wYXJ0bWVudC4iLAoKICAieCIsICJpbmYucHJvYi5pIiwgIjAuMDUiLCAiUHJvYmFiaWxpdHkgb2YgcGFzc2luZyBvbiBpbmZlY3Rpb24gYXQgZWFjaCBleHBvc3VyZSBldmVudCBmb3IgaW50ZXJhY3Rpb25zIGJldHdlZW4gaW5mZWN0aW91cyBwZW9wbGUgaW4gdGhlICoqSSoqIGNvbXBhcnRtZW50IGFuZCBzdXNjZXB0aWJsZXMgaW4gKipTKiouIFJlZHVjaW5nIGBpbmYucHJvYi5pYCBpcyBlcXVpdmFsZW50IHRvIGluY3JlYXNpbmcgaHlnaWVuZSBtZWFzdXJlcywgc3VjaCBhcyBub3QgcHV0dGluZyBoYW5kcyBpbiBleWVzLCBub3NlIG9yIG1vdGgsIHVzZSBvZiBoYW5kIHNhbml0aXNlcnMsIHdlYXJpbmcgbWFza3MgYnkgdGhlIGluZmVjdGVkLCBhbmQgc28gb24uIiwKCiAgInkiLCAiYWN0LnJhdGUuZSIsICIxMCIsICJUaGUgbnVtYmVyIG9mIGV4cG9zdXJlIGV2ZW50cyAoX2FjdHNfKSBiZXR3ZWVuIGluZmVjdGlvdXMgaW5kaXZpZHVhbHMgaW4gdGhlICoqRSoqIGNvbXBhcnRtZW50IGFuZCBzdXNjZXB0aWJsZSBpbmRpdmlkdWFscyBpbiB0aGUgKipTKiogY29tcGFydG1lbnQsIHBlciBkYXkuIE90aGVyd2lzZSBhcyBmb3IgYGFjdC5yYXRlLmlgLiIsCgogICJ5IiwgImluZi5wcm9iLmUiLCAiMC4wMiIsICJQcm9iYWJpbGl0eSBvZiBwYXNzaW5nIG9uIGluZmVjdGlvbiBhdCBlYWNoIGV4cG9zdXJlIGV2ZW50IGZvciBpbnRlcmFjdGlvbnMgYmV0d2VlbiBpbmZlY3Rpb3VzIHBlb3BsZSBpbiB0aGUgKipFKiogY29tcGFydG1lbnQgYW5kIHN1c2NlcHRpYmxlcyBpbiAqKlMqKi4gTm90ZSB0aGUgZGVmYXVsdCBpcyBsb3dlciB0aGFuIGZvciBgaW5mLnByb2IuaWAgcmVmbGVjdGluZyB0aGUgcmVkdWNlZCBpbmZlY3Rpdml0eSBvZiBpbmZlY3RlZCBidXQgYXN5bXB0b21hdGljIHBlb3BsZSAodGhlICoqRSoqIGNvbXBhcnRtZW50KS4gT3RoZXJ3aXNlIGFzIGZvciBgaW5mLnByb2IuaWAuIiwKCiAgInoiLCAiYWN0LnJhdGUucSIsICIyLjUiLCAiVGhlIG51bWJlciBvZiBleHBvc3VyZSBldmVudHMgKF9hY3RzXykgYmV0d2VlbiBpbmZlY3Rpb3VzIGluZGl2aWR1YWxzIGluIHRoZSAqKlEqKiBjb21wYXJ0bWVudCAoaXNvbGF0ZWQsIHNlbGYgb3Igb3RoZXJ3aXNlKSBhbmQgc3VzY2VwdGlibGUgaW5kaXZpZHVhbHMgaW4gdGhlICoqUyoqIGNvbXBhcnRtZW50LCBwZXIgZGF5LiBOb3RlIHRoZSBtdWNoIGxvd2VyIHJhdGUgdGhhbiBmb3IgdGhlICoqSSoqIGFuZCAqKkUqKiBjb21wYXJ0bWVudHMsIHJlZmxlY3RpbmcgdGhlIG11Y2ggZ3JlYXRlciBkZWdyZWUgb2Ygc29jaWFsIGlzb2xhdGlvbiBmb3Igc29tZW9uZSBpbiAoc2VsZi0paXNvbGF0aW9uLiBUaGUgZXhwb3N1cmUgZXZlbnQgcmF0ZSBpcyBub3QgemVybyBmb3IgdGhpcyBncm91cCwganVzdCBtdWNoIGxlc3MuIE90aGVyd2lzZSBhcyBmb3IgYGFjdC5yYXRlLmlgLiIsCgogICJ6IiwgImluZi5wcm9iLnEiLCAiMC4wMiIsICJQcm9iYWJpbGl0eSBvZiBwYXNzaW5nIG9uIGluZmVjdGlvbiBhdCBlYWNoIGV4cG9zdXJlIGV2ZW50IGZvciBpbnRlcmFjdGlvbnMgYmV0d2VlbiBpbmZlY3Rpb3VzIHBlb3BsZSBpbiB0aGUgKipRKiogY29tcGFydG1lbnQgYW5kIHN1c2NlcHRpYmxlcyBpbiAqKlMqKi4gTm90ZSB0aGUgZGVmYXVsdCBpcyBsb3dlciB0aGFuIGZvciBgaW5mLnByb2IuaWAgcmVmbGVjdGluZyB0aGUgZ3JlYXRlciBjYXJlIHRoYXQgc2VsZi1pc29sYXRlZCBpbmRpdmlkdWFscyB3aWxsLCBvbiBhdmVyYWdlLCB0YWtlIHJlZ2FyZGluZyBoeWdpZW5lIG1lYXN1cmVzLCBzdWNoIGFzIHdlYXJpbmcgbWFza3MsIHRvIGxpbWl0IHNwcmVhZCB0byBvdGhlcnMuIE90aGVyd2lzZSBhcyBmb3IgYGluZi5wcm9iLmlgLiIsCgogICJjIiwgInF1YXIucmF0ZSIsICIxLzMwIiwgIlJhdGUgcGVyIGRheSBhdCB3aGljaCBzeW1wdG9tYXRpYyAob3IgdGVzdGVkIHBvc2l0aXZlKSwgaW5mZWN0ZWQgKipJKiogY29tcGFydG1lbnQgcGVvcGxlIGVudGVyIHNlbGYtaXNvbGF0aW9uICgqKlEqKiBjb21wYXJ0bWVudCkuIEFzeW1wdG9tYXRpYyAqKkUqKiBjb21wYXJ0bWVudCBwZW9wbGUgY2FuJ3QgZW50ZXIgc2VsZi1pc29sYXRpb24gYmVjYXVzZSB0aGV5IGRvbid0IHlldCBrbm93IHRoZXkgYXJlIGluZmVjdGVkLiBEZWZhdWx0IGlzIGEgbG93IHJhdGUgcmVmbGVjdGluZyBsb3cgY29tbXVuaXR5IGF3YXJlbmVzcyBvciBjb21wbGlhbmNlIHdpdGggc2VsZi1pc29sYXRpb24gcmVxdWlyZW1lbnRzIG9yIHByYWN0aWNlcywgYnV0IHRoaXMgY2FuIGJlIHR3ZWFrZWQgd2hlbiBleHBsb3Jpbmcgc2NlbmFyaW9zLiIsCgogICJlLGkiLCAiaG9zcC5yYXRlIiwgIjEvMTAwIiwgIlJhdGUgKipwZXIgZGF5KiogYXQgd2hpY2ggc3ltcHRvbWF0aWMgKG9yIHRlc3RlZCBwb3NpdGl2ZSksIGluZmVjdGVkICoqSSoqIGNvbXBhcnRtZW50IHBlb3BsZSBvciBzZWxmLWlzb2xhdGVkICoqUSoqIGNvbXBhcnRtZW50IHBlb3BsZSBlbnRlciB0aGUgc3RhdGUgb2YgcmVxdWlyaW5nIGhvc3BpdGFsIGNhcmUgLS0gdGhhdCBpcywgYmVjb21lIHNlcmlvdXMgY2FzZXMuIEEgZGVmYXVsdCByYXRlIG9mIDElIHBlciBkYXkgd2l0aCBhbiBhdmVyYWdlIGlsbG5lc3MgZHVyYXRpb24gb2YgYWJvdXQgMTAgZGF5cyBtZWFucyBhIGJpdCBsZXNzIHRoYW4gMTAlIG9mIGNhc2VzIHdpbGwgcmVxdWlyZSBob3NwaXRhbGlzYXRpb24sIHdoaWNoIHNlZW1zIGFib3V0IHJpZ2h0IChidXQgY2FuIGJlIHR3ZWFrZWQsIG9mIGNvdXJzZSkuIiwKCiAgImciLCAiZGlzY2gucmF0ZSIsICIxLzE1IiwgIlJhdGUgcGVyIGRheSBhdCB3aGljaCBwZW9wbGUgbmVlZGluZyBob3NwaXRhbGlzYXRpb24gcmVjb3Zlci4iLAoKICAiYiIsICJwcm9nLnJhdGUiLCAiMS8xMCIsICJSYXRlIHBlciBkYXkgYXQgd2hpY2ggcGVvcGxlIHdobyBhcmUgaW5mZWN0ZWQgYnV0IGFzeW1wdG9tYXRpYyAoKipFKiogY29tcGFydG1lbnQpIHByb2dyZXNzIHRvIGJlY29taW5nIHN5bXB0b21hdGljIChvciB0ZXN0LXBvc2l0aXZlKSwgdGhlICoqSSoqIGNvbXBhcnRtZW50LiBTZWUgYHByb2cucmFuZGAgYWJvdmUgZm9yIG1vcmUgZGV0YWlscy4iLAoKICAiYiIsICJwcm9nLmRpc3Quc2NhbGUiLCAiNSIsICJTY2FsZSBwYXJhbWV0ZXIgZm9yIFdlaWJ1bGwgZGlzdHJpYnV0aW9uIGZvciBwcm9ncmVzc2lvbiwgc2VlIGBwcm9nLnJhbmRgIGZvciBkZXRhaWxzLiIsCgogICJiIiwgInByb2cuZGlzdC5zaGFwZSIsICIxLjUiLCAiU2hhcGUgcGFyYW1ldGVyIGZvciBXZWlidWxsIGRpc3RyaWJ1dGlvbiBmb3IgcHJvZ3Jlc3Npb24sIHNlZSBgcHJvZy5yYW5kYCBmb3IgZGV0YWlscy4gUmVhZCB1cCBvbiB0aGUgV2VpYnVsbCBkaXN0cmlidXRpb24gYmVmb3JlIGNoYW5naW5nIHRoZSBkZWZhdWx0LiIsCgogICJkIiwgInJlYy5yYXRlIiwgIjEvMjAiLCAiUmF0ZSBwZXIgZGF5IGF0IHdoaWNoIHBlb3BsZSB3aG8gYXJlIGluZmVjdGVkIGFuZCBzeW1wdG9tYXRpYyAoKipJKiogY29tcGFydG1lbnQpIHJlY292ZXIsIHRodXMgZW50ZXJpbmcgdGhlICoqUioqIGNvbXBhcnRtZW50LiBTZWUgYHJlYy5yYW5kYCBhYm92ZSBmb3IgbW9yZSBkZXRhaWxzLiIsCgogICJkIiwgInJlYy5kaXN0LnNjYWxlIiwgIjM1IiwgIlNjYWxlIHBhcmFtZXRlciBmb3IgV2VpYnVsbCBkaXN0cmlidXRpb24gZm9yIHJlY292ZXJ5LCBzZWUgYHJlYy5yYW5kYCBmb3IgZGV0YWlscy4iLAoKICAiZCIsICJyZWMuZGlzdC5zaGFwZSIsICIxLjUiLCAiU2hhcGUgcGFyYW1ldGVyIGZvciBXZWlidWxsIGRpc3RyaWJ1dGlvbiBmb3IgcmVjb3ZlcnksIHNlZSBgcmVjLnJhbmRgIGZvciBkZXRhaWxzLiBSZWFkIHVwIG9uIHRoZSBXZWlidWxsIGRpc3RyaWJ1dGlvbiBiZWZvcmUgY2hhbmdpbmcgdGhlIGRlZmF1bHQuIiwKCiAgImYiLCAiZmF0LnJhdGUuYmFzZSIsICIxLzUwIiwgIkJhc2VsaW5lIG1vcnRhbGl0eSByYXRlIHBlciBkYXkgZm9yIHBlb3BsZSBuZWVkaW5nIGhvc3BpdGFsaXNhdGlvbiAoZGVhdGhzIGR1ZSB0byB0aGUgdmlydXMpLiBTZWUgYGZhdC5yYW5kYCBmb3IgbW9yZSBkZXRhaWxzLiIsCgogICJmIiwgImhvc3AuY2FwIiwgIjQwIiwgIk51bWJlciBvZiBhdmFpbGFibGUgaG9zcGl0YWwgYmVkcyBmb3IgdGhlIG1vZGVsbGVkIHBvcHVsYXRpb24uIFNlZSBgZmF0LnJhbmRgIGZvciBtb3JlIGRldGFpbHMuIiwKCiAgImYiLCAiZmF0LnJhdGUub3ZlcmNhcCIsICIxLzI1IiwgIk1vcnRhbGl0eSByYXRlIHBlciBkYXkgZm9yIHBlb3BsZSBuZWVkaW5nIGhvc3BpdGFsaXNhdGlvbiBidXQgd2hvIGNhbid0IGdldCBpbnRvIGhvc3BpdGFsIGR1ZSB0byB0aGUgaG9zcGl0YWxzIGJlaW5nIGZ1bGwgKHNlZSBgaG9zcC5jYXBgIGFuZCBgZmF0LnJhbmRgKS4gVGhlIGRlZmF1bHQgcmF0ZSBpcyB0d2ljZSB0aGF0IGZvciB0aG9zZSB3aG8gZG8gZ2V0IGludG8gaG9zcGl0YWwuIiwKCiAgImYiLCAiZmF0LnRjb2VmZiIsICIwLjUiLCAiVGltZSBjby1lZmZpY2llbnQgZm9yIGluY3JlYXNpbmcgbW9ydGFsaXR5IHJhdGUgYXMgdGltZSBpbiB0aGUgKipIKiogY29tcGFydG1lbnQgaW5jcmVhc2VzIGZvciBlYWNoIGluZGl2aWR1YWwgaW4gaXQuIFNlZSBgZmF0LnJhbmRgIGZvciBkZXRhaWxzLiIsCgogICIiLCAidml0YWwiLCAiVFJVRSIsICJFbmFibGVzIGRlbW9ncmFwaGljcywgdGhhdCBpcywgYXJyaXZhbHMgYW5kIGRlcGFydHVyZXMsIHRvIGFuZCBmcm9tIHRoZSBzaW11bGF0ZWQgcG9wdWxhdGlvbi4iLAoKICAiIiwgImEucmF0ZSIsICIoMTAuNS8zNjUpLzEwMDAiLCAiQmFja2dyb3VuZCBkZW1vZ3JhcGhpYyBhcnJpdmFsIHJhdGUuIEN1cnJlbnRseSBhbGwgYXJyaXZhbHMgZ28gaW50byB0aGUgKipTKiogY29tcGFydG1lbnQsIHRoZSBkZWZhdWx0IGlzIGFwcHJveGltYXRlbHkgdGhlIGRhaWx5IGJpcnRoIHJhdGUgZm9yIEF1c3RyYWxpYS4gV2lsbCBiZSBleHRlbmRlZCB0byBjb3ZlciBpbW1pZ3JhdGlvbiBpbiBmdXR1cmUgdmVyc2lvbnMuIiwKCiAgIiIsICJkcy5yYXRlLCBkZS5yYXRlLCBkZS5yYXRlLCBkcS5yYXRlLCBkaC5yYXRlLCBkci5yYXRlIiwgInZhcmlvdXMgcmF0ZXMiLCAiQmFja2dyb3VuZCBkZW1vZ3JhcGhpYyBkZXBhcnR1cmUgKGRlYXRoIG5vdCBkdWUgdG8gdmlydXMpIHJhdGVzLiBEZWZhdWx0cyBiYXNlZCBvbiBBdXN0cmFsaWFuIGNydWRlIGRlYXRoIHJhdGVzLiBDYW4gYmUgdXNlZCB0byBtb2RlbCBlbWlncmF0aW9uIGFzIHdlbGwgYXMgZGVhdGhzLiIsCgogICIiLCAib3V0IiwgIm1lYW4iLCAiU3VtbWFyeSBmdW5jdGlvbiBmb3IgdGhlIHNpbXVsYXRpb24gcnVucy4gbWVkaWFuIGlzIGFsc28gYXZhaWxhYmxlLCBvciBwZXJjZW50aWxlcywgc2VlIHRoZSBgRXBpTW9kZWxgIGRvY3VtZW50YXRpb24uIiwKKQpwYXJhbV9kb2NzICU+JQogIGd0KCkgJT4lCiAgZm10X21hcmtkb3duKGNvbHVtbnMgPSBUUlVFKSAlPiUKICB0YWJfb3B0aW9ucyh0YWJsZS53aWR0aCA9IHBjdCg5MCkpCmBgYAoKIyMgVGltZS12YXJpYW50IHBhcmFtZXRlcnMKClNvbWUgcGFyYW1ldGVycyBhbHNvIGFjY2VwdCBhIHZlY3RvciBvZiB2YWx1ZXMgd2hpY2ggYWxsb3dzIHRoZSBtb2RlbCB0byBjaGFuZ2UgaXRzZWxmIGFjY29yZGluZ2x5LCBmb3IgZXhhbXBsZSwgdG8gZ292ZXJubWVudCBwb2xpY2llcyBsaWtlIHNlbGYtaXNvbGF0aW9uLCBvciBzb2NpYWwgZGlzdGFuY2luZy4gVGhpcyBmZWF0dXJlIGlzIGNvbXBlbGxpbmcgZm9yIGNvbXB1dGF0aW9uYWwgbW9kZWxzIHN1Y2ggYXMgdGhpcywgYW5kIG9uZSB2ZXJ5IGhhcmQgdG8gaW5jb3Jwb3JhdGUgaW50byBwdXJlbHkgbWF0aGVtYXRpY2FsIG1vZGVscy4KCk1vc3Qgb2YgdGhlIHBhcmFtZXRlcnMgZm9yIHdoaWNoIHRpbWUtdmFyaWF0aW9uIGlzIHVzZWZ1bCBzdXBwb3J0cyBpdC4gSWYgdGhleSBkbyBub3QsIGFuIGVycm9yIG1lc3NhZ2UgaXMgcmFpc2VkLgoKIyBFdmlkZW5jZQoKIyMgQ09WSUQtcmVsYXRlZApMYXN0IGNoZWNrZWQ6IDIwMjAtMDQtMTEKCi0gUmVjb3ZlcnkgKGgsIGQpID0gdGFrZXMgYXQgbGVhc3QgMTUgZGF5cwotIEV4cG9zaXRpb24gdG8gc3ltcHRvbXMgKGIpID0gbWVkaWFuIG9mIDUKLSBJbmN1YmF0aW9uIHBlcmlvZDogNS4xICgyLjIgLSAxMS41KVtAMjAxOV9ub3ZlbF9jb3JvbmF2aXJ1c10KLSBTeW1wdG9tcyB0byBkZWF0aDogfjE1ICgxMSAtIDE3KSAoU28sIEluZmVjdGlvbiB0byBkZWF0aCB+MjAgZGF5cylbQDIwMTlfbm92ZWxfY29yb25hdmlydXNdCi0gRGF5cyB0byBkb3VibGU6IDgtOSAoQ2FzZSByZXBvcnQgZXN0aW1hdGlvbiBpcyAzMS00OCUgYXQgMjAyMC0wNC0xMSwgZm9yIFIgMS4zIGFuZCBDRlIgMi4wW0BpbmZlcnJpbmctY292aWQxOS1jYXNlcy1mcm9tLWRlYXRoc10pCi0gTW9ydGFsaXR5IHJhdGU6IDAuODUgLSAxLjMxJVtAaW5mZXJyaW5nLWNvdmlkMTktY2FzZXMtZnJvbS1kZWF0aHNdCgojIEJhc2VsaW5lIHNpbXVsYXRpb24KCiMjIFBhcmFtZXRlcnMgdXNlZAoKLSBQb3B1bGF0aW9uOiAzLDU3NCwzOTQgKGVzdGltYXRpb24gb2YgMjAxOSBmcm9tIENlbnN1cylbQDIwMjBfaW5lXQotIEJpcnRoIHJhdGU6IDcuNyDigLAgW0AyMDIwX2luZV0KLSBCYXNlbGluZSBkZWF0aCByYXRlIChhbnkgY2F1c2UpOiA5Ljg2IOKAsCBbQDIwMjBfdHJhbnNwYXJlbmNpYV0KLSBCYXNlbGluZSBob3NwaXRhbCBkZWF0aCByYXRlIChhbnkgY2F1c2UpOiA1MC41IOKAsCBbQDIwMjBfdHJhbnNwYXJlbmNpYV0KLSBSYXRlcyBvZiBleHBvc2l0aW9uICh0YWJsZSBiZWxvdykKLSBSZXBvcnQgcmF0ZSAodGFibGUgYmVsb3cpCi0gQWdlcyBhbmQgc2V2ZXJpdHkgKHRhYmxlIGJlbG93KQoKPGJyLz48YnIvPgoKYGBge3J9CmV2ZW50cyA8LSBsaXN0KCkKCmV2ZW50c1tbIjA0MDkiXV0gPC0gdHJpYmJsZSgKICB+aWR4LCB+ZGF0ZXMsIH5wb3MsIH5yYXRlLmUsIH5yYXRlLmksIH5sYWJlbHMsCiAgMTYsICIyMDIwLTAzLTA4IiwgMTAsIDEwLCAxMCwgIlN1c3BlbnNpb24gb2YgdmlzaXRzIHRvIGhlYWx0aCBmYWNpbGl0aWVzIGFuZCBwcmlzb25zIiwKICAxOCwgIjIwMjAtMDMtMTAiLCAxNSwgMTAsIDEwLCAiU3VzcGVuc2lvbiBvZiBmbGlnaHRzIGZyb20gdGhlIG1vc3QgYWZmZWN0ZWQgYXJlYXMgb2YgSXRhbHkiLAogIDE5LCAiMjAyMC0wMy0xMSIsIDE3LCAxMCwgMTAsICJXSE8gZGVjbGFyZXMgcGFuZGVtaWMiLAogIDIxLCAiMjAyMC0wMy0xMyIsIDIwLCAxMCwgMTAsICJQb3J0dWdhbCBhbGVydCBzdGF0dXMgc3RhdGVtZW50IiwKICAyMSwgIjIwMjAtMDMtMTMiLCAyNSwgMTAsIDEwLCAiQ2xvc2luZyBvZiBtdXNldW1zIiwKICAyMywgIjIwMjAtMDMtMTUiLCAzMCwgMTAsIDEwLCAiUmVzdHJpY3Rpb25zIG9uIGFjY2VzcyB0byBjb21tZXJjaWFsIHNwYWNlcyIsCiAgMjQsICIyMDIwLTAzLTE2IiwgMzUsIDEwLCAxMCwgIlN1c3BlbnNpb24gb2YgY2xhc3NlcyIsCiAgMjQsICIyMDIwLTAzLTE2IiwgNDAsIDEwLCAxMCwgIkNsb3NlIGxhbmQgYm9yZGVycyIsCiAgMjYsICIyMDIwLTAzLTE4IiwgNDUsIDEwLCAxMCwgIkRlY2xhcmF0aW9uIG9mIHN0YXRlIG9mIGVtZXJnZW5jeSIsCiAgNDEsICIyMDIwLTA0LTAyIiwgNTAsIDEwLCAxMCwgIkV4dGVuc2lvbiBvZiB0aGUgc3RhdGUgb2YgZW1lcmdlbmN5IgopCgpldmVudHNbWyIwNDE5Il1dIDwtIHRyaWJibGUoCiAgfmlkeCwgfmRhdGVzLCB+cG9zLCB+cmF0ZS5lLCB+cmF0ZS5pLCB+bGFiZWxzLAogIDE2LCAiMjAyMC0wMy0wOCIsIDEwLCAxNiwgMTAsICJTdXNwZW5zaW9uIG9mIHZpc2l0cyB0byBoZWFsdGggZmFjaWxpdGllcyBhbmQgcHJpc29ucyIsCiAgMTgsICIyMDIwLTAzLTEwIiwgMTUsIDE1LCAxMCwgIlN1c3BlbnNpb24gb2YgZmxpZ2h0cyBmcm9tIHRoZSBtb3N0IGFmZmVjdGVkIGFyZWFzIG9mIEl0YWx5IiwKICAxOSwgIjIwMjAtMDMtMTEiLCAxNywgMTUsIDEwLCAiV0hPIGRlY2xhcmVzIHBhbmRlbWljIiwKICAyMSwgIjIwMjAtMDMtMTMiLCAyMCwgMTAsIDcsICJQb3J0dWdhbCBhbGVydCBzdGF0dXMgc3RhdGVtZW50IiwKICAyMSwgIjIwMjAtMDMtMTMiLCAyNSwgMTAsIDcsICJDbG9zaW5nIG9mIG11c2V1bXMiLAogIDIzLCAiMjAyMC0wMy0xNSIsIDMwLCA3LCA1LCAiUmVzdHJpY3Rpb25zIG9uIGFjY2VzcyB0byBjb21tZXJjaWFsIHNwYWNlcyIsCiAgMjQsICIyMDIwLTAzLTE2IiwgMzUsIDUsIDMsICJTdXNwZW5zaW9uIG9mIGNsYXNzZXMiLAogIDI0LCAiMjAyMC0wMy0xNiIsIDQwLCA1LCAzLCAiQ2xvc2UgbGFuZCBib3JkZXJzIiwKICAyNiwgIjIwMjAtMDMtMTgiLCA0NSwgNSwgMiwgIkRlY2xhcmF0aW9uIG9mIHN0YXRlIG9mIGVtZXJnZW5jeSIsCiAgNDEsICIyMDIwLTA0LTAyIiwgNTAsIDMsIDIsICJFeHRlbnNpb24gb2YgdGhlIHN0YXRlIG9mIGVtZXJnZW5jeSIKKQoKZXZlbnRzW1siMDUwNSJdXSA8LSB0cmliYmxlKAogIH5pZHgsIH5kYXRlcywgfnBvcywgfnJhdGUuZSwgfnJhdGUuaSwgfmxhYmVscywKICAxNiwgIjIwMjAtMDMtMDgiLCAxMCwgMTYsIDEwLCAiU3VzcGVuc2lvbiBvZiB2aXNpdHMgdG8gaGVhbHRoIGZhY2lsaXRpZXMgYW5kIHByaXNvbnMiLAogIDE4LCAiMjAyMC0wMy0xMCIsIDE1LCAxNSwgMTAsICJTdXNwZW5zaW9uIG9mIGZsaWdodHMgZnJvbSB0aGUgbW9zdCBhZmZlY3RlZCBhcmVhcyBvZiBJdGFseSIsCiAgMTksICIyMDIwLTAzLTExIiwgMTcsIDE1LCAxMCwgIldITyBkZWNsYXJlcyBwYW5kZW1pYyIsCiAgMjEsICIyMDIwLTAzLTEzIiwgMjAsIDEwLCA3LCAiUG9ydHVnYWwgYWxlcnQgc3RhdHVzIHN0YXRlbWVudCIsCiAgMjEsICIyMDIwLTAzLTEzIiwgMjUsIDEwLCA3LCAiQ2xvc2luZyBvZiBtdXNldW1zIiwKICAyMywgIjIwMjAtMDMtMTUiLCAzMCwgNywgNSwgIlJlc3RyaWN0aW9ucyBvbiBhY2Nlc3MgdG8gY29tbWVyY2lhbCBzcGFjZXMiLAogIDI0LCAiMjAyMC0wMy0xNiIsIDM1LCA1LCAzLCAiU3VzcGVuc2lvbiBvZiBjbGFzc2VzIiwKICAyNCwgIjIwMjAtMDMtMTYiLCA0MCwgNSwgMywgIkNsb3NlIGxhbmQgYm9yZGVycyIsCiAgMjYsICIyMDIwLTAzLTE4IiwgNDUsIDUsIDIsICJEZWNsYXJhdGlvbiBvZiBTdGF0ZSBvZiBFbWVyZ2VuY3kiLAogIDQxLCAiMjAyMC0wNC0wMiIsIDUwLCAzLCAyLCAiRXh0ZW5zaW9uIG9mIHRoZSBTdGF0ZSBvZiBFbWVyZ2VuY3kiLAogIDczLCAiMjAyMC0wNS0wNCIsIDU1LCA3LCAyLCAiRW5kIG9mIHRoZSBTdGF0ZSBvZiBFbWVyZ2VuY3kiLAogIDc3LCAiMjAyMC0wNS0xNyIsIDU1LCA3LCAyLCAiRXh0ZW5zaW9uIG9mIHRoZSBhbGVydCBzdGF0dXMiCikKCmV2ZW50cyA8LSBldmVudHNbW21dXQoKZXZlbnRzICU+JQogIHNlbGVjdChkYXRlcywgbGFiZWxzLCByYXRlLmUsIHJhdGUuaSkgJT4lCiAgbXV0YXRlKHJhdGUucSA9IHJhdGUuaSAvIDIpICU+JQogIGRpc3RpbmN0KGRhdGVzLCAua2VlcF9hbGwgPSBUUlVFKSAlPiUKICBndCgpICU+JQogIGNvbHNfbGFiZWwoZGF0ZXMgPSBtZCgiKipEYXRlKioiKSwgbGFiZWxzID0gbWQoIioqRXZlbnQqKiIpLCByYXRlLmUgPSBtZCgiKipFLVMqKioiKSwgcmF0ZS5pID0gbWQoIioqSS1TKioqIiksIHJhdGUucSA9IG1kKCIqKlEtUyoqKiIpKSAlPiUKICBmbXRfZGF0ZSh2YXJzKGRhdGVzKSwgZGF0ZV9zdHlsZSA9ICJkYXlfbW9udGgiKSAlPiUKICB0YWJfaGVhZGVyKG1kKCIqKkludGVyYWN0aW9uIHJhdGVzIGJldHdlZW4gY29tcGFydG1lbnRzKioiKSkgJT4lCiAgdGFiX29wdGlvbnModGFibGUud2lkdGggPSBwY3QoODApKQpgYGAKPGNlbnRlcj4mYXN0OyBFbXBpcmljYWwgdmFsdWVzLjwvY2VudGVyPgoKYGBge3IgZXZhbD1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KcmF0ZXMKYGBgCjxici8+PGJyLz48YnIvPgoKYGBge3J9CmFnZXMgPC0gbGlzdCgpCgphZ2VzW1siMDQwOSJdXSA8LSB0cmliYmxlKAogIH5hZ2UsIH5wZXJjZW50LCB+c2V2ZXJpdHksCiAgICAwLCAwLjA4MDM0MDc1MSwgIDEsCiAgICAxLCAwLjEwMzQ0MzM2MywgIDEsCiAgICAyLCAwLjExMTY0MzU5MiwgIDEsCiAgICAzLCAwLjEyMzU0MTcwNiwgIDEsCiAgICA0LCAwLjE1NTEzNDI1NCwgIDEsCiAgICA1LCAwLjE1MzYyMzU4MywgIDEsCiAgICA2LCAwLjEyNzU2NjgwNSwgIDQsCiAgICA3LCAwLjA4NjgzOTk3LCAgIDQsCiAgICA4LCAwLjA1Nzg2NTk3NSwgIDQKKQoKYWdlc1tbIjA0MTkiXV0gPC0gdHJpYmJsZSgKICB+YWdlLCB+cGVyY2VudCwgfnNldmVyaXR5LAogIDAsIDAuMDgwMzQwNzUxLCAxLAogIDEsIDAuMTAzNDQzMzYzLCAxLAogIDIsIDAuMTExNjQzNTkyLCAxLAogIDMsIDAuMTIzNTQxNzA2LCAxLAogIDQsIDAuMTU1MTM0MjU0LCAxLAogIDUsIDAuMTUzNjIzNTgzLCAxLAogIDYsIDAuMTI3NTY2ODA1LCAyLAogIDcsIDAuMDg2ODM5OTcsIDMsCiAgOCwgMC4wNTc4NjU5NzUsIDQKKQoKYWdlc1tbIjA1MDUiXV0gPC0gdHJpYmJsZSgKICB+YWdlLCB+cGVyY2VudCwgfnNldmVyaXR5LAogIDAsIDAuMDgwMzQwNzUxLCAwLjAxLAogIDEsIDAuMTAzNDQzMzYzLCAwLjE1LAogIDIsIDAuMTExNjQzNTkyLCAwLjE1LAogIDMsIDAuMTIzNTQxNzA2LCAwLjE1LAogIDQsIDAuMTU1MTM0MjU0LCAwLjMxLAogIDUsIDAuMTUzNjIzNTgzLCAxLAogIDYsIDAuMTI3NTY2ODA1LCAyLjc3LAogIDcsIDAuMDg2ODM5OTcsIDYuMTUsCiAgOCwgMC4wNTc4NjU5NzUsIDExLjM4CikKCmFnZXMgPC0gYWdlc1tbbV1dCgpncl9ldGFyaW8gPC0gY2FzZXNfZGF0YXNldCAlPiUgZmlsdGVyKGRhdGFfcmVsYXRvcmlvID09IHZlcnNpb25fZGF0ZSkgJT4lIHNlbGVjdChncl9ldGFyaW9fMF85OmdyX2V0YXJpb184MF84OSkKZ3JfZXRhcmlvIDwtIGdyX2V0YXJpbyAlPiUgbXV0YXRlX2FsbCh+KC4pL3N1bShncl9ldGFyaW8pKQpncl9ldGFyaW8gPC0gdChncl9ldGFyaW8pCmFnZXMgPC0gY2JpbmQoYWdlcywgcHJldmFsZW5jZSA9IGdyX2V0YXJpbykKCiMgYXMgb2YgQXByaWwgMTQ6CiMgaHR0cHM6Ly93d3cxLm55Yy5nb3YvYXNzZXRzL2RvaC9kb3dubG9hZHMvcGRmL2ltbS9jb3ZpZC0xOS1kYWlseS1kYXRhLXN1bW1hcnktZGVhdGhzLTA0MTUyMDIwLTEucGRmCmFnZXMgJT4lCiAgbXV0YXRlKGFnZSA9IHBhc3RlMCgiPj0iLCBhZ2UgKiAxMCksIHNldmVyaXR5ID0gcm91bmQoc2V2ZXJpdHkgKiAxLjMgLyAxMDAsIDMpKSAlPiUKICBzZWxlY3QoYWdlLCBwZXJjZW50LCBwcmV2YWxlbmNlLCBzZXZlcml0eSkgJT4lIAogIGd0KCkgJT4lCiAgY29sc19sYWJlbChhZ2UgPSBtZCgiKipBZ2VzKioiKSwgcGVyY2VudCA9IG1kKCIqKlBvcHVsYXRpb24qKiIpLCBwcmV2YWxlbmNlPSBtZCgiKipQcmV2YWxlbmNlKioiKSwgc2V2ZXJpdHkgPSBtZCgiKipGYXRhbGl0eSByYXRlKioqIikpICU+JQogIGZtdF9wZXJjZW50KGNvbHVtbnMgPSBjKCJwZXJjZW50IiwgInByZXZhbGVuY2UiLCAic2V2ZXJpdHkiKSkgJT4lCiAgdGFiX2hlYWRlcihtZCgiKipBZ2UgcHlyYW1pZCBhbmQgZGlzZWFzZSBmYXRhbGl0eSByYXRlKioiKSkgJT4lCiAgdGFiX29wdGlvbnModGFibGUud2lkdGggPSBwY3QoNTApKQpgYGAKPGNlbnRlcj4mYXN0OyBEYXRhIGZyb20gQ2hpbmEgQ0RDW0BkZWF0aF9yYXRlXS48L2NlbnRlcj4KPGJyLz48YnIvPjxici8+CgoKYGBge3Igc2ltdWxhdGlvbiBmdW5jdGlvbiwgaW5jbHVkZT1GQUxTRX0KIyBmdW5jdGlvbiB0byBzZXQtdXAgYW5kIHJ1biB0aGUgYmFzZWxpbmUgc2ltdWxhdGlvbnMKc2ltdWxhdGUgPC0gZnVuY3Rpb24oCiAgICAgICAgICAgICAgICAgICAgICMgY29udHJvbC5pY20gcGFyYW1zCiAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAiU0VJUUhSRiIsCiAgICAgICAgICAgICAgICAgICAgIG5zdGVwcyA9IDM2NiwKICAgICAgICAgICAgICAgICAgICAgbnNpbXMgPSA4LAogICAgICAgICAgICAgICAgICAgICBuY29yZXMgPSAxLAogICAgICAgICAgICAgICAgICAgICBhZ2VzID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgIHByb2cucmFuZCA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICByZWMucmFuZCA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICBmYXQucmFuZCA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgIHF1YXIucmFuZCA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICBob3NwLnJhbmQgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgZGlzY2gucmFuZCA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgIGluZmVjdGlvbi5GVU4gPSBpbmZlY3Rpb24uc2VpcWhyZi5pY20sCiAgICAgICAgICAgICAgICAgICAgIHJlY292ZXJ5LkZVTiA9IHByb2dyZXNzLnNlaXFocmYuaWNtLAogICAgICAgICAgICAgICAgICAgICBkZXBhcnR1cmVzLkZVTiA9IGRlcGFydHVyZXMuc2VpcWhyZi5pY20sCiAgICAgICAgICAgICAgICAgICAgIGFycml2YWxzLkZVTiA9IGFycml2YWxzLmljbSwKICAgICAgICAgICAgICAgICAgICAgZ2V0X3ByZXYuRlVOID0gZ2V0X3ByZXYuc2VpcWhyZi5pY20sCiAgICAgICAgICAgICAgICAgICAgICMgaW5pdC5pY20gcGFyYW1zCiAgICAgICAgICAgICAgICAgICAgIHMubnVtID0gOTk5NywKICAgICAgICAgICAgICAgICAgICAgZS5udW0gPSAwLAogICAgICAgICAgICAgICAgICAgICBpLm51bSA9IDMsCiAgICAgICAgICAgICAgICAgICAgIHEubnVtID0gMCwKICAgICAgICAgICAgICAgICAgICAgaC5udW0gPSAwLAogICAgICAgICAgICAgICAgICAgICByLm51bSA9IDAsCiAgICAgICAgICAgICAgICAgICAgIGYubnVtID0gMCwKICAgICAgICAgICAgICAgICAgICAgIyBwYXJhbS5pY20gcGFyYW1zCiAgICAgICAgICAgICAgICAgICAgIGluZi5wcm9iLmUgPSAwLjAyLAogICAgICAgICAgICAgICAgICAgICBhY3QucmF0ZS5lID0gMTAsCiAgICAgICAgICAgICAgICAgICAgIGluZi5wcm9iLmkgPSAwLjA1LAogICAgICAgICAgICAgICAgICAgICBhY3QucmF0ZS5pID0gMTAsCiAgICAgICAgICAgICAgICAgICAgIGluZi5wcm9iLnEgPSAwLjAyLAogICAgICAgICAgICAgICAgICAgICBhY3QucmF0ZS5xID0gMi41LAogICAgICAgICAgICAgICAgICAgICBxdWFyLnJhdGUgPSAxIC8gMzAsCiAgICAgICAgICAgICAgICAgICAgIGhvc3AucmF0ZSA9IDEgLyAxMDAsCiAgICAgICAgICAgICAgICAgICAgIGRpc2NoLnJhdGUgPSAxIC8gMTUsCiAgICAgICAgICAgICAgICAgICAgIHByb2cucmF0ZSA9IDEgLyAxMCwKICAgICAgICAgICAgICAgICAgICAgcHJvZy5kaXN0LnNjYWxlID0gNSwKICAgICAgICAgICAgICAgICAgICAgcHJvZy5kaXN0LnNoYXBlID0gMS41LAogICAgICAgICAgICAgICAgICAgICByZWMucmF0ZSA9IDEgLyAyMCwKICAgICAgICAgICAgICAgICAgICAgcmVjLmRpc3Quc2NhbGUgPSAzNSwKICAgICAgICAgICAgICAgICAgICAgcmVjLmRpc3Quc2hhcGUgPSAxLjUsCiAgICAgICAgICAgICAgICAgICAgIGZhdC5yYXRlLmJhc2UgPSAxIC8gNTAsCiAgICAgICAgICAgICAgICAgICAgIGhvc3AuY2FwID0gNDAsCiAgICAgICAgICAgICAgICAgICAgIGZhdC5yYXRlLm92ZXJjYXAgPSAxIC8gMjUsCiAgICAgICAgICAgICAgICAgICAgIGZhdC50Y29lZmYgPSAwLjUsCiAgICAgICAgICAgICAgICAgICAgIHZpdGFsID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgYS5yYXRlID0gKDEwLjUgLyAzNjUpIC8gMTAwMCwKICAgICAgICAgICAgICAgICAgICAgYS5wcm9wLmUgPSAwLjAxLAogICAgICAgICAgICAgICAgICAgICBhLnByb3AuaSA9IDAuMDAxLAogICAgICAgICAgICAgICAgICAgICBhLnByb3AucSA9IDAuMDEsCiAgICAgICAgICAgICAgICAgICAgIGRzLnJhdGUgPSAoNyAvIDM2NSkgLyAxMDAwLAogICAgICAgICAgICAgICAgICAgICBkZS5yYXRlID0gKDcgLyAzNjUpIC8gMTAwMCwKICAgICAgICAgICAgICAgICAgICAgZGkucmF0ZSA9ICg3IC8gMzY1KSAvIDEwMDAsCiAgICAgICAgICAgICAgICAgICAgIGRxLnJhdGUgPSAoNyAvIDM2NSkgLyAxMDAwLAogICAgICAgICAgICAgICAgICAgICBkaC5yYXRlID0gKDIwIC8gMzY1KSAvIDEwMDAsCiAgICAgICAgICAgICAgICAgICAgIGRyLnJhdGUgPSAoNyAvIDM2NSkgLyAxMDAwLAogICAgICAgICAgICAgICAgICAgICBvdXQgPSAibWVhbiIpIHsKICBjb250cm9sIDwtIGNvbnRyb2wuaWNtKAogICAgdHlwZSA9IHR5cGUsCiAgICBuc3RlcHMgPSBuc3RlcHMsCiAgICBuc2ltcyA9IG5zaW1zLAogICAgbmNvcmVzID0gbmNvcmVzLAogICAgcHJvZy5yYW5kID0gcHJvZy5yYW5kLAogICAgcmVjLnJhbmQgPSByZWMucmFuZCwKICAgIGluZmVjdGlvbi5GVU4gPSBpbmZlY3Rpb24uRlVOLAogICAgcmVjb3ZlcnkuRlVOID0gcmVjb3ZlcnkuRlVOLAogICAgYXJyaXZhbHMuRlVOID0gYXJyaXZhbHMuRlVOLAogICAgZGVwYXJ0dXJlcy5GVU4gPSBkZXBhcnR1cmVzLkZVTiwKICAgIGdldF9wcmV2LkZVTiA9IGdldF9wcmV2LkZVTiwKICAgIHZlcmJvc2UgPSBUUlVFLAogICAgdmVyYm9zZS5pbnQgPSAxCiAgKQoKICBpbml0IDwtIGluaXQuaWNtKAogICAgcy5udW0gPSBzLm51bSwKICAgIGUubnVtID0gZS5udW0sCiAgICBpLm51bSA9IGkubnVtLAogICAgcS5udW0gPSBxLm51bSwKICAgIGgubnVtID0gaC5udW0sCiAgICByLm51bSA9IHIubnVtLAogICAgZi5udW0gPSBmLm51bQogICkKCiAgcGFyYW0gPC0gcGFyYW0uaWNtKAogICAgaW5mLnByb2IuZSA9IGluZi5wcm9iLmUsCiAgICBhY3QucmF0ZS5lID0gYWN0LnJhdGUuZSwKICAgIGluZi5wcm9iLmkgPSBpbmYucHJvYi5pLAogICAgYWN0LnJhdGUuaSA9IGFjdC5yYXRlLmksCiAgICBpbmYucHJvYi5xID0gaW5mLnByb2IucSwKICAgIGFjdC5yYXRlLnEgPSBhY3QucmF0ZS5xLAogICAgYWdlcyA9IGFnZXMsCiAgICBxdWFyLnJhdGUgPSBxdWFyLnJhdGUsCiAgICBob3NwLnJhdGUgPSBob3NwLnJhdGUsCiAgICBkaXNjaC5yYXRlID0gZGlzY2gucmF0ZSwKICAgIHByb2cucmF0ZSA9IHByb2cucmF0ZSwKICAgIHByb2cuZGlzdC5zY2FsZSA9IHByb2cuZGlzdC5zY2FsZSwKICAgIHByb2cuZGlzdC5zaGFwZSA9IHByb2cuZGlzdC5zaGFwZSwKICAgIHJlYy5yYXRlID0gcmVjLnJhdGUsCiAgICByZWMuZGlzdC5zY2FsZSA9IHJlYy5kaXN0LnNjYWxlLAogICAgcmVjLmRpc3Quc2hhcGUgPSByZWMuZGlzdC5zaGFwZSwKICAgIGZhdC5yYXRlLmJhc2UgPSBmYXQucmF0ZS5iYXNlLAogICAgaG9zcC5jYXAgPSBob3NwLmNhcCwKICAgIGZhdC5yYXRlLm92ZXJjYXAgPSBmYXQucmF0ZS5vdmVyY2FwLAogICAgZmF0LnRjb2VmZiA9IGZhdC50Y29lZmYsCiAgICB2aXRhbCA9IHZpdGFsLAogICAgYS5yYXRlID0gYS5yYXRlLAogICAgYS5wcm9wLmUgPSBhLnByb3AuZSwKICAgIGEucHJvcC5pID0gYS5wcm9wLmksCiAgICBhLnByb3AucSA9IGEucHJvcC5xLAogICAgZHMucmF0ZSA9IGRzLnJhdGUsCiAgICBkZS5yYXRlID0gZGUucmF0ZSwKICAgIGRpLnJhdGUgPSBkaS5yYXRlLAogICAgZHEucmF0ZSA9IGRxLnJhdGUsCiAgICBkaC5yYXRlID0gZGgucmF0ZSwKICAgIGRyLnJhdGUgPSBkci5yYXRlCiAgKQoKICBzaW0gPC0gaWNtLnNlaXFocmYocGFyYW0sIGluaXQsIGNvbnRyb2wpCiAgc2ltX2RmIDwtIGFzLmRhdGEuZnJhbWUoc2ltLCBvdXQgPSBvdXQpCgogIHJldHVybihsaXN0KHNpbSA9IHNpbSwgZGYgPSBzaW1fZGYpKQp9CmBgYAoKYGBge3Igc2ltdWxhdGUsIGluY2x1ZGU9RkFMU0V9CgojIFBPUkRBVEEKcHRfcG9wdWxhdGlvbiA8LSAxMDI2MDg5MyAjIDIwMjAgZXN0CnB0X3BvcHVsYXRpb25fbm9ydGUgPC0gMzU3NDM5NCAjIGVzdCAyMDE5ICoqKioqKiAzNjkwNjgxCnB0X2JpcnRocyA8LSA4NjU1NyAjIDIwMTkKcHRfZGVhdGhzIDwtIDExMjQxMSAjIDIwMTkgKHRyYW5zcGFyZW5jaWEuc25zLmdvdi5wdCkKcHRfZGVhdGhzX25vcnRlIDwtIDM1MjM5ICMgMjAxOCAoaW5lLnB0KQpwdF9ob3NwZGVhdGhzIDwtIDM2NzY2ICMgMjAxOSAodHJhbnNwYXJlbmNpYS5zbnMuZ292LnB0KQpwdF9ob3NwZGVhdGhzX25vcnRlIDwtIDEzMzMxCnB0X2FkbWlzc2lvbnMgPC0gNjYwODM4ICMgMjAxOSAodHJhbnNwYXJlbmNpYS5zbnMuZ292LnB0KQpwdF9hZG1pc3Npb25zX25vcnRlIDwtIDI2Mzk1NQpwdF9iaXJ0aHJhdGUgPC0gcHRfYmlydGhzIC8gcHRfcG9wdWxhdGlvbiAqIDEwMDAgIyA4LjQzNTYyMQpwdF9iaXJ0aHJhdGVfbm9ydGUgPC0gNy43ICMgKioqKioqCnB0X2VtaWdycmF0ZSA8LSA3LjkgIyAyMDE4IGVzdApwdF9kZWF0aHJyYXRlIDwtIHB0X2RlYXRocyAvIHB0X3BvcHVsYXRpb24gKiAxMDAwICMgMTEuMDE3NjYKcHRfZGVhdGhycmF0ZV9ub3J0ZSA8LSBwdF9kZWF0aHNfbm9ydGUgLyBwdF9wb3B1bGF0aW9uX25vcnRlICogMTAwMCAjIDkuODU4NzM0CnB0X2hkZWF0aHJyYXRlIDwtIHB0X2hvc3BkZWF0aHMgLyBwdF9hZG1pc3Npb25zICogMTAwMCAjIDU1LjYzNTQyCnB0X2hkZWF0aHJyYXRlX25vcnRlIDwtIHB0X2hvc3BkZWF0aHNfbm9ydGUgLyBwdF9hZG1pc3Npb25zX25vcnRlICogMTAwMCAjIDUwLjUwNDgyCnB0X2hvc3BjYXAgPC0gNDkyMDAwCgpwb3B1bGF0aW9uIDwtIHB0X3BvcHVsYXRpb25fbm9ydGUKc3RhcnRfaW5mIDwtIDQKaG9zcGNhcCA8LSBwdF9ob3NwY2FwCmJpcnRocmF0ZSA8LSBwdF9iaXJ0aHJhdGVfbm9ydGUKZGVhdGhyYXRlIDwtIHB0X2RlYXRocnJhdGVfbm9ydGUKaGRlYXRocnJhdGUgPC0gcHRfaGRlYXRocnJhdGVfbm9ydGUKc3RlcHMgPC0gMTgwCgpyYXRlLmUgPC0gcmVwKGV2ZW50cyRyYXRlLmVbMV0sIGV2ZW50cyRpZHhbMV0pCnJhdGUuaSA8LSByZXAoZXZlbnRzJHJhdGUuaVsxXSwgZXZlbnRzJGlkeFsxXSkKaWR4X2RpZmYgPC0gYyhkaWZmKGV2ZW50cyRpZHgpLCAoc3RlcHMgLSB0YWlsKGV2ZW50cyRpZHgsIDEpKSkKZm9yIChpIGluIHNlcV9sZW4obnJvdyhldmVudHMpKSkgewogIGlmIChldmVudHMkaWR4W2ldIDwgc3RlcHMpIHsKICAgIHJhdGUuZSA8LSBjKHJhdGUuZSwgcmVwKGV2ZW50cyRyYXRlLmVbaV0sIGlkeF9kaWZmW2ldKSkKICAgIHJhdGUuaSA8LSBjKHJhdGUuaSwgcmVwKGV2ZW50cyRyYXRlLmlbaV0sIGlkeF9kaWZmW2ldKSkKICB9Cn0KCnBhcmFtcyA8LSBsaXN0KAogIHR5cGUgPSAiU0VJUUhSRiIsCiAgbnN0ZXBzID0gc3RlcHMsCiAgbnNpbXMgPSAzMiwKICBuY29yZXMgPSA4LAoKICBhZ2VzID0gYWdlcywKCiAgIyBpbml0LmljbSBwYXJhbXMKICBzLm51bSA9IHBvcHVsYXRpb24sCiAgZS5udW0gPSAwLAogIGkubnVtID0gc3RhcnRfaW5mLAogIHEubnVtID0gMCwKICBoLm51bSA9IDAsCiAgci5udW0gPSAwLAogIGYubnVtID0gMCwKICAjIHBhcmFtLmljbSBwYXJhbXMKICAjCiAgYWN0LnJhdGUuZSA9IHJhdGUuZSwgIyBudW1iZXIgb2YgZXhwb3N1cmUgZXZlbnRzIGJldHdlZW4gRSBhbmQgUy4gT3RoZXJ3aXNlIGFzIGZvciBhY3QucmF0ZS5pLgogIGFjdC5yYXRlLmkgPSByYXRlLmksICMgbnVtYmVyIG9mIGV4cG9zdXJlIGV2ZW50cyBiZXR3ZWVuIEkgYW5kIFMuIEl0J3Mgc3RvY2hhc3RpYywgc28gdGhlIHJhdGUgaXMgYW4gYXZlcmFnZSwgc29tZSBpbmRpdmlkdWFscyBtYXkgaGF2ZSBtb3JlIG9yIGxlc3MuIFJlZHVjaW5nIHRoaXMgcGFyYW1ldGVyIGlzIGVxdWl2YWxlbnQgdG8gaW5jcmVhc2luZyBzb2NpYWwgZGlzdGFuY2luZyBieSBwZW9wbGUgaW4gdGhlIEkgY29tcGFydG1lbnQuCiAgYWN0LnJhdGUucSA9IHJhdGUuaSAvIDIsICMgbnVtYmVyIG9mIGV4cG9zdXJlIGV2ZW50cyBiZXR3ZWVuIFEgYW5kIFMuIE90aGVyd2lzZSBhcyBmb3IgYWN0LnJhdGUuaS4KICBpbmYucHJvYi5lID0gMC4wMiwgIyBQcm9iYWJpbGl0eSBvZiBwYXNzaW5nIG9uIGluZmVjdGlvbiBmcm9tIEUgdG8gUyBhdCBlYWNoIGV4cG9zdXJlIGV2ZW50LiBOb3RlIHRoZSBkZWZhdWx0IGlzIGxvd2VyIHRoYW4gZm9yIGluZi5wcm9iLmkgcmVmbGVjdGluZyB0aGUgcmVkdWNlZCBpbmZlY3Rpdml0eSBvZiBpbmZlY3RlZCBidXQgYXN5bXB0b21hdGljIHBlb3BsZS4gT3RoZXJ3aXNlIGFzIGZvciBpbmYucHJvYi5pCiAgaW5mLnByb2IuaSA9IDAuMDUsICMgUHJvYmFiaWxpdHkgb2YgcGFzc2luZyBvbiBpbmZlY3Rpb24gZnJvbSBJIHRvIFMgYXQgZWFjaCBleHBvc3VyZSBldmVudC4gUmVkdWNpbmcgaW5mLnByb2IuaSBpcyBlcXVpdmFsZW50IHRvIGluY3JlYXNpbmcgaHlnaWVuZSBtZWFzdXJlcy4KICBpbmYucHJvYi5xID0gMC4wMiwgIyBQcm9iYWJpbGl0eSBvZiBwYXNzaW5nIG9uIGluZmVjdGlvbiBmcm9tIFEgdG8gUy4gTm90ZSB0aGUgZGVmYXVsdCBpcyBsb3dlciB0aGFuIGZvciBpbmYucHJvYi5pIHJlZmxlY3RpbmcgdGhlIGdyZWF0ZXIgY2FyZSB0aGF0IHNlbGYtaXNvbGF0ZWQgaW5kaXZpZHVhbHMgd2lsbCwgb24gYXZlcmFnZSwgdGFrZSByZWdhcmRpbmcgaHlnaWVuZSBtZWFzdXJlcywgc3VjaCBhcyB3ZWFyaW5nIG1hc2tzLCB0byBsaW1pdCBzcHJlYWQgdG8gb3RoZXJzLiBPdGhlcndpc2UgYXMgZm9yIGluZi5wcm9iLmkKICAjIyMjIyMjIyMjIyMjCiAgIyMjIyMjIyMjIyMjIwogICMgd2VpYnVsbCBpcyBwcmVmZXJyZWQgaW4gdGhpcyBjYXNlLiBXZWlidWxsIG1vZGVscyBhICJ0aW1lLXRvLWZhaWx1cmUiIGZvciB3aGljaAogICMgIHRoZSBmYWlsdXJlIHJhdGUgaXMgcHJvcG9ydGlvbmFsIHRvIGEgcG93ZXIgb2YgdGltZS4gQSB2YWx1ZSBvZiBrID4gMQogICMgIGluZGljYXRlcyB0aGF0IHRoZSBmYWlsdXJlIHJhdGUgaW5jcmVhc2VzIHdpdGggdGltZS4KICAjICBNZWRpYW4gPSA1IGRheXM7IElRSToKICBwcm9nLnJhbmQgPSBGQUxTRSwgIyBGcm9tIEV4cG9zZWQgdG8gSW5mZWN0ZWQsIEZBTFNFIGlzIFdlaWJ1bGwsIFRSVUUgaXMgYmlub21pYWwKICBwcm9nLnJhdGUgPSAxIC8gMTAsICMgQmlub21pYWwgZGlzdHJpYnV0aW9uLCBvbmx5IGlmIHByb2cucmFuZCBpcyBUUlVFCiAgIyMjIyMgYiAtPiBFeHBvc2VkIHRvIEluZmVjdGVkCiAgcHJvZy5kaXN0LnNjYWxlID0gNSwgIyBXZWlidWxsIGRpc3RyaWJ1dGlvbiwgb25seSBpZiBwcm9nLnJhbmQgaXMgRkFMU0UKICBwcm9nLmRpc3Quc2hhcGUgPSAxLjUsICMgV2VpYnVsbCBkaXN0cmlidXRpb24sIG9ubHkgaWYgcHJvZy5yYW5kIGlzIEZBTFNFCiAgIyMjIyMjIyMjIyMjIwogICMjIyMjIyMjIyMjIyMKICByZWMucmFuZCA9IEZBTFNFLCAjIEZBTFNFIGlzIFdlaWJ1bGwsIFRSVUUgaXMgYmlub21pYWwKICByZWMucmF0ZSA9IDEgLyAyMCwgIyBCaW5vbWlhbAogICMjIyMjIyMgZCwgZywgaCAtPiBJbmZlY3RlZCwgUXVhcmFudGluZSwgSG9zcGl0YWwgdG8gUmVjb3ZlcmVkCiAgcmVjLmRpc3Quc2NhbGUgPSAzNSwgIyBXZWlidWxsCiAgcmVjLmRpc3Quc2hhcGUgPSAxLjUsICMgV2VpYnVsbAogICMjIyMjIyMjIyMjIwogICMjIyMjIyMjIyMjIyBmIC0+IEggdG8gRgogIGZhdC5yYW5kID0gVFJVRSwgIyBUUlVFIGlzIGJpbm9taWFsOyBpZiBGQUxTRSwgcmFuZG9tIHNhbXBsZSB3aXRoIGEgc2FtcGxlCiAgIyBmcmFjdGlvbiBhbHNvIGdpdmVuIGJ5IGZhdC5yYXRlLmJhc2UuIEhvd2V2ZXIsIGlmIHRoZSBjdXJyZW50IG51bWJlciBvZiBwYXRpZW50cwogICMgaW4gdGhlIEggKG5lZWRzIGhvc3BpdGFsaXphdGlvbikgY29tcGFydG1lbnQgaXMgYWJvdmUgYSBob3NwaXRhbCBjYXBhY2l0eSBsZXZlbAogICMgc3BlY2lmaWVkIGJ5IGhvc3AuY2FwLCB0aGVuIHRoZSBmYXRhbGl0eSByYXRlIGlzIHRoZSBtZWFuIG9mIHRoZSBiYXNlIGZhdGFsaXR5CiAgIyByYXRlIHdlaWdodGVkIGJ5IHRoZSBob3NwaXRhbCBjYXBhY2l0eSwgcGx1cyBhIGhpZ2hlciByYXRlLCBzcGVjaWZpZWQgYnkKICAjIGZhdC5yYXRlLm92ZXJjYXAsIHdlaWdodGVkIGJ5IHRoZSBiYWxhbmNlIG9mIHRob3NlIHJlcXVpcmluZyBob3NwaXRhbGl6YXRpb24KICAjIChidXQgd2hvIGNhbid0IGJlIGFjY29tbW9kYXRlZCkuIEJ5IHNldHRpbmcgZmF0LnJhdGUub3ZlcmNhcCBoaWdoZXIsCiAgIyB0aGUgZWZmZWN0IG9mIGV4Y2VlZGluZyB0aGUgY2FwYWNpdHkgb2YgdGhlIGhlYWx0aCBjYXJlIHN5c3RlbSBjYW4gYmUgc2ltdWxhdGVkLgogICMgVGhlcmUgaXMgYWxzbyBhIGNvZWZmaWNpZW50IGZhdC50Y29lZmYgZm9yIHRoZSBmYXRhbGl0eSByYXRlcyB0aGF0IGluY3JlYXNlcwogICMgdGhlbSBhcyBhIGxpbmVhciBmdW5jdGlvbiBvZiB0aGUgbnVtYmVyIG9mIGRheXMgdGhlIGluZGl2aWR1YWwgaGFzIGJlZW4gaW4gdGhlCiAgIyBIIGNvbXBhcnRtZW50LiBVc2Ugb2YgdGhlIGNvLWVmZmljaWVudCBiZXR0ZXIgYXBwcm94aW1hdGVzIHRoZSB0cmFwZXpvaWQgc3Vydml2YWwKICAjIHRpbWUgZGlzdHJpYnV0aW9uIHR5cGljYWwgb2YgSUNVIHBhdGllbnRzLgogIGZhdC5yYXRlLmJhc2UgPSAxLjMgLyAxMDAsICMgMiUgaW4gMTUgZGF5cwogIGZhdC5yYXRlLm92ZXJjYXAgPSAxIC8gMjUsICMgTW9ydGFsaXR5IHJhdGUgb2YgdGhvc2UgbmVlZGluZyBob3NwaXRhbCBidXQgbm8gY2FwYWNpdHkKICBmYXQudGNvZWZmID0gMC41LCAjIFRpbWUgY28tZWZmaWNpZW50IGZvciBpbmNyZWFzaW5nIG1vcnRhbGl0eSByYXRlIGFzIHRpbWUgaW4gdGhlIEggY29tcGFydG1lbnQgaW5jcmVhc2VzIGZvciBlYWNoIGluZGl2aWR1YWwgaW4gaXQuCiAgaG9zcC5jYXAgPSBob3NwY2FwLCAjIDI0MCBVQ0kKICAjIyMjIyMjIyMjIyMjIyMjIwogICMjIyMjIyMjIyMjIyMjIyMjCiAgcXVhci5yYW5kID0gRkFMU0UsICMgaWYgVFJVRSwgYmlub21pYWwsIGlmIEZBTFNFLCByYW5kb20gc2FtcGxlLgogIHF1YXIucmF0ZSA9IDEgLyAzMCwKICAjIyMjIyMjIyMjIyMjIyMjIwogICMjIyMjIyMjIyMjIyMjIyMjCiAgaG9zcC5yYW5kID0gRkFMU0UsICMgaWYgVFJVRSwgYmlub21pYWwsIGlmIEZBTFNFLCByYW5kb20gc2FtcGxlLgogIGhvc3AucmF0ZSA9IDEgLyAxMDAsICMgaSwgZSAtPiBJLFEgdG8gSAogICMjIyMjIyMjIyMjIyMjIyMjCiAgIyMjIyMjIyMjIyMjIyMjIyMKICBkaXNjaC5yYW5kID0gVFJVRSwgIyBJZiBUUlVFLCBiaW5vbWlhbCwgaWYgRkFMU0UsIHJhbmRvbSBzYW1wbGUuCiAgZGlzY2gucmF0ZSA9IDEgLyAxNSwgIyBnIC0+IEggdG8gUgogICMjIyMjIyMjIyMjIyMjIyMjCiAgIyMjIyMjIyMjIyMjIyMjIyMKICAjIEJhY2tncm91bmQgZGVtb2dyYXBoaWMgZGVwYXJ0dXJlIChkZWF0aCBub3QgZHVlIHRvIHZpcnVzKSByYXRlcy4KICAjIERlZmF1bHRzIGJhc2VkIG9uIEF1c3RyYWxpYW4gY3J1ZGUgZGVhdGggcmF0ZXMuCiAgIyBDYW4gYmUgdXNlZCB0byBtb2RlbCBlbWlncmF0aW9uIGFzIHdlbGwgYXMgZGVhdGhzLgogIHZpdGFsID0gVFJVRSwgIyBFbmFibGVzIGRlbW9ncmFwaGljcywgdGhhdCBpcywgYXJyaXZhbHMgYW5kIGRlcGFydHVyZXMsIHRvIGFuZCBmcm9tIHRoZSBzaW11bGF0ZWQgcG9wdWxhdGlvbi4KICAjICgxMC41IC8gMzY1KSAvIDEwMDAsICMgQXJyaXZhbCByYXRlLiBEZWZhdWx0IGlzIGFwcHJveCB0aGUgZGFpbHkgYmlydGggcmF0ZSBvZiBBdXN0cmFsaWEKICBhLnJhdGUgPSAoYmlydGhyYXRlIC8gMzY1KSAvIDEwMDAsCiAgYS5wcm9wLmUgPSAwLjAxLAogIGEucHJvcC5pID0gMC4wMDEsCiAgYS5wcm9wLnEgPSAwLjAxLAogIGRzLnJhdGUgPSAoZGVhdGhyYXRlIC8gMzY1KSAvIDEwMDAsICMgRGVwYXJ0dXJlIHJhdGUgKGRlYXRoIG5vdCBieSB2aXJ1cykKICBkZS5yYXRlID0gKGRlYXRocmF0ZSAvIDM2NSkgLyAxMDAwLAogIGRpLnJhdGUgPSAoZGVhdGhyYXRlIC8gMzY1KSAvIDEwMDAsCiAgZHEucmF0ZSA9IChkZWF0aHJhdGUgLyAzNjUpIC8gMTAwMCwKICBkaC5yYXRlID0gKGhkZWF0aHJyYXRlIC8gMzY1KSAvIDEwMDAsCiAgZHIucmF0ZSA9IChkZWF0aHJhdGUgLyAzNjUpIC8gMTAwMCwKICAjIyMjIyMjIyMjIyMjIyMjIwogICMgU3VtbWFyeSBmdW5jdGlvbiBmb3IgdGhlIHNpbXVsYXRpb24gcnVucy4gbWVkaWFuIGlzIGFsc28gYXZhaWxhYmxlLCBvciBwZXJjZW50aWxlcywgc2VlIHRoZSBFcGlNb2RlbCBkb2N1bWVudGF0aW9uLgogIG91dCA9ICJtZWFuIgopCgojIHNldC5zZWVkKDEpICMjIHNlZWQgd2FzIG1vdmVkIHRvIHRoZSBleHRlbnNpb24gY29kZSwgYmVjYXVzZSBtdWx0aXRocmVhZCBicmVha3MgaXQuCiMgYmFzZWxpbmVfc2ltIDwtIGRvLmNhbGwoInNpbXVsYXRlIiwgcGFyYW1zKQpgYGAKCiMjIERpc3RyaWJ1dGlvbiBvZiBkdXJhdGlvbiBpbiBrZXkgY29tcGFydG1lbnRzCgpgYGB7ciBnZXQgdGltZXMsIGV2YWw9RkFMU0UsIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTEwLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQojIGRlZmluZSBhIGZ1bmN0aW9uIHRvIGV4dHJhY3QgdGltaW5ncyBhbmQgYXNzZW1ibGUgYSBkYXRhIGZyYW1lCmdldF90aW1lcyA8LSBmdW5jdGlvbihzaW11bGF0ZV9yZXN1bHRzKSB7CiAgc2ltIDwtIHNpbXVsYXRlX3Jlc3VsdHMkc2ltCgogIGZvciAocyBpbiAxOnNpbSRjb250cm9sJG5zaW1zKSB7CiAgICBpZiAocyA9PSAxKSB7CiAgICAgIHRpbWVzIDwtIHNpbSR0aW1lc1tbcGFzdGUoInNpbSIsIHMsIHNlcCA9ICIiKV1dCiAgICAgIHRpbWVzIDwtIHRpbWVzICU+JSBtdXRhdGUocyA9IHMpCiAgICB9IGVsc2UgewogICAgICB0aW1lcyA8LSB0aW1lcyAlPiUKICAgICAgICBiaW5kX3Jvd3Moc2ltJHRpbWVzW1twYXN0ZSgic2ltIiwgcywgc2VwID0gIiIpXV0gJT4lCiAgICAgICAgICBtdXRhdGUocyA9IHMpKQogICAgfQogICAgZ2MoKQogIH0KCiAgdGltZXMgPC0gdGltZXMgJT4lCiAgICBtdXRhdGUoCiAgICAgIGluZlRpbWUgPSBpZmVsc2UoaW5mVGltZSA8IDAsIC01LCBpbmZUaW1lKSwKICAgICAgZXhwVGltZSA9IGlmZWxzZShleHBUaW1lIDwgMCwgLTUsIGV4cFRpbWUpCiAgICApCiAgZ2MoKQogIHRpbWVzIDwtIHRpbWVzICU+JSBtdXRhdGUoCiAgICBpbmN1YmF0aW9uX3BlcmlvZCA9IGluZlRpbWUgLSBleHBUaW1lLAogICAgaWxsbmVzc19kdXJhdGlvbiA9IHJlY292VGltZSAtIGV4cFRpbWUsCiAgICBpbGxuZXNzX2R1cmF0aW9uX2hvc3AgPSBkaXNjaFRpbWUgLSBleHBUaW1lLAogICAgaG9zcF9sb3MgPSBkaXNjaFRpbWUgLSBob3NwVGltZSwKICAgIHF1YXJhbnRpbmVfZGVsYXkgPSBxdWFyVGltZSAtIGluZlRpbWUsCiAgICBzdXJ2aXZhbF90aW1lID0gZmF0VGltZSAtIGluZlRpbWUKICApCiAgZ2MoKQogIHRpbWVzIDwtIHRpbWVzICU+JSBzZWxlY3QoCiAgICBzLAogICAgaW5jdWJhdGlvbl9wZXJpb2QsCiAgICBxdWFyYW50aW5lX2RlbGF5LAogICAgaWxsbmVzc19kdXJhdGlvbiwKICAgIGlsbG5lc3NfZHVyYXRpb25faG9zcCwKICAgIGhvc3BfbG9zLAogICAgc3Vydml2YWxfdGltZQogICkKICBnYygpCgogICMjIG1vc3QgbWVtb3J5IGludGVuc2l2ZSBwYXJ0CiAgIyB0aW1lcyA8LSBwaXZvdF9sb25nZXIodGltZXMsIC1zLAogICMgICBuYW1lc190byA9ICJwZXJpb2RfdHlwZSIsCiAgIyAgIHZhbHVlc190byA9ICJkdXJhdGlvbiIKICAjICkKICAjIGdhdGhlcigpIGlzIG1vcmUgZWZmaWNpZW50CiAgdGltZXMgPC0gdGltZXMgJT4lIGdhdGhlcihwZXJpb2RfdHlwZSwgZHVyYXRpb24sIC1zKSAlPiUKICBmaWx0ZXIoZHVyYXRpb24gPD0gMzApICU+JQogIG11dGF0ZShwZXJpb2RfdHlwZSA9IGZhY3RvcihwZXJpb2RfdHlwZSwKICAgIGxldmVscyA9IGMoCiAgICAgICJpbmN1YmF0aW9uX3BlcmlvZCIsCiAgICAgICJpbGxuZXNzX2R1cmF0aW9uIiwKICAgICAgImhvc3BfbG9zIiwKICAgICAgImlsbG5lc3NfZHVyYXRpb25faG9zcCIsCiAgICAgICJxdWFyYW50aW5lX2RlbGF5IiwKICAgICAgInN1cnZpdmFsX3RpbWUiCiAgICApLAogICAgbGFiZWxzID0gYygKICAgICAgIkluY3ViYXRpb24iLAogICAgICAiSWxsbmVzcyIsCiAgICAgICJIb3NwaXRhbCBjYXJlIHJlcXVpcmVkIiwKICAgICAgIklsbG5lc3MgKGhvc3ApIiwKICAgICAgIkRlbGF5IGVudGVyaW5nIGlzb2xhdGlvbiIsCiAgICAgICJTdXJ2aXZhbCB0aW1lIChmYXRhbGl0aWVzKSIKICAgICkKICApKSAlPiUKICBhcnJhbmdlKHBlcmlvZF90eXBlKSAlPiUKICBhZGRfY291bnQocGVyaW9kX3R5cGUsIGR1cmF0aW9uKSAlPiUKICBkaXN0aW5jdChwZXJpb2RfdHlwZSwgZHVyYXRpb24sIG4pICU+JQogIGdyb3VwX2J5KHBlcmlvZF90eXBlLCAuZHJvcCA9IEZBTFNFKSAlPiUKICBtdXRhdGUobiA9IG4gLyBzdW0obikpICU+JQogIHVuZ3JvdXAoKQogIGdjKCkKCiAgcmV0dXJuKHRpbWVzKQp9CgpwbG90X3RpbWVzIDwtIGdldF90aW1lcyhiYXNlbGluZV9zaW0pCgpmaWcgPC0gcGxvdF9seShwbG90X3RpbWVzLAogIHggPSB+ZHVyYXRpb24sIHkgPSB+biwgY29sb3JzID0gIkRhcmsyIiwKICBjb2xvciA9IH5wZXJpb2RfdHlwZSwKICB5YXhpcyA9IH4gcGFzdGUwKCJ5IiwgYXMubnVtZXJpYyhwZXJpb2RfdHlwZSkpLCB0eXBlID0gImJhciIKKQpmaWcgPC0gZmlnICU+JSBsYXlvdXQoCiAgdGl0bGUgPSAiRHVyYXRpb24gZnJlcXVlbmN5IGRpc3RyaWJ1dGlvbnMgaW4gUG9ydHVnYWwgLSBOb3J0aCIsCiAgcGFwZXJfYmdjb2xvciA9ICJyZ2IoMjU1LDI1NSwyNTUpIiwgcGxvdF9iZ2NvbG9yID0gInJnYigyMjksMjI5LDIyOSkiLAogIHhheGlzID0gbGlzdCgKICAgIHRpdGxlID0gIkRheXMiLAogICAgZ3JpZGNvbG9yID0gInJnYigyNTUsMjU1LDI1NSkiLAogICAgc2hvd2dyaWQgPSBUUlVFLAogICAgc2hvd2xpbmUgPSBGQUxTRSwKICAgIHNob3d0aWNrbGFiZWxzID0gVFJVRSwKICAgIHRpY2tjb2xvciA9ICJyZ2IoMTI3LDEyNywxMjcpIiwKICAgIHRpY2tzID0gIm91dHNpZGUiLAogICAgemVyb2xpbmUgPSBGQUxTRQogICksCiAgeWF4aXMgPSBsaXN0KAogICAgdGl0bGUgPSAiRGVuc2l0eSIsCiAgICBncmlkY29sb3IgPSAicmdiKDI1NSwyNTUsMjU1KSIsCiAgICBzaG93Z3JpZCA9IFRSVUUsCiAgICBzaG93bGluZSA9IEZBTFNFLAogICAgc2hvd3RpY2tsYWJlbHMgPSBUUlVFLAogICAgdGlja2NvbG9yID0gInJnYigxMjcsMTI3LDEyNykiLAogICAgdGlja3MgPSAib3V0c2lkZSIsCiAgICByYW5nZSA9IGMoMCwgbWF4KHBsb3RfdGltZXMkbikgKiAxLjA1KSwKICAgIHplcm9saW5lID0gRkFMU0UKICApCikKZmlnIDwtIGZpZyAlPiUgc3VicGxvdChucm93cyA9IDMsIHNoYXJlWCA9IFRSVUUsIHNoYXJlWSA9IFRSVUUpCmZpZyAgJT4lIGFkZF9hbm5vdGF0aW9ucygKICAgIHg9MSwKICAgIHk9MSwKICAgIHhyZWYgPSAicGFwZXIiLAogICAgeXJlZiA9ICJwYXBlciIsCiAgICBhbGlnbiA9ICJyaWdodCIsCiAgICB0ZXh0ID0gcGFzdGUoIlNpbXVsYXRlZCBvbiIsIHZlcnNpb25fZGF0ZSksCiAgICB4YW5jaG9yID0gJ3JpZ2h0JywKICAgIHNob3dhcnJvdyA9IEYKICApCmBgYAoKIyMgQmFzZWxpbmUgUHJldmFsZW5jZQoKIyMjIE92ZXJhbGwgLSBJbnRlcmFjdGl2ZSBQbG90CgpgYGB7ciBiYXNlbGluZSBwbG90LCBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD0xMCwgd2FybmluZz1GQUxTRX0KcGxvdF9seV9zaXIoYmFzZWxpbmVfc2ltLCBjKCJlLm51bSIsICJpLm51bSIsICJxLm51bSIsICJoLm51bSIsICJmLm51bSIsICJyLm51bSIpLCBldmVudHMgPSBldmVudHMpICAlPiUgYWRkX2Fubm90YXRpb25zKAogICAgeD0xLAogICAgeT0xLAogICAgeHJlZiA9ICJwYXBlciIsCiAgICB5cmVmID0gInBhcGVyIiwKICAgIGFsaWduID0gInJpZ2h0IiwKICAgIHRleHQgPSBwYXN0ZSgiU2ltdWxhdGVkIG9uIiwgdmVyc2lvbl9kYXRlKSwKICAgIHhhbmNob3IgPSAncmlnaHQnLAogICAgc2hvd2Fycm93ID0gRgogICkKYGBgCgojIyMgQ29tcGFyaXNvbiB3aXRoIHJlYWwgZGF0YSAtIEludGVyYWN0aXZlIFBsb3QKCmBgYHtyIHNpbXVsYXRlMiwgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgpwbG90X2x5X3NpcihiYXNlbGluZV9zaW0sIGMoImYubnVtIiwgImgubnVtIiwgImkubnVtIiwgInEubnVtIiwgImUubnVtIiwgInIubnVtIiksIHN0YWNrZWQgPSBUUlVFLCBncm91cGVkID0gVFJVRSwgcmVhbF9kYXRhID0gZ2VvX25vcnRlLCBldmVudHMgPSBldmVudHMsIGxvZyA9IFRSVUUpICU+JSBhZGRfYW5ub3RhdGlvbnMoCiAgICB4PTEsCiAgICB5PTEsCiAgICB4cmVmID0gInBhcGVyIiwKICAgIHlyZWYgPSAicGFwZXIiLAogICAgYWxpZ24gPSAicmlnaHQiLAogICAgdGV4dCA9IHBhc3RlKCJTaW11bGF0ZWQgb24iLCB2ZXJzaW9uX2RhdGUpLAogICAgeGFuY2hvciA9ICdyaWdodCcsCiAgICBzaG93YXJyb3cgPSBGCiAgKQpgYGAKCiMjIyBCYXNpYyByZXByb2R1Y3Rpb24gbnVtYmVyICRSX3swfSQKCmBgYHtyIGJhc2VsaW5lIFIwLCBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD0xMCwgd2FybmluZz1GQUxTRX0KIyBnZXQgdGhlIFMtPiBFIGNvbXBhcnRtZW50IGZsb3csIHdoaWNoIGlzCiMgb3VyIGRhaWx5IGluY2lkZW5jZSByYXRlCmluY2lkZW5jZV9jb3VudHMgPC0gYmFzZWxpbmVfc2ltJGRmICU+JQogIHNlbGVjdCh0aW1lLCBzZS5mbG93KQojIHVuY291bnQgdGhlbQppbmNpZGVudF9jYXNlX2RhdGVzIDwtIGluY2lkZW5jZV9jb3VudHMgJT4lCiAgdW5jb3VudChzZS5mbG93KSAlPiUKICBwdWxsKHRpbWUpCmluY2lkZW50X2Nhc2VfZGF0ZXMgPC0gYXMuRGF0ZSgiMjAyMC0wMi0yOCIpICsgaW5jaWRlbnRfY2FzZV9kYXRlcwojIGNvbnZlcnQgdG8gYW4gaW5jaWRlbmNlIG9iamVjdAppbmNpZGVuY2VfYWxsIDwtIGFzLmRhdGEuZnJhbWUoaW5jaWRlbmNlKGluY2lkZW50X2Nhc2VfZGF0ZXMpKQoKZmlnIDwtIHBsb3RfbHkoaW5jaWRlbmNlX2FsbCwgeCA9IH5kYXRlcywgeSA9IH5jb3VudHMsIHR5cGUgPSAiYmFyIikgJT4lIGFkZF9hbm5vdGF0aW9ucygKICAgIHg9MSwKICAgIHk9MSwKICAgIHhyZWYgPSAicGFwZXIiLAogICAgeXJlZiA9ICJwYXBlciIsCiAgICBhbGlnbiA9ICJyaWdodCIsCiAgICB0ZXh0ID0gcGFzdGUoIlNpbXVsYXRlZCBvbiIsIHZlcnNpb25fZGF0ZSksCiAgICB4YW5jaG9yID0gJ3JpZ2h0JywKICAgIHNob3dhcnJvdyA9IEYKICApCgpmaWcgPC0gZmlnICU+JSBsYXlvdXQoCiAgdGl0bGUgPSBwYXN0ZTAoIkRhaWx5IGluY2lkZW5jZSBpbiBQb3J0dWdhbCAtIE5vcnRoIiksCiAgcGFwZXJfYmdjb2xvciA9ICJyZ2IoMjU1LDI1NSwyNTUpIiwgcGxvdF9iZ2NvbG9yID0gInJnYigyMjksMjI5LDIyOSkiLAogIHhheGlzID0gbGlzdCgKICAgIHRpdGxlID0gIkRhdGUiLAogICAgZ3JpZGNvbG9yID0gInJnYigyNTUsMjU1LDI1NSkiLAogICAgc2hvd2dyaWQgPSBUUlVFLAogICAgc2hvd2xpbmUgPSBGQUxTRSwKICAgIHNob3d0aWNrbGFiZWxzID0gVFJVRSwKICAgIHRpY2tjb2xvciA9ICJyZ2IoMTI3LDEyNywxMjcpIiwKICAgIHRpY2tzID0gIm91dHNpZGUiLAogICAgemVyb2xpbmUgPSBGQUxTRQogICksCiAgeWF4aXMgPSBsaXN0KAogICAgdGl0bGUgPSAiQ2FzZXMiLAogICAgZ3JpZGNvbG9yID0gInJnYigyNTUsMjU1LDI1NSkiLAogICAgc2hvd2dyaWQgPSBUUlVFLAogICAgc2hvd2xpbmUgPSBGQUxTRSwKICAgIHNob3d0aWNrbGFiZWxzID0gVFJVRSwKICAgIHRpY2tjb2xvciA9ICJyZ2IoMTI3LDEyNywxMjcpIiwKICAgIHRpY2tzID0gIm91dHNpZGUiLAogICAgemVyb2xpbmUgPSBGQUxTRQogICkKKQpmaWcKYGBgCgoKYGBge3IgbWVzc2FnZT1GQUxTRSwgZmlnLmhlaWdodD01LCBmaWcud2lkdGg9MTAsIHdhcm5pbmc9RkFMU0V9CiMgZmluZCB0aGUgcGVhayBvZiB0aGUgZXBpZGVtaWMgY3VydmUKcGVha19vZl9lcGlkZW1pY19jdXJ2ZSA8LSBmaW5kX3BlYWsoaW5jaWRlbmNlKGluY2lkZW50X2Nhc2VfZGF0ZXMpKQoKaW5jaWRlbmNlX2dyb3d0aF9waGFzZSA8LSBpbmNpZGVuY2UoaW5jaWRlbnRfY2FzZV9kYXRlcywgbGFzdF9kYXRlID0gcGVha19vZl9lcGlkZW1pY19jdXJ2ZSkKIyBzcGVjaWZ5IHNlcmlhbCBpbnRlcnZhbCBtZWFuIGFuZCBTRAojIHNpbmNlIHRoZSBsYXN0IGJsb2cgcG9zdCBuZXcgc3R1ZGllcyBoYXZlIGFwcGVhcmVkCiMgc3VnZ2VzdGluZyA0LjUgaXMgYSBiZXR0ZXIgbWVhbiBmb3IgdGhlIFNJCnNpX21lYW4gPC0gNC41CnNpX3NkIDwtIDMuNAoKIyBnZXQgYSBzZXQgb2YgTUxFIGVzdGltYXRlcyBmb3IgUjAgYW5kIHBsb3QKc21vb3RoX2l0IDwtIGxvd2VzcyhpbmNpZGVuY2VfZ3Jvd3RoX3BoYXNlJGNvdW50cywgZiA9IDAuNikkeQpzbW9vdGhfaXQgPC0gc21vb3RoX2l0IC0gbWluKHNtb290aF9pdCkKcmVzIDwtIGdldF9SKHNtb290aF9pdCwgc2lfbWVhbiA9IHNpX21lYW4sIHNpX3NkID0gc2lfc2QpCgpmaWcgPC0gcGxvdF9seSh4ID0gfiByZXMkUl9ncmlkLCB5ID0gfiByZXMkUl9saWtlKSAlPiUgYWRkX2xpbmVzKCkgJT4lIGFkZF9hbm5vdGF0aW9ucygKICAgIHg9MSwKICAgIHk9MSwKICAgIHhyZWYgPSAicGFwZXIiLAogICAgeXJlZiA9ICJwYXBlciIsCiAgICBhbGlnbiA9ICJyaWdodCIsCiAgICB0ZXh0ID0gcGFzdGUoIlNpbXVsYXRlZCBvbiIsIHZlcnNpb25fZGF0ZSksCiAgICB4YW5jaG9yID0gJ3JpZ2h0JywKICAgIHNob3dhcnJvdyA9IEYKICApCgpmaWcgPC0gZmlnICU+JSBsYXlvdXQoCiAgdGl0bGUgPSAiTGlrZWxpaG9vZCBkaXN0cmlidXRpb24gb2YgUiIsCiAgcGFwZXJfYmdjb2xvciA9ICJyZ2IoMjU1LDI1NSwyNTUpIiwgcGxvdF9iZ2NvbG9yID0gInJnYigyMjksMjI5LDIyOSkiLAogIHhheGlzID0gbGlzdCgKICAgIHRpdGxlID0gIlJlcHJvZHVjdGlvbiBOdW1iZXIgKFIpIiwKICAgIGdyaWRjb2xvciA9ICJyZ2IoMjU1LDI1NSwyNTUpIiwKICAgIHNob3dncmlkID0gVFJVRSwKICAgIHNob3dsaW5lID0gRkFMU0UsCiAgICBzaG93dGlja2xhYmVscyA9IFRSVUUsCiAgICB0aWNrY29sb3IgPSAicmdiKDEyNywxMjcsMTI3KSIsCiAgICB0aWNrcyA9ICJvdXRzaWRlIiwKICAgIHplcm9saW5lID0gRkFMU0UKICApLAogIHlheGlzID0gbGlzdCgKICAgIHRpdGxlID0gIkxpa2VsaWhvb2QiLAogICAgZ3JpZGNvbG9yID0gInJnYigyNTUsMjU1LDI1NSkiLAogICAgc2hvd2dyaWQgPSBUUlVFLAogICAgc2hvd2xpbmUgPSBGQUxTRSwKICAgIHNob3d0aWNrbGFiZWxzID0gVFJVRSwKICAgIHRpY2tjb2xvciA9ICJyZ2IoMTI3LDEyNywxMjcpIiwKICAgIHRpY2tzID0gIm91dHNpZGUiLAogICAgemVyb2xpbmUgPSBGQUxTRQogICkKKQpmaWcKc2FtcGxlIDwtIGVhcmx5Ujo6c2FtcGxlX1IocmVzLCAxMDAwMCkKY2F0KHBhc3RlMCgiRXN0aW1hdGVkIFIgaXMgIiwgcm91bmQobWVhbihzYW1wbGUpLCAyKSwgIiAowrEiLCByb3VuZCgyICogc2Qoc2FtcGxlKSwgMiksICIpIikpCmBgYAoKYGBge3IgUnQsIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9MywgZmlnLndpZHRoPTEwLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgNS42ICggNC43IC0gNi45ICkgaHR0cHM6Ly93d3cuYW5tc3AucHQvY292aWQxOS1tYXBhCiMgMC43ICggMC43IC0gMC44ICkKc2lfbWVhbiA8LSA1LjYKc2lfbWVhbl9zZCA8LSAwLjUKc2lfc2QgPC0gMi4zCnNpX3NkX3NkIDwtIDAuNQoKZXN0IDwtIGVzdGltYXRlX1IoaW5jaWRlbmNlKGluY2lkZW50X2Nhc2VfZGF0ZXMsIGxhc3RfZGF0ZSA9IHRvZGF5KCkgKyAyKSwKICBtZXRob2QgPSAidW5jZXJ0YWluX3NpIiwKICBjb25maWcgPSBtYWtlX2NvbmZpZyhsaXN0KAogICAgbWVhbl9zaSA9IHNpX21lYW4sCiAgICBzdGRfbWVhbl9zaSA9IHNpX21lYW5fc2QsCiAgICBtaW5fbWVhbl9zaSA9IHNpX21lYW4gLSAyICogc2lfbWVhbl9zZCwgbWF4X21lYW5fc2kgPSBzaV9tZWFuICsgMiAqIHNpX21lYW5fc2QsCiAgICBzdGRfc2kgPSBzaV9zZCwKICAgIHN0ZF9zdGRfc2kgPSBzaV9zZF9zZCwKICAgIG1pbl9zdGRfc2kgPSBzaV9zZCAtIDIgKiBzaV9zZF9zZCwgbWF4X3N0ZF9zaSA9IHNpX3NkICsgMiAqIHNpX3NkX3NkLAogICAgbjEgPSAxMDAsIG4yID0gMTAwLAogICAgc2VlZCA9IDEKICApKQopCgpnZ3Bsb3RseShwbG90KGVzdCwgIlIiKSkgJT4lIGFkZF9hbm5vdGF0aW9ucygKICAgIHg9MSwKICAgIHk9MSwKICAgIHhyZWYgPSAicGFwZXIiLAogICAgeXJlZiA9ICJwYXBlciIsCiAgICBhbGlnbiA9ICJyaWdodCIsCiAgICB0ZXh0ID0gcGFzdGUoIlNpbXVsYXRlZCBvbiIsIHZlcnNpb25fZGF0ZSksCiAgICB4YW5jaG9yID0gJ3JpZ2h0JywKICAgIHNob3dhcnJvdyA9IEYKICApCmdncGxvdGx5KHBsb3QoZXN0LCAiU0kiKSkgJT4lIGFkZF9hbm5vdGF0aW9ucygKICAgIHg9MSwKICAgIHk9MSwKICAgIHhyZWYgPSAicGFwZXIiLAogICAgeXJlZiA9ICJwYXBlciIsCiAgICBhbGlnbiA9ICJyaWdodCIsCiAgICB0ZXh0ID0gcGFzdGUoIlNpbXVsYXRlZCBvbiIsIHZlcnNpb25fZGF0ZSksCiAgICB4YW5jaG9yID0gJ3JpZ2h0JywKICAgIHNob3dhcnJvdyA9IEYKICApCgojIFNMID0gYyg1LCA5LCA3LCAzLCA3LCA4LCAxLCAzLCA3LCA5LCAxMikKIyAKIyBzaV9kYXRhX3d1aGFuX0xpIDwtIGRhdGEuZnJhbWUoRUwgPSBhcy5pbnRlZ2VyKHJlcCgwLCAxMSkpLCBFUiA9IGFzLmludGVnZXIocmVwKDEsIAojICAgICAxMSkpLCBTTCA9IGFzLmludGVnZXIoU0wpLCBTUiA9IGFzLmludGVnZXIoU0wgKyAxKSkKIyAKIyAjIyBmaXhpbmcgdGhlIHJhbmRvbSBzZWVkcwojIE1DTUNfc2VlZCA8LSAxCiMgb3ZlcmFsbF9zZWVkIDwtIDIKIyBkaXN0IDwtICJHIiAjIGZpdHRpbmcgYSBHYW1tYSBkaXN0cmlidXRpb24gZm9yIHRoZSBTSQojIGh1YmVpX3Jlc19lbXBpcmljYWxfc2kgPC0gZXN0aW1hdGVfUihpbmNpZGVuY2UoaW5jaWRlbnRfY2FzZV9kYXRlcyksCiMgICBtZXRob2QgPSAic2lfZnJvbV9kYXRhIiwKIyAgIHNpX2RhdGEgPSBzaV9kYXRhX3d1aGFuX0xpLAojICAgY29uZmlnID0gbWFrZV9jb25maWcobGlzdCgKIyAgICAgc2lfcGFyYW1ldHJpY19kaXN0ciA9IGRpc3QsCiMgICAgIG1jbWNfY29udHJvbCA9IG1ha2VfbWNtY19jb250cm9sKHNlZWQgPSBNQ01DX3NlZWQsIGJ1cm5pbiA9IDEwMDApLAojICAgICBzZWVkID0gb3ZlcmFsbF9zZWVkLAojICAgICBuMSA9IDUwLAojICAgICBuMiA9IDUwCiMgICApKQojICkKIyAKIyBwbG90KGh1YmVpX3Jlc19lbXBpcmljYWxfc2kpCmBgYAoKCgojIFJ1bm5pbmcgaW50ZXJ2ZW50aW9uIGV4cGVyaW1lbnRzCgpXb3JrIGluIHByb2dyZXNzLi4uCgojIyBFbmQgb2YgU3RhdGUgb2YgRW1lcmdlbmN5CgpGaXJzdCBTY2VuYXJpbyAocGVzc2ltaXN0aWMpOgoKIC0gRS1TLCBJLVMsIFEtUyBhcmUgc2V0IGJhY2sgdG8gTWFyY2gsIDE1CgpgYGB7ciBzaW11bGF0ZTMsIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTEwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIGludGVydmVudGlvbl9zaW0gPC0gZG8uY2FsbCgic2ltdWxhdGUiLCBwYXJhbXMpCiMKcGxvdF9seV9zaXIoaW50ZXJ2ZW50aW9uX3NpbSwgYygiZS5udW0iLCAiaS5udW0iLCAicS5udW0iLCAiaC5udW0iLCAiZi5udW0iLCAici5udW0iKSwgZXZlbnRzID0gZXZlbnRzKSAgJT4lIGFkZF9hbm5vdGF0aW9ucygKICAgIHg9MSwKICAgIHk9MSwKICAgIHhyZWYgPSAicGFwZXIiLAogICAgeXJlZiA9ICJwYXBlciIsCiAgICBhbGlnbiA9ICJyaWdodCIsCiAgICB0ZXh0ID0gcGFzdGUoIlNjZW5hcmlvIDEgLSBTaW11bGF0ZWQgb24iLCB2ZXJzaW9uX2RhdGUpLAogICAgeGFuY2hvciA9ICdyaWdodCcsCiAgICBzaG93YXJyb3cgPSBGCiAgKQojCnBsb3RfbHlfc2lyKGludGVydmVudGlvbl9zaW0sIGMoImYubnVtIiwgImgubnVtIiwgImkubnVtIiwgInEubnVtIiwgImUubnVtIiwgInIubnVtIiksIHN0YWNrZWQgPSBUUlVFLCBncm91cGVkID0gVFJVRSwgcmVhbF9kYXRhID0gZ2VvX25vcnRlLCBldmVudHMgPSBldmVudHMsIGxvZyA9IFRSVUUpICU+JSBhZGRfYW5ub3RhdGlvbnMoCiAgICB4PTEsCiAgICB5PTEsCiAgICB4cmVmID0gInBhcGVyIiwKICAgIHlyZWYgPSAicGFwZXIiLAogICAgYWxpZ24gPSAicmlnaHQiLAogICAgdGV4dCA9IHBhc3RlKCJTY2VuYXJpbyAxIC0gU2ltdWxhdGVkIG9uIiwgdmVyc2lvbl9kYXRlKSwKICAgIHhhbmNob3IgPSAncmlnaHQnLAogICAgc2hvd2Fycm93ID0gRgogICkKYGBgCgpTZWNvbmQgU2NlbmFyaW8gKG9wdGltaXN0aWMpOgoKIC0gRS1TLCBpcyBzZXQgYmFjayB0byBNYXJjaCwgMTUuIEktUyBhbmQgUS1TIHN0aWxsIHVuZGVyIGNvbnRyb2wuCgpgYGB7ciBzaW11bGF0ZTQsIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTEwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIGludGVydmVudGlvbl9zaW0yIDwtIGRvLmNhbGwoInNpbXVsYXRlIiwgcGFyYW1zKQpwbG90X2x5X3NpcihpbnRlcnZlbnRpb25fc2ltMiwgYygiZS5udW0iLCAiaS5udW0iLCAicS5udW0iLCAiaC5udW0iLCAiZi5udW0iLCAici5udW0iKSwgZXZlbnRzID0gZXZlbnRzKSAgJT4lIGFkZF9hbm5vdGF0aW9ucygKICAgIHg9MSwKICAgIHk9MSwKICAgIHhyZWYgPSAicGFwZXIiLAogICAgeXJlZiA9ICJwYXBlciIsCiAgICBhbGlnbiA9ICJyaWdodCIsCiAgICB0ZXh0ID0gcGFzdGUoIlNjZW5hcmlvIDIgLSBTaW11bGF0ZWQgb24iLCB2ZXJzaW9uX2RhdGUpLAogICAgeGFuY2hvciA9ICdyaWdodCcsCiAgICBzaG93YXJyb3cgPSBGCiAgKQoKcGxvdF9seV9zaXIoaW50ZXJ2ZW50aW9uX3NpbTIsIGMoImYubnVtIiwgImgubnVtIiwgImkubnVtIiwgInEubnVtIiwgImUubnVtIiwgInIubnVtIiksIHN0YWNrZWQgPSBUUlVFLCBncm91cGVkID0gVFJVRSwgcmVhbF9kYXRhID0gZ2VvX25vcnRlLCBldmVudHMgPSBldmVudHMsIGxvZyA9IFRSVUUpICU+JSBhZGRfYW5ub3RhdGlvbnMoCiAgICB4PTEsCiAgICB5PTEsCiAgICB4cmVmID0gInBhcGVyIiwKICAgIHlyZWYgPSAicGFwZXIiLAogICAgYWxpZ24gPSAicmlnaHQiLAogICAgdGV4dCA9IHBhc3RlKCJTY2VuYXJpbyAyIC0gU2ltdWxhdGVkIG9uIiwgdmVyc2lvbl9kYXRlKSwKICAgIHhhbmNob3IgPSAncmlnaHQnLAogICAgc2hvd2Fycm93ID0gRgogICkKYGBgCgojIEFja25vd2xlZGdlbWVudHMKClRoZXNlIHNpbXVsYXRpb25zIGFyZSBoZWF2aWx5IGJhc2VkIG9uIFRpbSBDaHVyY2hlcycgY29kZSwgYXZhaWxhYmxlIFtoZXJlXShodHRwczovL3RpbWNodXJjaGVzLmdpdGh1Yi5pby9ibG9nLykuCgo8ZGl2IGlkPSJkaXNxdXNfdGhyZWFkIj48L2Rpdj4KPHNjcmlwdD4KCi8qKgoqICBSRUNPTU1FTkRFRCBDT05GSUdVUkFUSU9OIFZBUklBQkxFUzogRURJVCBBTkQgVU5DT01NRU5UIFRIRSBTRUNUSU9OIEJFTE9XIFRPIElOU0VSVCBEWU5BTUlDIFZBTFVFUyBGUk9NIFlPVVIgUExBVEZPUk0gT1IgQ01TLgoqICBMRUFSTiBXSFkgREVGSU5JTkcgVEhFU0UgVkFSSUFCTEVTIElTIElNUE9SVEFOVDogaHR0cHM6Ly9kaXNxdXMuY29tL2FkbWluL3VuaXZlcnNhbGNvZGUvI2NvbmZpZ3VyYXRpb24tdmFyaWFibGVzKi8KLyoKdmFyIGRpc3F1c19jb25maWcgPSBmdW5jdGlvbiAoKSB7CnRoaXMucGFnZS51cmwgPSBQQUdFX1VSTDsgIC8vIFJlcGxhY2UgUEFHRV9VUkwgd2l0aCB5b3VyIHBhZ2UncyBjYW5vbmljYWwgVVJMIHZhcmlhYmxlCnRoaXMucGFnZS5pZGVudGlmaWVyID0gUEFHRV9JREVOVElGSUVSOyAvLyBSZXBsYWNlIFBBR0VfSURFTlRJRklFUiB3aXRoIHlvdXIgcGFnZSdzIHVuaXF1ZSBpZGVudGlmaWVyIHZhcmlhYmxlCn07CiovCihmdW5jdGlvbigpIHsgLy8gRE9OJ1QgRURJVCBCRUxPVyBUSElTIExJTkUKdmFyIGQgPSBkb2N1bWVudCwgcyA9IGQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7CnMuc3JjID0gJ2h0dHBzOi8vZnJhbnotcnB1YnMuZGlzcXVzLmNvbS9lbWJlZC5qcyc7CnMuc2V0QXR0cmlidXRlKCdkYXRhLXRpbWVzdGFtcCcsICtuZXcgRGF0ZSgpKTsKKGQuaGVhZCB8fCBkLmJvZHkpLmFwcGVuZENoaWxkKHMpOwp9KSgpOwo8L3NjcmlwdD4KPG5vc2NyaXB0PlBsZWFzZSBlbmFibGUgSmF2YVNjcmlwdCB0byB2aWV3IHRoZSA8YSBocmVmPSJodHRwczovL2Rpc3F1cy5jb20vP3JlZl9ub3NjcmlwdCI+Y29tbWVudHMgcG93ZXJlZCBieSBEaXNxdXMuPC9hPjwvbm9zY3JpcHQ+Cg==