Repo

Reference Phabricator tickets

Current update

  • Complete datasets as of 2021/09/30.

Feedback.

  • Feedback should be send to goran.milovanovic_ext@wikimedia.de.

Summary

In this Report we consider the data on (a) the number of Wikidata active editors (separately in the items namespace and all namespaces), and (b) the number of Wikidata edits (also taken separately in the items namespace and all namespaces). We analyse the data from 2020/09 to 2021/08.

We contrast the data for the countries belonging to the Global North and Global South, following the Brandt Line as the operational defition of the regions.

The most important findings are:

  • On the level of Global North vs Global South comparison, the contributions to Wikidata from the countries of the Global North overally suprass those made on behalf of editors from the countries in the Global South.

  • On the fine-grained, per-country analyses, however, we show that the Global South has a more positive dynamics in terms of their contributions to Wikidata: a higher percent of countries in the Global South is expanding the extent of their contributions, while a higher percent of countries in the Global North is narrowing the extent of their contributions to Wikidata. This finding was replicated for the number of active editors as well as for the number of edits made from 2020/09 to 2021/08, across all namespaces as well as in the items namespace (NS:0) separately. The analysis of the dynamics of the Wikidata contributions from the Global North and Global South show that the Global South was more agile in the time span of this analysis (2020/09 - 2021/08).

  • In our analysis we were able to identify a number of countries whose extent of contribution to Wikidata could be considered as critical in a sense of showing a negative dynamics over the time span (2020/09 - 2021/08) considered in this Report; those countries are singled out in the respective tables.

0. Data Acquisiton

NOTE A. The Data Acquisition code is not fully reproducible from this Report. The data are collected by running the WD_GlobalSouth_202109.R script from WMF Analytics Client(s), collecting the data as .csv files from the WMF Data Lake.

NOTE B. The countries from the WMF Country Protection List were removed from the datasets.

1. Active Editors

1.1 Active Editors Dataset

The Active Editors dataset presents data on the number of active editors per country. The datasets encompasses the following fields:

  • id - the observation ID
  • country_code - the country ISO 3166 alpha-2 code
  • month - the observation year and month in the YYYY-MM format
  • active_editors - number of active editors expressed in intervals: 1-10, 11-20, 21-30, 31-40, 41-50, 51-60, 61-70, 71-80, 81-90, 91-100, > 100
  • active_editors_ns0 - number of active editors in the content namespaces (NS:0) expressed in intervals: 1-10, 11-20, 21-30, 31-40, 41-50, 51-60, 61-70, 71-80, 81-90, 91-100, > 100

In the next step, we enrich the Active Editors dataset by adding (a) country names, and (b) including information on Global North/Global South classification (see List of countries by regional classification). The Brandt Line was used to establish the Global North vs Global South dichotomy in cases not immediately evident from the data.

1.2 Active Editors Analysis

We find a total of 184 countries in the analysis, of which 62 belong to the Global North and 122 to the Global South.

1.2.1 Active Editor Classes

The following chart shows the percent of countries in the Global North and Global South, in each month from September 2020 to August 2021, which were found in the respective categories of user activity:

The contrast is obvious: consistently over time, most of the countries in the Global North maintain > 100 active editors monthly, while most of the countries in the Global South maintain 1 - 10. As it can be seen from the left panel in the chart, the runner-up class of active editors in Global North are the countries that maintain 1 - 10 editors monthly.

The following chart shows the same data except for now we consider only editors active in the items namespace (NS:0).

As we can see, the result is (qualitatively, and almost fully) replicated when looking into the items namespace only.

1.2.2 Average Active Editors Rank

The active editors classes - 1-10, 11-20, 21-30, 31-40, 41-50, 51-60, 61-70, 71-80, 81-90, 91-100, > 100 - can be described as active editors ranks by assigning the rank of 11 to > 100, 10 to 91-100, 9 to 81-90, .., 1 to 1-10. The following chart depicts the change of the average active editors rank with time for the countries of the Global North and Global South.

We can see how the countries of Global South have a lower average active editors rank, consistently in time. In the following chart we replicate the finding considering edits in the items namespace (NS:0) only.

1.2.2 Editor Activity Monthly Change Index

1.2.2.1 In all namespaces

Looking at each country over time, we can track the change in its editor activity in the following way. For example, a country that was in the > 100 active editors category in September 2020 and in the 90 - 100 active editors category in October 2020 has changed its active editors rank for -1. Vice versa, the country that moved from 90 - 100 to > 100 has changed for +1; the country that moved from 1 - 10 to 41 - 50 has changed for +3, etc. In the following chart we take the average monthly change - as described - per month, and contrast Global North vs Global South over time.

There is no obvious pattern in the average rank of active editors class for either Global North or Global South countries. Both Global North and Global South countries show similar osculations over time in that respect, and thus it cannot be said that the Global South countries exhibit a pattern of positive change in that respect from this data alone.

However, we have noticed large variations across countries in their change in the average rank of active editors class over time. A per-country, finer-grain analysis shows the following results:

    1. Some countries of the Global South exhibited the highest (positive) change in average rank of active editors class in the previous 12 months (from 2020/09 to 2021/08, the time span of this analysis);
    1. Also, some other countries of the Global South are positioned at the very bottom of the list in that respect; finally,
    1. Most of the countries encompassed by this analysis tend to have a zero change of average rank of active editors classes.

The per-country data are given in the following table:

If we split the countries into (a) those with the positive change in average rank of active editors class, (b) those with the negative change in average rank of active editors class, and (c) those with the zero change in average rank of active editors class, and cross-tabulate that information with Global North vs Global South, we find out that 16.95% of countries in the Global North and 13.54% of countries in the Global South had an overall negative change in the previous twelve months, while 5.09% of countries in the Global North and 23.96% of countries in the Global South had an overall positive change in the previous twelve months.

We can conclude that a large percent (23.96%) of the countries in the Global South were expanding the extent of their contributions to Wikidata, in general, but also that not a small percent of them (13.54%) were contributing less and less in general. Taking the perspective of the Global South, the contributions from the following countries seem to be critical in a way; all of them had a negative change in the average rank of active editors class from 2020/09 to 2021/08:

We now repeat the whole Editor Activity Monthly Change Index analysis for editor activity in the items namespace (NS:0).

1.2.2.2 In items (NS:0) namespace only

In the following chart we take the average monthly change - as described - per month, and contrast Global North vs Global South over time, for active editors in the items (NS:0) namespace only.

Again, no obvious pattern emerges from the analysis of the aggregated data. Now we take a dive into the per-country analysis.

The per-country data are given in the following table:

Again, split the countries into (a) those with the positive change in average rank of active editors class, (b) those with the negative change in average rank of active editors class, and (c) those with the zero change in average rank of active editors class, and cross-tabulate that information with Global North vs Global South:

The results in the items namespace are quite similar to those from all namespaces. The list of countries in the Global South with the highest negative change in the average rank of active editors class from 2020/09 to 2021/08 in the items (NS:0) namespace follows.

2. Edits

2.1 Edits Dataset

The Edits dataset presents data on the number of revisions made per country. The datasets encompasses the following fields:

  • id - the observation ID
  • country_code - the country ISO 3166 alpha-2 code
  • month - the observation year and month in the YYYY-MM format
  • edits - number of active editors expressed in intervals: 1-100, 101-200, 201-300, 301-400, 401-500, 501-600, 601-700, 701-800, 801-900, 901-1000, > 1000
  • edits_ns0 - number of active editors in the content namespaces (NS:0) expressed in intervals: 1-100, 101-200, 201-300, 301-400, 401-500, 501-600, 601-700, 701-800, 801-900, 901-1000, > 1000

In the next step, we enrich the Editors dataset by adding (a) country names, and (b) including information on Global North/Global South classification (see List of countries by regional classification). The Brandt Line was used to establish the Global North vs Global South dichotomy in cases not immediately evident from the data.

2.2 Edits Analysis

We find a total of 184 countries in the analysis, of which 62 belong to the Global North and 122 to the Global South.

2.2.1 Edit Classes

The following chart shows the percent of countries in the Global North and Global South, in each month from September 2020 to August 2021, which were found in the respective edit categories:

The result qualitatively replicates the finding obtained from the respective analysis of active editor classes.

The following chart shows the same data except for now we consider only edits made in the items namespace (NS:0).

As we can see, the result is (qualitatively, and almost fully) replicated when looking into the items namespace only.

2.2.2 Average Edits Rank

The analysis follows the same logic as explained in section 1.2.2 except for the difference in the intervals used for the edit classes.

In the following chart we replicate the finding considering edits in the items namespace (NS:0) only.

2.2.2 Editor Activity Monthly Change Index

2.2.2.1 In all namespaces

Again, the analysis follows the same logic is exemplified in the respective analysis of the active editors data.

Again, no obvious pattern is present in the analysis of aggregate data. We take a look at per-country data now:

Now we split the countries into (a) those with the positive change in average rank of active editors class, (b) those with the negative change in average rank of active editors class, and (c) those with the zero change in average rank of active editors class, and cross-tabulate that information with Global North vs Global South:

Taking the perspective of the Global South, the contributions from the following countries seem to be critical in a way; all of them had a negative change in the average rank of edit class from 2020/09 to 2021/08:

We now repeat the whole Edits Monthly Change Index analysis for edits in the items namespace (NS:0).

2.2.2.2 In items (NS:0) namespace only

In the following chart we take the average monthly change - as described - per month, and contrast Global North vs Global South over time, for active editors in the items (NS:0) namespace only.

Again, no obvious pattern emerges from the analysis of the aggregated data. The per-country data are given in the following table:

Again, split the countries into (a) those with the positive change in average rank of active editors class, (b) those with the negative change in average rank of active editors class, and (c) those with the zero change in average rank of active editors class, and cross-tabulate that information with Global North vs Global South:

The results in the items namespace are quite similar to those from all namespaces. The list of countries in the Global South with the highest negative change in the average rank of edit class from 2020/09 to 2021/08 in the items (NS:0) namespace follows.

LS0tCnRpdGxlOiAnV2lraWRhdGEgUmV2aXNpb25zOiBHbG9iYWwgU291dGggUmVwb3J0JwphdXRob3I6ICJHb3JhbiBTLiBNaWxvdmFub3ZpYywgRGF0YSBTY2llbnRpc3QsIFdNREUiCmRhdGU6ICJPY3RvYmVyIDEzLCAyMDIxIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIGNvZGVfZm9sZGluZzogaGlkZQogICAgdGhlbWU6IGNvc21vCiAgICB0b2M6IHllcwogICAgdG9jX2Zsb2F0OiB5ZXMKICAgIHRvY19kZXB0aDogNQogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiA1Ci0tLQoKKipSZXBvKiogCgotIFtXRF9HbG9iYWxTb3V0aF8yMDIxMDldKGh0dHBzOi8vZ2l0aHViLmNvbS93aWtpbWVkaWEvYW5hbHl0aWNzLXdtZGUtV0QtV2lraWRhdGFBZEhvY0FuYWx5dGljcy90cmVlL21hc3Rlci9XRF9HbG9iYWxTb3V0aF8yMDIxMDkpCgoqKlJlZmVyZW5jZSBQaGFicmljYXRvciB0aWNrZXRzKiogCgotIFtUMjkxMTcwIC0gR2xvYmFsIFNvdXRoIENvbnRyaWJ1dGlvbnMgdG8gV2lraWRhdGEKXShodHRwczovL3BoYWJyaWNhdG9yLndpa2ltZWRpYS5vcmcvVDI5MTE3MCkKCi0gW1QyOTExODYgLSBQcml2YWN5IFBvbGljeSBSZXZpZXcgZm9yIEdsb2JhbCBTb3V0aCBXaWtpZGF0YSBlZGl0cyBhbmQgYWN0aXZlIGVkaXRvcnMgZGF0YXNldHMKXShodHRwczovL3BoYWJyaWNhdG9yLndpa2ltZWRpYS5vcmcvVDI5MTE4NikKCioqQ3VycmVudCB1cGRhdGUqKiAKCi0gQ29tcGxldGUgZGF0YXNldHMgYXMgb2YgMjAyMS8wOS8zMC4KCioqRmVlZGJhY2suKiogCgotIEZlZWRiYWNrIHNob3VsZCBiZSBzZW5kIHRvIGBnb3Jhbi5taWxvdmFub3ZpY19leHRAd2lraW1lZGlhLmRlYC4gCgojIyBTdW1tYXJ5CgpJbiB0aGlzIFJlcG9ydCB3ZSBjb25zaWRlciB0aGUgZGF0YSBvbiAoYSkgdGhlIG51bWJlciBvZiBXaWtpZGF0YSBhY3RpdmUgZWRpdG9ycyAoc2VwYXJhdGVseSBpbiB0aGUgaXRlbXMgbmFtZXNwYWNlIGFuZCBhbGwgbmFtZXNwYWNlcyksIGFuZCAoYikgdGhlIG51bWJlciBvZiBXaWtpZGF0YSBlZGl0cyAoYWxzbyB0YWtlbiBzZXBhcmF0ZWx5IGluIHRoZSBpdGVtcyBuYW1lc3BhY2UgYW5kIGFsbCBuYW1lc3BhY2VzKS4gV2UgYW5hbHlzZSB0aGUgZGF0YSBmcm9tIDIwMjAvMDkgdG8gMjAyMS8wOC4KCldlIGNvbnRyYXN0IHRoZSBkYXRhIGZvciB0aGUgY291bnRyaWVzIGJlbG9uZ2luZyB0byB0aGUgR2xvYmFsIE5vcnRoIGFuZCBHbG9iYWwgU291dGgsIGZvbGxvd2luZyB0aGUgW0JyYW5kdCBMaW5lXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CcmFuZHRfUmVwb3J0I1RoZV9CcmFuZHRfTGluZSkgYXMgdGhlIG9wZXJhdGlvbmFsIGRlZml0aW9uIG9mIHRoZSByZWdpb25zLgoKKipUaGUgbW9zdCBpbXBvcnRhbnQgZmluZGluZ3MgYXJlOioqCgotIE9uIHRoZSBsZXZlbCBvZiBHbG9iYWwgTm9ydGggdnMgR2xvYmFsIFNvdXRoIGNvbXBhcmlzb24sICoqdGhlIGNvbnRyaWJ1dGlvbnMgdG8gV2lraWRhdGEgZnJvbSB0aGUgY291bnRyaWVzIG9mIHRoZSBHbG9iYWwgTm9ydGggb3ZlcmFsbHkgc3VwcmFzcyB0aG9zZSBtYWRlIG9uIGJlaGFsZiBvZiBlZGl0b3JzIGZyb20gdGhlIGNvdW50cmllcyBpbiB0aGUgR2xvYmFsIFNvdXRoKiouCgotIE9uIHRoZSAqKmZpbmUtZ3JhaW5lZCwgcGVyLWNvdW50cnkgYW5hbHlzZXMqKiwgaG93ZXZlciwgd2Ugc2hvdyB0aGF0ICoqdGhlIEdsb2JhbCBTb3V0aCBoYXMgYSBtb3JlIHBvc2l0aXZlIGR5bmFtaWNzIGluIHRlcm1zIG9mIHRoZWlyIGNvbnRyaWJ1dGlvbnMgdG8gV2lraWRhdGEqKjogYSBoaWdoZXIgcGVyY2VudCBvZiBjb3VudHJpZXMgaW4gdGhlIEdsb2JhbCBTb3V0aCBpcyBleHBhbmRpbmcgdGhlIGV4dGVudCBvZiB0aGVpciBjb250cmlidXRpb25zLCB3aGlsZSBhIGhpZ2hlciBwZXJjZW50IG9mIGNvdW50cmllcyBpbiB0aGUgR2xvYmFsIE5vcnRoIGlzIG5hcnJvd2luZyB0aGUgZXh0ZW50IG9mIHRoZWlyIGNvbnRyaWJ1dGlvbnMgdG8gV2lraWRhdGEuIFRoaXMgZmluZGluZyB3YXMgcmVwbGljYXRlZCBmb3IgdGhlIG51bWJlciBvZiBhY3RpdmUgZWRpdG9ycyBhcyB3ZWxsIGFzIGZvciB0aGUgbnVtYmVyIG9mIGVkaXRzIG1hZGUgZnJvbSAyMDIwLzA5IHRvIDIwMjEvMDgsIGFjcm9zcyBhbGwgbmFtZXNwYWNlcyBhcyB3ZWxsIGFzIGluIHRoZSBpdGVtcyBuYW1lc3BhY2UgKE5TOjApIHNlcGFyYXRlbHkuIFRoZSBhbmFseXNpcyBvZiB0aGUgZHluYW1pY3Mgb2YgdGhlIFdpa2lkYXRhIGNvbnRyaWJ1dGlvbnMgZnJvbSB0aGUgR2xvYmFsIE5vcnRoIGFuZCBHbG9iYWwgU291dGggc2hvdyB0aGF0ICoqdGhlIEdsb2JhbCBTb3V0aCB3YXMgbW9yZSBhZ2lsZSoqIGluIHRoZSB0aW1lIHNwYW4gb2YgdGhpcyBhbmFseXNpcyAoMjAyMC8wOSAtIDIwMjEvMDgpLgoKLSBJbiBvdXIgYW5hbHlzaXMgd2Ugd2VyZSBhYmxlICoqdG8gaWRlbnRpZnkgYSBudW1iZXIgb2YgY291bnRyaWVzIHdob3NlIGV4dGVudCBvZiBjb250cmlidXRpb24gdG8gV2lraWRhdGEgY291bGQgYmUgY29uc2lkZXJlZCBhcyBjcml0aWNhbCoqIGluIGEgc2Vuc2Ugb2Ygc2hvd2luZyBhIG5lZ2F0aXZlIGR5bmFtaWNzIG92ZXIgdGhlIHRpbWUgc3BhbiAoMjAyMC8wOSAtIDIwMjEvMDgpIGNvbnNpZGVyZWQgaW4gdGhpcyBSZXBvcnQ7IHRob3NlIGNvdW50cmllcyBhcmUgc2luZ2xlZCBvdXQgaW4gdGhlIHJlc3BlY3RpdmUgdGFibGVzLiAKCmBgYHtyLCBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCByZXN1bHRzID0gJ2hpZGUnfQojICFkaWFnbm9zdGljcyBvZmYKIyMjIC0tLSBTZXR1cApTeXMuc2V0ZW52KGBfUl9TM19NRVRIT0RfUkVHSVNUUkFUSU9OX05PVEVfT1ZFUldSSVRFU19gID0gImZhbHNlIikKa25pdHI6Om9wdHNfY2h1bmskc2V0KGZpZy53aWR0aCA9IDE1LCBmaWcuaGVpZ2h0ID0gOCkgCmtuaXRyOjpvcHRzX2NodW5rJHNldCh3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSkgCmxpYnJhcnkodGlkeXZlcnNlKQpvcHRpb25zKGRwbHlyLnN1bW1hcmlzZS5pbmZvcm0gPSBGQUxTRSkKZlBhdGggPC0gcGFzdGUwKGdldHdkKCksICIvIikKYW5hbHl0aWNzRGlyIDwtIHBhc3RlMChmUGF0aCwgIl9hbmFseXRpY3MvIikKYGBgCgoKIyMgMC4gRGF0YSBBY3F1aXNpdG9uCgoqKk5PVEUgQS4qKiBUaGUgRGF0YSBBY3F1aXNpdGlvbiBjb2RlIGlzIG5vdCBmdWxseSByZXByb2R1Y2libGUgZnJvbSB0aGlzIFJlcG9ydC4gVGhlIGRhdGEgYXJlIGNvbGxlY3RlZCBieSBydW5uaW5nIHRoZSBbV0RfR2xvYmFsU291dGhfMjAyMTA5LlJdKGh0dHBzOi8vZ2l0aHViLmNvbS93aWtpbWVkaWEvYW5hbHl0aWNzLXdtZGUtV0QtV2lraWRhdGFBZEhvY0FuYWx5dGljcy9ibG9iL21hc3Rlci9XRF9HbG9iYWxTb3V0aF8yMDIxMDkvV0RfR2xvYmFsU291dGhfMjAyMTA5LlIpIHNjcmlwdCBmcm9tIFdNRiBBbmFseXRpY3MgQ2xpZW50KHMpLCBjb2xsZWN0aW5nIHRoZSBkYXRhIGFzIGAuY3N2YCBmaWxlcyBmcm9tIHRoZSBbV01GIERhdGEgTGFrZV0oaHR0cHM6Ly93aWtpdGVjaC53aWtpbWVkaWEub3JnL3dpa2kvQW5hbHl0aWNzL0RhdGFfTGFrZSkuCgoqKk5PVEUgQi4qKiBUaGUgY291bnRyaWVzIGZyb20gdGhlIFtXTUYgQ291bnRyeSBQcm90ZWN0aW9uIExpc3RdKGh0dHBzOi8vd2lraXRlY2gud2lraW1lZGlhLm9yZy93aWtpL0FuYWx5dGljcy9EYXRhX0xha2UvRWRpdHMvR2VvZWRpdG9ycy9QdWJsaWMjQ291bnRyeV9Qcm90ZWN0aW9uX0xpc3QpIHdlcmUgcmVtb3ZlZCBmcm9tIHRoZSBkYXRhc2V0cy4KCmBgYHtyLCBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQpmaWxlbmFtZXMgPC0gbGlzdC5maWxlcyhhbmFseXRpY3NEaXIpCmVkaXRvcnNfZmlsZW5hbWUgPC0gZmlsZW5hbWVzW3doaWNoKGdyZXBsKCJlZGl0b3JzIiwgZmlsZW5hbWVzKSldCnJldmlzaW9uc19maWxlbmFtZSA8LSBmaWxlbmFtZXNbd2hpY2goZ3JlcGwoImVkaXRzIiwgZmlsZW5hbWVzKSldCmBgYAoKCiMjIDEuIEFjdGl2ZSBFZGl0b3JzCgojIyMgMS4xIEFjdGl2ZSBFZGl0b3JzIERhdGFzZXQKClRoZSAqKkFjdGl2ZSBFZGl0b3JzKiogZGF0YXNldCBwcmVzZW50cyBkYXRhIG9uIHRoZSBudW1iZXIgb2YgYWN0aXZlIGVkaXRvcnMgcGVyIGNvdW50cnkuClRoZSBkYXRhc2V0cyBlbmNvbXBhc3NlcyB0aGUgZm9sbG93aW5nIGZpZWxkczoKCi0gKippZCoqIC0gdGhlIG9ic2VydmF0aW9uIElECi0gKipjb3VudHJ5X2NvZGUqKiAtIHRoZSBjb3VudHJ5IElTTyAzMTY2IGFscGhhLTIgY29kZQotICoqbW9udGgqKiAtIHRoZSBvYnNlcnZhdGlvbiB5ZWFyIGFuZCBtb250aCBpbiB0aGUgYFlZWVktTU1gIGZvcm1hdAotICoqYWN0aXZlX2VkaXRvcnMqKiAtIG51bWJlciBvZiBhY3RpdmUgZWRpdG9ycyBleHByZXNzZWQgaW4gaW50ZXJ2YWxzOiBgMS0xMGAsIGAxMS0yMGAsIGAyMS0zMGAsIGAzMS00MGAsIGA0MS01MGAsIGA1MS02MGAsIGA2MS03MGAsIGA3MS04MGAsIGA4MS05MGAsIGA5MS0xMDBgLCBgPiAxMDBgCi0gKiphY3RpdmVfZWRpdG9yc19uczAqKiAtIG51bWJlciBvZiBhY3RpdmUgZWRpdG9ycyBpbiB0aGUgY29udGVudCBuYW1lc3BhY2VzIChOUzowKSBleHByZXNzZWQgaW4gaW50ZXJ2YWxzOiBgMS0xMGAsIGAxMS0yMGAsIGAyMS0zMGAsIGAzMS00MGAsIGA0MS01MGAsIGA1MS02MGAsIGA2MS03MGAsIGA3MS04MGAsIGA4MS05MGAsIGA5MS0xMDBgLCBgPiAxMDBgCgpgYGB7ciwgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0KZGF0YV9zZXQgPC0gcmVhZHI6OnJlYWRfY3N2KHBhc3RlMChhbmFseXRpY3NEaXIsIGVkaXRvcnNfZmlsZW5hbWUpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbF90eXBlcyA9IGNvbHMoKSkKY29sbmFtZXMoZGF0YV9zZXQpWzFdIDwtICJpZCIKRFQ6OmRhdGF0YWJsZShkYXRhX3NldCkKYGBgCkluIHRoZSBuZXh0IHN0ZXAsIHdlIGVucmljaCB0aGUgKipBY3RpdmUgRWRpdG9ycyoqIGRhdGFzZXQgYnkgYWRkaW5nIChhKSBjb3VudHJ5IG5hbWVzLCBhbmQgKGIpIGluY2x1ZGluZyBpbmZvcm1hdGlvbiBvbiBHbG9iYWwgTm9ydGgvR2xvYmFsIFNvdXRoIGNsYXNzaWZpY2F0aW9uIChzZWUgW0xpc3Qgb2YgY291bnRyaWVzIGJ5IHJlZ2lvbmFsIGNsYXNzaWZpY2F0aW9uXShodHRwczovL21ldGEud2lraW1lZGlhLm9yZy93aWtpL0xpc3Rfb2ZfY291bnRyaWVzX2J5X3JlZ2lvbmFsX2NsYXNzaWZpY2F0aW9uKSkuIFRoZSBbQnJhbmR0IExpbmVdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JyYW5kdF9SZXBvcnQjVGhlX0JyYW5kdF9MaW5lKSB3YXMgdXNlZCB0byBlc3RhYmxpc2ggdGhlIEdsb2JhbCBOb3J0aCB2cyBHbG9iYWwgU291dGggZGljaG90b215IGluIGNhc2VzIG5vdCBpbW1lZGlhdGVseSBldmlkZW50IGZyb20gdGhlIGRhdGEuCgpgYGB7ciwgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0KIyAtIHNjcmFwZSBNZXRhOiBMaXN0IG9mIGNvdW50cmllcyBieSByZWdpb25hbCBjbGFzc2lmaWNhdGlvbiAKdXJsIDwtICdodHRwczovL21ldGEud2lraW1lZGlhLm9yZy93aWtpL0xpc3Rfb2ZfY291bnRyaWVzX2J5X3JlZ2lvbmFsX2NsYXNzaWZpY2F0aW9uJwpnc25fbGlzdCA8LSBodG1sdGFiOjpodG1sdGFiKHVybCwgMSkKIyAtIGxvYWQgSVNPY29kZXM6OklTT18zMTY2XzEKaXNvX2NvZGVzIDwtIElTT2NvZGVzOjpJU09fMzE2Nl8xCmlzb19jb2RlcyA8LSBpc29fY29kZXMgJT4lIAogIGRwbHlyOjpzZWxlY3QoQWxwaGFfMiwgTmFtZSkKIyAtIGpvaW4gY291bnRyeSBuYW1lcwpkYXRhX3NldCA8LSBkYXRhX3NldCAlPiUgCiAgZHBseXI6OmxlZnRfam9pbihpc29fY29kZXMsIAogICAgICAgICAgICAgICAgICAgYnkgPSBjKCJjb3VudHJ5X2NvZGUiID0gIkFscGhhXzIiKSkKY29sbmFtZXMoZGF0YV9zZXQpWzZdIDwtICJjb3VudHJ5X25hbWUiCiMgLSBDb3VudHJ5IG5hbWUgZm9yIEtvc292byAoYWxwaGEtMiBpcyAieGsiKSAKIyAtIGlzIG5vdCBmb3VuZCBpbiBJU09jb2Rlczo6SVNPXzMxNjZfMSwgZml4Ogp3IDwtIHdoaWNoKGlzLm5hKGRhdGFfc2V0JGNvdW50cnlfbmFtZSkpCmRhdGFfc2V0JGNvdW50cnlfbmFtZVt3XSA8LSAiS29zb3ZvIgojIC0gam9pbiBHbG9iYWwgTm9ydGgvR2xvYmFsIFNvdXRoCmRhdGFfc2V0IDwtIGRhdGFfc2V0ICU+JSAKICBkcGx5cjo6bGVmdF9qb2luKGdzbl9saXN0LCAKICAgICAgICAgICAgICAgICAgIGJ5ID0gYygiY291bnRyeV9uYW1lIiA9ICJDb3VudHJ5IikpCmNvbG5hbWVzKGRhdGFfc2V0KVs3XSA8LSAicmVnaW9uIgpjb2xuYW1lcyhkYXRhX3NldClbOF0gPC0gImdsb2JhbCIKIyAtIGZpbmQgdW5tYXRjaGVkIGNvdW50cmllcywgZml4Ogp3IDwtIHdoaWNoKGlzLm5hKGRhdGFfc2V0JGdsb2JhbCkpCiMgLSB1bmlxdWUoZGF0YV9zZXQkY291bnRyeV9uYW1lW3ddKQp3IDwtIHdoaWNoKGRhdGFfc2V0JGNvdW50cnlfbmFtZSA9PSAiw4VsYW5kIElzbGFuZHMiKQpkYXRhX3NldCRnbG9iYWxbd10gPC0gIkdsb2JhbCBOb3J0aCIKZGF0YV9zZXQkcmVnaW9uW3ddIDwtICJFdXJvcGUiCncgPC0gd2hpY2goZGF0YV9zZXQkY291bnRyeV9uYW1lID09ICJCb2xpdmlhLCBQbHVyaW5hdGlvbmFsIFN0YXRlIG9mIikKZGF0YV9zZXQkZ2xvYmFsW3ddIDwtICJHbG9iYWwgU291dGgiCmRhdGFfc2V0JHJlZ2lvblt3XSA8LSAiU291dGgvTGF0aW4gQW1lcmljYSIKdyA8LSB3aGljaChkYXRhX3NldCRjb3VudHJ5X25hbWUgPT0gIkJvbmFpcmUsIFNpbnQgRXVzdGF0aXVzIGFuZCBTYWJhIikKZGF0YV9zZXQkZ2xvYmFsW3ddIDwtICJHbG9iYWwgU291dGgiCmRhdGFfc2V0JHJlZ2lvblt3XSA8LSAiU291dGgvTGF0aW4gQW1lcmljYSIKdyA8LSB3aGljaChkYXRhX3NldCRjb3VudHJ5X25hbWUgPT0gIkPDtHRlIGQnSXZvaXJlIikKZGF0YV9zZXQkZ2xvYmFsW3ddIDwtICJHbG9iYWwgU291dGgiCmRhdGFfc2V0JHJlZ2lvblt3XSA8LSAiQWZyaWNhIgp3IDwtIHdoaWNoKGRhdGFfc2V0JGNvdW50cnlfbmFtZSA9PSAiQ3VyYcOnYW8iKQpkYXRhX3NldCRnbG9iYWxbd10gPC0gIkdsb2JhbCBTb3V0aCIKZGF0YV9zZXQkcmVnaW9uW3ddIDwtICJTb3V0aC9MYXRpbiBBbWVyaWNhIgp3IDwtIHdoaWNoKGRhdGFfc2V0JGNvdW50cnlfbmFtZSA9PSAiQ3plY2hpYSIpCmRhdGFfc2V0JGdsb2JhbFt3XSA8LSAiR2xvYmFsIE5vcnRoIgpkYXRhX3NldCRyZWdpb25bd10gPC0gIkV1cm9wZSIKdyA8LSB3aGljaChkYXRhX3NldCRjb3VudHJ5X25hbWUgPT0gIk5vcnRoIE1hY2Vkb25pYSIpCmRhdGFfc2V0JGdsb2JhbFt3XSA8LSAiR2xvYmFsIE5vcnRoIgpkYXRhX3NldCRyZWdpb25bd10gPC0gIkV1cm9wZSIKdyA8LSB3aGljaChkYXRhX3NldCRjb3VudHJ5X25hbWUgPT0gIk1hY2FvIikKZGF0YV9zZXQkZ2xvYmFsW3ddIDwtICJHbG9iYWwgU291dGgiCmRhdGFfc2V0JHJlZ2lvblt3XSA8LSAiQXNpYSAmIFBhY2lmaWMiCncgPC0gd2hpY2goZGF0YV9zZXQkY291bnRyeV9uYW1lID09ICJQYWxlc3RpbmUsIFN0YXRlIG9mIikKZGF0YV9zZXQkZ2xvYmFsW3ddIDwtICJHbG9iYWwgU291dGgiCmRhdGFfc2V0JHJlZ2lvblt3XSA8LSAiTWlkZGxlIGVhc3QiCncgPC0gd2hpY2goZGF0YV9zZXQkY291bnRyeV9uYW1lID09ICJSw6l1bmlvbiIpCmRhdGFfc2V0JGdsb2JhbFt3XSA8LSAiR2xvYmFsIFNvdXRoIgpkYXRhX3NldCRyZWdpb25bd10gPC0gIkFzaWEgJiBQYWNpZmljIgp3IDwtIHdoaWNoKGRhdGFfc2V0JGNvdW50cnlfbmFtZSA9PSAiRXN3YXRpbmkiKQpkYXRhX3NldCRnbG9iYWxbd10gPC0gIkdsb2JhbCBTb3V0aCIKZGF0YV9zZXQkcmVnaW9uW3ddIDwtICJBZnJpY2EiCncgPC0gd2hpY2goZGF0YV9zZXQkY291bnRyeV9uYW1lID09ICJUYWl3YW4sIFByb3ZpbmNlIG9mIENoaW5hIikKZGF0YV9zZXQkZ2xvYmFsW3ddIDwtICJHbG9iYWwgTm9ydGgiCmRhdGFfc2V0JHJlZ2lvblt3XSA8LSAiQXNpYSAmIFBhY2lmaWMiCncgPC0gd2hpY2goZGF0YV9zZXQkY291bnRyeV9uYW1lID09ICJLb3Nvdm8iKQpkYXRhX3NldCRnbG9iYWxbd10gPC0gIkdsb2JhbCBOb3J0aCIKZGF0YV9zZXQkcmVnaW9uW3ddIDwtICJFdXJvcGUiCkRUOjpkYXRhdGFibGUoZGF0YV9zZXQpCmBgYApgYGB7ciwgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0KIyAtIGtlZXAgR2xvYmFsIE5vcnRoL0dsb2JhbCBTb3V0aCBkYXRhCmNvdW50cnlfZ2xvYmFsIDwtIGRhdGFfc2V0ICU+JSAKICBkcGx5cjo6c2VsZWN0KGNvdW50cnlfY29kZSwgCiAgICAgICAgICAgICAgICBnbG9iYWwpCmNvdW50cnlfZ2xvYmFsIDwtIGNvdW50cnlfZ2xvYmFsWyFkdXBsaWNhdGVkKGNvdW50cnlfZ2xvYmFsKSwgXQpgYGAKCiMjIyAxLjIgQWN0aXZlIEVkaXRvcnMgQW5hbHlzaXMKCmBgYHtyLCBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQpuX2dsb2JhbF9ub3J0aCA8LSB1bmlxdWUoCiAgZGF0YV9zZXQkY291bnRyeV9jb2RlW2RhdGFfc2V0JGdsb2JhbCA9PSAiR2xvYmFsIE5vcnRoIl0KICApCm5fZ2xvYmFsX25vcnRoIDwtIGxlbmd0aChuX2dsb2JhbF9ub3J0aCkKbl9nbG9iYWxfc291dGggPC0gdW5pcXVlKAogIGRhdGFfc2V0JGNvdW50cnlfY29kZVtkYXRhX3NldCRnbG9iYWwgPT0gIkdsb2JhbCBTb3V0aCJdCiAgKQpuX2dsb2JhbF9zb3V0aCA8LSBsZW5ndGgobl9nbG9iYWxfc291dGgpCmBgYAoKV2UgZmluZCBhIHRvdGFsIG9mIGByIG5fZ2xvYmFsX25vcnRoICsgbl9nbG9iYWxfc291dGhgIGNvdW50cmllcyBpbiB0aGUgYW5hbHlzaXMsIG9mIHdoaWNoIGByIG5fZ2xvYmFsX25vcnRoYCBiZWxvbmcgdG8gdGhlIEdsb2JhbCBOb3J0aCBhbmQgYHIgbl9nbG9iYWxfc291dGhgIHRvIHRoZSBHbG9iYWwgU291dGguCgojIyMjIDEuMi4xIEFjdGl2ZSBFZGl0b3IgQ2xhc3NlcwoKVGhlIGZvbGxvd2luZyBjaGFydCBzaG93cyB0aGUgcGVyY2VudCBvZiBjb3VudHJpZXMgaW4gdGhlIEdsb2JhbCBOb3J0aCBhbmQgR2xvYmFsIFNvdXRoLCBpbiBlYWNoIG1vbnRoIGZyb20gU2VwdGVtYmVyIDIwMjAgdG8gQXVndXN0IDIwMjEsIHdoaWNoIHdlcmUgZm91bmQgaW4gdGhlIHJlc3BlY3RpdmUgY2F0ZWdvcmllcyBvZiB1c2VyIGFjdGl2aXR5OgoKYGBge3IsIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9CiMgLSB3cmFuZ2xlCmFjdGl2ZV9lZHMgPC0gZGF0YV9zZXQgJT4lIAogIGRwbHlyOjpzZWxlY3QoZ2xvYmFsLCAKICAgICAgICAgICAgICAgIG1vbnRoLAogICAgICAgICAgICAgICAgYWN0aXZlX2VkaXRvcnMpICU+JSAKICBkcGx5cjo6Z3JvdXBfYnkoZ2xvYmFsLCBtb250aCwgYWN0aXZlX2VkaXRvcnMpICU+JSAKICBkcGx5cjo6c3VtbWFyaXNlKGNvdW50ID0gbigpKSAlPiUgCiAgdGlkeXI6OnBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBhY3RpdmVfZWRpdG9ycywgCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlc19mcm9tID0gY291bnQsIAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXNfZmlsbCA9IDApICU+JQogIHRpZHlyOjpwaXZvdF9sb25nZXIoIWMoZ2xvYmFsLCBtb250aCksCiAgICAgICAgICAgICAgICAgICAgICBuYW1lc190byA9ICJhY3RpdmVfZWRpdG9ycyIsCiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAiY291bnQiKQphY3RpdmVfZWRzJHByb3BvcnRpb24gPC0gaWZlbHNlKGFjdGl2ZV9lZHMkZ2xvYmFsID09ICJHbG9iYWwgTm9ydGgiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVfZWRzJGNvdW50L25fZ2xvYmFsX25vcnRoLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVfZWRzJGNvdW50L25fZ2xvYmFsX3NvdXRoKQphY3RpdmVfZWRzJHBlcmNlbnQgPC0gcm91bmQoYWN0aXZlX2VkcyRwcm9wb3J0aW9uKjEwMCwgMykKCiMgLSBjaGFydAphY3RpdmVfZWRzJGFjdGl2ZV9lZGl0b3JzIDwtIGZhY3RvcihhY3RpdmVfZWRzJGFjdGl2ZV9lZGl0b3JzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiMSAtIDEwIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjExIC0gMjAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjEgLSAzMCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjMxIC0gNDAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNDEgLSA1MCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI1MSAtIDYwIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjYxIC0gNzAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNzEgLSA4MCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4MSAtIDkwIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjkxIC0gMTAwIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIj4gMTAwIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQpjb2xuYW1lcyhhY3RpdmVfZWRzKVszXSA8LSAiQWN0aXZlIEVkaXRvcnMgQ2xhc3NlcyIKZ2dwbG90Mjo6Z2dwbG90KGFjdGl2ZV9lZHMsIAogICAgICAgICAgICAgICAgYWVzKHggPSBtb250aCwKICAgICAgICAgICAgICAgICAgICB5ID0gcGVyY2VudCwKICAgICAgICAgICAgICAgICAgICBncm91cCA9IGBBY3RpdmUgRWRpdG9ycyBDbGFzc2VzYCwKICAgICAgICAgICAgICAgICAgICBmaWxsID0gYEFjdGl2ZSBFZGl0b3JzIENsYXNzZXNgLAogICAgICAgICAgICAgICAgICAgIGNvbG9yID0gYEFjdGl2ZSBFZGl0b3JzIENsYXNzZXNgKSkgKwogIGdlb21fbGluZShzaXplID0gLjI1KSArIAogIGdlb21fcG9pbnQoKSArIAogIGZhY2V0X3dyYXAofmdsb2JhbCkgKyAKICB4bGFiKCJNb250aCIpICsgeWxhYigiJSBjb3VudHJpZXMiKSArIAogIGdndGl0bGUoIkFjdGl2ZSBFZGl0b3JzIikgKyAKICB0aGVtZV9idygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkgKyAKICB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X2JsYW5rKCkpICsgCiAgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSkgKwogIHRoZW1lKHN0cmlwLmJhY2tncm91bmQgPSAgZWxlbWVudF9ibGFuaygpKSArIAogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwLCBoanVzdCA9IC41KSkKYGBgClRoZSBjb250cmFzdCBpcyBvYnZpb3VzOiBjb25zaXN0ZW50bHkgb3ZlciB0aW1lLCBtb3N0IG9mIHRoZSBjb3VudHJpZXMgaW4gdGhlIEdsb2JhbCBOb3J0aCBtYWludGFpbiA+IDEwMCBhY3RpdmUgZWRpdG9ycyBtb250aGx5LCB3aGlsZSBtb3N0IG9mIHRoZSBjb3VudHJpZXMgaW4gdGhlIEdsb2JhbCBTb3V0aCBtYWludGFpbiAxIC0gMTAuIEFzIGl0IGNhbiBiZSBzZWVuIGZyb20gdGhlIGxlZnQgcGFuZWwgaW4gdGhlIGNoYXJ0LCB0aGUgcnVubmVyLXVwIGNsYXNzIG9mIGFjdGl2ZSBlZGl0b3JzIGluIEdsb2JhbCBOb3J0aCBhcmUgdGhlIGNvdW50cmllcyB0aGF0IG1haW50YWluIDEgLSAxMCBlZGl0b3JzIG1vbnRobHkuCgpUaGUgZm9sbG93aW5nIGNoYXJ0IHNob3dzIHRoZSBzYW1lIGRhdGEgZXhjZXB0IGZvciBub3cgd2UgY29uc2lkZXIgb25seSBlZGl0b3JzIGFjdGl2ZSBpbiB0aGUgaXRlbXMgbmFtZXNwYWNlIChOUzowKS4KCmBgYHtyLCBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQojIC0gd3JhbmdsZQphY3RpdmVfZWRzIDwtIGRhdGFfc2V0ICU+JSAKICBkcGx5cjo6c2VsZWN0KGdsb2JhbCwgCiAgICAgICAgICAgICAgICBtb250aCwKICAgICAgICAgICAgICAgIGFjdGl2ZV9lZGl0b3JzX25zMCkgJT4lIAogIGRwbHlyOjpncm91cF9ieShnbG9iYWwsIG1vbnRoLCBhY3RpdmVfZWRpdG9yc19uczApICU+JSAKICBkcGx5cjo6c3VtbWFyaXNlKGNvdW50ID0gbigpKSAlPiUgCiAgdGlkeXI6OnBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBhY3RpdmVfZWRpdG9yc19uczAsIAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXNfZnJvbSA9IGNvdW50LCAKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzX2ZpbGwgPSAwKSAlPiUKICB0aWR5cjo6cGl2b3RfbG9uZ2VyKCFjKGdsb2JhbCwgbW9udGgpLAogICAgICAgICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAiYWN0aXZlX2VkaXRvcnNfbnMwIiwKICAgICAgICAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJjb3VudCIpCmFjdGl2ZV9lZHMkcHJvcG9ydGlvbiA8LSBpZmVsc2UoYWN0aXZlX2VkcyRnbG9iYWwgPT0gIkdsb2JhbCBOb3J0aCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZV9lZHMkY291bnQvbl9nbG9iYWxfbm9ydGgsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZV9lZHMkY291bnQvbl9nbG9iYWxfc291dGgpCmFjdGl2ZV9lZHMkcGVyY2VudCA8LSByb3VuZChhY3RpdmVfZWRzJHByb3BvcnRpb24qMTAwLCAzKQoKIyAtIGNoYXJ0CmFjdGl2ZV9lZHMkYWN0aXZlX2VkaXRvcnNfbnMwIDwtIGZhY3RvcihhY3RpdmVfZWRzJGFjdGl2ZV9lZGl0b3JzX25zMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIjAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMSAtIDEwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjExIC0gMjAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjEgLSAzMCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIzMSAtIDQwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjQxIC0gNTAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNTEgLSA2MCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI2MSAtIDcwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjcxIC0gODAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODEgLSA5MCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI5MSAtIDEwMCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI+IDEwMCIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCmNvbG5hbWVzKGFjdGl2ZV9lZHMpWzNdIDwtICJBY3RpdmUgRWRpdG9ycyBDbGFzc2VzIgpnZ3Bsb3QyOjpnZ3Bsb3QoYWN0aXZlX2VkcywgCiAgICAgICAgICAgICAgICBhZXMoeCA9IG1vbnRoLAogICAgICAgICAgICAgICAgICAgIHkgPSBwZXJjZW50LAogICAgICAgICAgICAgICAgICAgIGdyb3VwID0gYEFjdGl2ZSBFZGl0b3JzIENsYXNzZXNgLAogICAgICAgICAgICAgICAgICAgIGZpbGwgPSBgQWN0aXZlIEVkaXRvcnMgQ2xhc3Nlc2AsCiAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBgQWN0aXZlIEVkaXRvcnMgQ2xhc3Nlc2ApKSArCiAgZ2VvbV9saW5lKHNpemUgPSAuMjUpICsgCiAgZ2VvbV9wb2ludCgpICsgCiAgZmFjZXRfd3JhcCh+Z2xvYmFsKSArIAogIHhsYWIoIk1vbnRoIikgKyB5bGFiKCIlIGNvdW50cmllcyIpICsgCiAgZ2d0aXRsZSgiQWN0aXZlIEVkaXRvcnMgaW4gdGhlIEl0ZW1zIE5hbWVzcGFjZSAoTlM6MCkiKSArIAogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKSArIAogIHRoZW1lKHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfYmxhbmsoKSkgKyAKICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpKSArCiAgdGhlbWUoc3RyaXAuYmFja2dyb3VuZCA9ICBlbGVtZW50X2JsYW5rKCkpICsgCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTAsIGhqdXN0ID0gLjUpKQpgYGAKQXMgd2UgY2FuIHNlZSwgdGhlIHJlc3VsdCBpcyAocXVhbGl0YXRpdmVseSwgYW5kIGFsbW9zdCBmdWxseSkgcmVwbGljYXRlZCB3aGVuIGxvb2tpbmcgaW50byB0aGUgaXRlbXMgbmFtZXNwYWNlIG9ubHkuCgojIyMjIDEuMi4yIEF2ZXJhZ2UgQWN0aXZlIEVkaXRvcnMgUmFuawoKVGhlIGFjdGl2ZSBlZGl0b3JzIGNsYXNzZXMgLSAgYDEtMTBgLCBgMTEtMjBgLCBgMjEtMzBgLCBgMzEtNDBgLCBgNDEtNTBgLCBgNTEtNjBgLCBgNjEtNzBgLCBgNzEtODBgLCBgODEtOTBgLCBgOTEtMTAwYCwgYD4gMTAwYCAtIGNhbiBiZSBkZXNjcmliZWQgYXMgYWN0aXZlIGVkaXRvcnMgcmFua3MgYnkgYXNzaWduaW5nIHRoZSByYW5rIG9mIDExIHRvIGA+IDEwMGAsIDEwIHRvIGA5MS0xMDBgLCA5IHRvIGA4MS05MGAsIC4uLCAxIHRvIGAxLTEwYC4gVGhlIGZvbGxvd2luZyBjaGFydCBkZXBpY3RzIHRoZSBjaGFuZ2Ugb2YgdGhlIGF2ZXJhZ2UgYWN0aXZlIGVkaXRvcnMgcmFuayB3aXRoIHRpbWUgZm9yIHRoZSBjb3VudHJpZXMgb2YgdGhlIEdsb2JhbCBOb3J0aCBhbmQgR2xvYmFsIFNvdXRoLgoKYGBge3IsIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9CiMgLSB3cmFuZ2xlCmFjdGl2ZV9lZHMgPC0gZGF0YV9zZXQgJT4lIAogIGRwbHlyOjpzZWxlY3QoZ2xvYmFsLCAKICAgICAgICAgICAgICAgIG1vbnRoLAogICAgICAgICAgICAgICAgYWN0aXZlX2VkaXRvcnMpCmFjdGl2ZV9lZHMkYWN0aXZlX2VkaXRvcnMgPC0gZHBseXI6OnJlY29kZShhY3RpdmVfZWRzJGFjdGl2ZV9lZGl0b3JzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIxIC0gMTAiID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIxMSAtIDIwIiA9IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjEgLSAzMCIgPSAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjMxIC0gNDAiID0gNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI0MSAtIDUwIiA9IDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNTEgLSA2MCIgPSA2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjYxIC0gNzAiID0gNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI3MSAtIDgwIiA9IDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODEgLSA5MCIgPSA5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjkxIC0gMTAwIiA9IDEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIj4gMTAwIiA9IDExKQphY3RpdmVfZWRzIDwtIGFjdGl2ZV9lZHMgJT4lIAogIGRwbHlyOjpzZWxlY3RfYWxsKCkgJT4lIAogIGRwbHlyOjpncm91cF9ieShnbG9iYWwsIG1vbnRoKSAlPiUgCiAgZHBseXI6OnN1bW1hcmlzZShhdmVyYWdlX3JhbmsgPSBtZWFuKGFjdGl2ZV9lZGl0b3JzKSwgCiAgICAgICAgICAgICAgICAgICBzZCA9IHNkKGFjdGl2ZV9lZGl0b3JzKSkKIyAtIGNoYXJ0CmdncGxvdDI6OmdncGxvdChhY3RpdmVfZWRzLCAKICAgICAgICAgICAgICAgIGFlcyh4ID0gbW9udGgsCiAgICAgICAgICAgICAgICAgICAgeSA9IGF2ZXJhZ2VfcmFuaywKICAgICAgICAgICAgICAgICAgICBncm91cCA9IGdsb2JhbCwKICAgICAgICAgICAgICAgICAgICBmaWxsID0gZ2xvYmFsLAogICAgICAgICAgICAgICAgICAgIGNvbG9yID0gZ2xvYmFsKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCAKICAgICAgICAgICB3aWR0aCA9IC40LAogICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoKSkgKwogIHhsYWIoIk1vbnRoIikgKyB5bGFiKCJBdmVyYWdlIFJhbmsiKSArIAogIGdndGl0bGUoIkFjdGl2ZSBFZGl0b3JzIEF2ZXJhZ2UgUmFuayIpICsgCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoImRhcmtibHVlIiwgImRhcmtvcmFuZ2UiKSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoImRhcmtibHVlIiwgImRhcmtvcmFuZ2UiKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKSArIAogIHRoZW1lKHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfYmxhbmsoKSkgKyAKICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpKSArCiAgdGhlbWUoc3RyaXAuYmFja2dyb3VuZCA9ICBlbGVtZW50X2JsYW5rKCkpICsgCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTAsIGhqdXN0ID0gLjUpKQpgYGAKV2UgY2FuIHNlZSBob3cgdGhlIGNvdW50cmllcyBvZiBHbG9iYWwgU291dGggaGF2ZSBhIGxvd2VyIGF2ZXJhZ2UgYWN0aXZlIGVkaXRvcnMgcmFuaywgY29uc2lzdGVudGx5IGluIHRpbWUuIEluIHRoZSBmb2xsb3dpbmcgY2hhcnQgd2UgcmVwbGljYXRlIHRoZSBmaW5kaW5nIGNvbnNpZGVyaW5nIGVkaXRzIGluIHRoZSBpdGVtcyBuYW1lc3BhY2UgKE5TOjApIG9ubHkuCgpgYGB7ciwgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0KIyAtIHdyYW5nbGUKYWN0aXZlX2VkcyA8LSBkYXRhX3NldCAlPiUgCiAgZHBseXI6OnNlbGVjdChnbG9iYWwsIAogICAgICAgICAgICAgICAgbW9udGgsCiAgICAgICAgICAgICAgICBhY3RpdmVfZWRpdG9yc19uczApCmFjdGl2ZV9lZHMkYWN0aXZlX2VkaXRvcnNfbnMwIDwtIGRwbHlyOjpyZWNvZGUoYWN0aXZlX2VkcyRhY3RpdmVfZWRpdG9yc19uczAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjAiID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMSAtIDEwIiA9IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjExIC0gMjAiID0gMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjEgLSAzMCIgPSA0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIzMSAtIDQwIiA9IDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjQxIC0gNTAiID0gNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNTEgLSA2MCIgPSA3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI2MSAtIDcwIiA9IDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjcxIC0gODAiID0gOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODEgLSA5MCIgPSAxMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOTEgLSAxMDAiID0gMTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIj4gMTAwIiA9IDEyKQphY3RpdmVfZWRzIDwtIGFjdGl2ZV9lZHMgJT4lIAogIGRwbHlyOjpzZWxlY3RfYWxsKCkgJT4lIAogIGRwbHlyOjpncm91cF9ieShnbG9iYWwsIG1vbnRoKSAlPiUgCiAgZHBseXI6OnN1bW1hcmlzZShhdmVyYWdlX3JhbmsgPSBtZWFuKGFjdGl2ZV9lZGl0b3JzX25zMCksIAogICAgICAgICAgICAgICAgICAgc2QgPSBzZChhY3RpdmVfZWRpdG9yc19uczApKQojIC0gY2hhcnQKZ2dwbG90Mjo6Z2dwbG90KGFjdGl2ZV9lZHMsIAogICAgICAgICAgICAgICAgYWVzKHggPSBtb250aCwKICAgICAgICAgICAgICAgICAgICB5ID0gYXZlcmFnZV9yYW5rLAogICAgICAgICAgICAgICAgICAgIGdyb3VwID0gZ2xvYmFsLAogICAgICAgICAgICAgICAgICAgIGZpbGwgPSBnbG9iYWwsCiAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBnbG9iYWwpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIAogICAgICAgICAgIHdpZHRoID0gLjQsCiAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgpKSArCiAgeGxhYigiTW9udGgiKSArIHlsYWIoIkF2ZXJhZ2UgUmFuayIpICsgCiAgZ2d0aXRsZSgiQWN0aXZlIEVkaXRvcnMgQXZlcmFnZSBSYW5rIGluIHRoZSBJdGVtcyBOYW1lc3BhY2UgKE5TOjApIikgKyAKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiZGFya2JsdWUiLCAiZGFya29yYW5nZSIpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiZGFya2JsdWUiLCAiZGFya29yYW5nZSIpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpICsgCiAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9ibGFuaygpKSArIAogIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNykpICsKICB0aGVtZShzdHJpcC5iYWNrZ3JvdW5kID0gIGVsZW1lbnRfYmxhbmsoKSkgKyAKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCwgaGp1c3QgPSAuNSkpCmBgYAojIyMjIDEuMi4yIEVkaXRvciBBY3Rpdml0eSBNb250aGx5IENoYW5nZSBJbmRleAoKIyMjIyAxLjIuMi4xIEluIGFsbCBuYW1lc3BhY2VzCgpMb29raW5nIGF0IGVhY2ggY291bnRyeSBvdmVyIHRpbWUsIHdlIGNhbiB0cmFjayB0aGUgY2hhbmdlIGluIGl0cyBlZGl0b3IgYWN0aXZpdHkgaW4gdGhlIGZvbGxvd2luZyB3YXkuIEZvciBleGFtcGxlLCBhIGNvdW50cnkgdGhhdCB3YXMgaW4gdGhlIGA+IDEwMGAgYWN0aXZlIGVkaXRvcnMgY2F0ZWdvcnkgaW4gU2VwdGVtYmVyIDIwMjAgYW5kIGluIHRoZSBgOTAgLSAxMDBgIGFjdGl2ZSBlZGl0b3JzIGNhdGVnb3J5IGluIE9jdG9iZXIgMjAyMCBoYXMgY2hhbmdlZCBpdHMgYWN0aXZlIGVkaXRvcnMgcmFuayBmb3IgYC0xYC4gKlZpY2UgdmVyc2EqLCB0aGUgY291bnRyeSB0aGF0IG1vdmVkIGZyb20gYDkwIC0gMTAwYCB0byBgPiAxMDBgIGhhcyBjaGFuZ2VkIGZvciBgKzFgOyB0aGUgY291bnRyeSB0aGF0IG1vdmVkIGZyb20gYDEgLSAxMGAgdG8gYDQxIC0gNTBgIGhhcyBjaGFuZ2VkIGZvciBgKzNgLCBldGMuIEluIHRoZSBmb2xsb3dpbmcgY2hhcnQgd2UgdGFrZSB0aGUgKiphdmVyYWdlIG1vbnRobHkgY2hhbmdlKiogLSBhcyBkZXNjcmliZWQgLSAqKnBlciBtb250aCoqLCBhbmQgY29udHJhc3QgR2xvYmFsIE5vcnRoIHZzIEdsb2JhbCBTb3V0aCBvdmVyIHRpbWUuCgpgYGB7ciwgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0KIyAtIHdyYW5nbGUKYWN0aXZlX2VkcyA8LSBkYXRhX3NldCAlPiUgCiAgZHBseXI6OnNlbGVjdChjb3VudHJ5X2NvZGUsCiAgICAgICAgICAgICAgICBnbG9iYWwsIAogICAgICAgICAgICAgICAgbW9udGgsCiAgICAgICAgICAgICAgICBhY3RpdmVfZWRpdG9ycykgJT4lIAogIGRwbHlyOjpncm91cF9ieShjb3VudHJ5X2NvZGUsIGdsb2JhbCwgbW9udGgsIGFjdGl2ZV9lZGl0b3JzKSAlPiUgCiAgZHBseXI6Om11dGF0ZShjb3VudCA9IG4oKSkgJT4lIAogIHRpZHlyOjpwaXZvdF93aWRlcihuYW1lc19mcm9tID0gYWN0aXZlX2VkaXRvcnMsIAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXNfZnJvbSA9IGNvdW50LCAKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzX2ZpbGwgPSAwKSAlPiUKICB0aWR5cjo6cGl2b3RfbG9uZ2VyKCFjKGNvdW50cnlfY29kZSwgZ2xvYmFsLCBtb250aCksCiAgICAgICAgICAgICAgICAgICAgICBuYW1lc190byA9ICJhY3RpdmVfZWRpdG9ycyIsCiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAiY291bnQiKQphY3RpdmVfZWRzJGFjdGl2ZV9lZGl0b3JzIDwtIGZhY3RvcihhY3RpdmVfZWRzJGFjdGl2ZV9lZGl0b3JzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCIwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMSAtIDEwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTEgLSAyMCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIxIC0gMzAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIzMSAtIDQwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNDEgLSA1MCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjUxIC0gNjAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI2MSAtIDcwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNzEgLSA4MCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjgxIC0gOTAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI5MSAtIDEwMCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIj4gMTAwIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQphY3RpdmVfZWRzIDwtIGFjdGl2ZV9lZHMgJT4lIAogIGRwbHlyOjphcnJhbmdlKGNvdW50cnlfY29kZSwgZ2xvYmFsLCBtb250aCwgYWN0aXZlX2VkaXRvcnMpIAphY3RpdmVfZWRzX2wgPC0gbGFwcGx5KHVuaXF1ZShhY3RpdmVfZWRzJGNvdW50cnlfY29kZSksIGZ1bmN0aW9uKHgpIHsKICBiIDwtIGxhcHBseSh1bmlxdWUoYWN0aXZlX2VkcyRnbG9iYWwpLCBmdW5jdGlvbih5KSB7CiAgICBhIDwtIGxhcHBseSh1bmlxdWUoYWN0aXZlX2VkcyRtb250aCksIGZ1bmN0aW9uKHopIHsKICAgICAgZCA8LSBhY3RpdmVfZWRzICU+JSAKICAgICAgICBkcGx5cjo6ZmlsdGVyKAogICAgICAgICAgY291bnRyeV9jb2RlID09IHgsCiAgICAgICAgICBnbG9iYWwgPT0geSwgCiAgICAgICAgICBtb250aCA9PSB6CiAgICAgICAgKQogICAgICB3IDwtIHdoaWNoKGQkY291bnQgPT0gMSkKICAgICAgaWYgKGxlbmd0aCh3KSA9PSAxKSB7CiAgICAgICAgZCA8LSBhcy5kYXRhLmZyYW1lKGRbdywgXSkKICAgICAgfSBlbHNlIHsKICAgICAgICBkIDwtIGRhdGEuZnJhbWUoY291bnRyeV9jb2RlID0geCwKICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsID0geSwKICAgICAgICAgICAgICAgICAgICAgICAgbW9udGggPSB6LAogICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVfZWRpdG9ycyA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQogICAgICB9CiAgICB9KQogICAgcmV0dXJuKAogICAgICBkYXRhLnRhYmxlOjpyYmluZGxpc3QoYSkKICAgICkKICB9KQogIHJldHVybigKICAgIGRhdGEudGFibGU6OnJiaW5kbGlzdChiKQogICkKfSkKYWN0aXZlX2Vkc19sIDwtIGRhdGEudGFibGU6OnJiaW5kbGlzdChhY3RpdmVfZWRzX2wpCmFjdGl2ZV9lZHNfbCA8LSBhY3RpdmVfZWRzX2wgJT4lIAogIGRwbHlyOjphcnJhbmdlKGNvdW50cnlfY29kZSwgZ2xvYmFsLCBtb250aCkKYWN0aXZlX2Vkc19sJGNvdW50IDwtIE5VTEwKYWN0aXZlX2Vkc19sIDwtIGNvdW50cnlfZ2xvYmFsICU+JSAKICBkcGx5cjo6bGVmdF9qb2luKGFjdGl2ZV9lZHNfbCwgCiAgICAgICAgICAgICAgICAgICBieSA9IGMoImNvdW50cnlfY29kZSIgPSAiY291bnRyeV9jb2RlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2xvYmFsIiA9ICJnbG9iYWwiKSkKcmFua3MgPC0gYygiMCIsCiAgICAgICAgICAgIjEgLSAxMCIsCiAgICAgICAgICAgIjExIC0gMjAiLAogICAgICAgICAgICIyMSAtIDMwIiwKICAgICAgICAgICAiMzEgLSA0MCIsCiAgICAgICAgICAgIjQxIC0gNTAiLAogICAgICAgICAgICI1MSAtIDYwIiwKICAgICAgICAgICAiNjEgLSA3MCIsCiAgICAgICAgICAgIjcxIC0gODAiLAogICAgICAgICAgICI4MSAtIDkwIiwKICAgICAgICAgICAiOTEgLSAxMDAiLAogICAgICAgICAgICI+IDEwMCIpCnJhbmtzX2NoYW5nZSA8LSBsYXBwbHkodW5pcXVlKGFjdGl2ZV9lZHNfbCRjb3VudHJ5X2NvZGUpLCBmdW5jdGlvbih4KSB7CiAgZCA8LSBhcy5kYXRhLmZyYW1lKAogICAgYWN0aXZlX2Vkc19sICU+JQogICAgICBkcGx5cjo6ZmlsdGVyKGNvdW50cnlfY29kZSA9PSB4KQogICkgJT4lIAogICAgZHBseXI6OmFycmFuZ2UobW9udGgpCiAgcmMgPC0gdmVjdG9yKG1vZGUgPSAibnVtZXJpYyIsCiAgICAgICAgICAgICAgIGxlbmd0aCA9IGRpbShkKVsxXS0xKQogIGZvciAoaSBpbiAyOmRpbShkKVsxXSkgewogICAgcDEgPC0gd2hpY2gocmFua3MgJWluJSBkJGFjdGl2ZV9lZGl0b3JzW2ktMV0pCiAgICBwMiA8LSB3aGljaChyYW5rcyAlaW4lIGQkYWN0aXZlX2VkaXRvcnNbaV0pCiAgICByY1tpLTFdIDwtIHAyIC0gcDEKICB9CiAgZCA8LSBkWzI6ZGltKGQpWzFdICwgXQogIGQkcmMgPC0gcmMKICByZXR1cm4oZCkKfSkKcmFua3NfY2hhbmdlIDwtIGRhdGEudGFibGU6OnJiaW5kbGlzdChyYW5rc19jaGFuZ2UpCnJhbmtzX2NoYW5nZV9nbG9iYWwgPC0gcmFua3NfY2hhbmdlICU+JSAKICBkcGx5cjo6c2VsZWN0KGdsb2JhbCwgbW9udGgsIHJjKSAlPiUgCiAgZHBseXI6Omdyb3VwX2J5KGdsb2JhbCwgbW9udGgpICU+JSAKICBkcGx5cjo6c3VtbWFyaXNlKGF2Z19yYyA9IG1lYW4ocmMpLCAKICAgICAgICAgICAgICAgICAgIHNkX3JjID0gc2QocmMpKQojIC0gY2hhcnQKZ2dwbG90Mjo6Z2dwbG90KHJhbmtzX2NoYW5nZV9nbG9iYWwsIAogICAgICAgICAgICAgICAgYWVzKHggPSBtb250aCwKICAgICAgICAgICAgICAgICAgICB5ID0gYXZnX3JjLAogICAgICAgICAgICAgICAgICAgIGdyb3VwID0gZ2xvYmFsLAogICAgICAgICAgICAgICAgICAgIGZpbGwgPSBnbG9iYWwsCiAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBnbG9iYWwsIAogICAgICAgICAgICAgICAgICAgIGxhYmVsID0gcm91bmQoYXZnX3JjLCAzKSkpICsKICBnZW9tX2xpbmUoc2l6ZSA9IC4yNSkgKyAKICBnZW9tX3BvaW50KCkgKwogIGdncmVwZWw6Omdlb21fdGV4dF9yZXBlbChzaXplID0gMywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3cubGVnZW5kID0gRkFMU0UpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiZGFya2JsdWUiLCAiZGFya29yYW5nZSIpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiZGFya2JsdWUiLCAiZGFya29yYW5nZSIpKSArCiAgeGxhYigiTW9udGgiKSArIHlsYWIoIkF2ZXJhZ2UgUmFuayBDaGFuZ2UiKSArIAogIGdndGl0bGUoIkFjdGl2ZSBFZGl0b3JzOiBBdmVyYWdlIFJhbmsgQ2hhbmdlXG5vZiBBY3RpdmUgRWRpdG9ycyBDbGFzcyIpICsgCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpICsgCiAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9ibGFuaygpKSArIAogIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNykpICsKICB0aGVtZShzdHJpcC5iYWNrZ3JvdW5kID0gIGVsZW1lbnRfYmxhbmsoKSkgKyAKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCwgaGp1c3QgPSAuNSkpCmBgYCAKVGhlcmUgaXMgbm8gb2J2aW91cyBwYXR0ZXJuIGluIHRoZSBhdmVyYWdlIHJhbmsgb2YgYWN0aXZlIGVkaXRvcnMgY2xhc3MgZm9yIGVpdGhlciBHbG9iYWwgTm9ydGggb3IgR2xvYmFsIFNvdXRoIGNvdW50cmllcy4gQm90aCBHbG9iYWwgTm9ydGggYW5kIEdsb2JhbCBTb3V0aCBjb3VudHJpZXMgc2hvdyBzaW1pbGFyIG9zY3VsYXRpb25zIG92ZXIgdGltZSBpbiB0aGF0IHJlc3BlY3QsIGFuZCB0aHVzIGl0IGNhbm5vdCBiZSBzYWlkIHRoYXQgdGhlIEdsb2JhbCBTb3V0aCBjb3VudHJpZXMgZXhoaWJpdCBhIHBhdHRlcm4gb2YgcG9zaXRpdmUgY2hhbmdlIGluIHRoYXQgcmVzcGVjdCBmcm9tIHRoaXMgZGF0YSBhbG9uZS4KCkhvd2V2ZXIsIHdlIGhhdmUgbm90aWNlZCAqbGFyZ2UgdmFyaWF0aW9ucyogYWNyb3NzIGNvdW50cmllcyBpbiB0aGVpciBjaGFuZ2UgaW4gdGhlIGF2ZXJhZ2UgcmFuayBvZiBhY3RpdmUgZWRpdG9ycyBjbGFzcyBvdmVyIHRpbWUuIEEgcGVyLWNvdW50cnksIGZpbmVyLWdyYWluIGFuYWx5c2lzIHNob3dzIHRoZSBmb2xsb3dpbmcgcmVzdWx0czogCgotIDEuIFNvbWUgY291bnRyaWVzIG9mIHRoZSBHbG9iYWwgU291dGggZXhoaWJpdGVkIHRoZSBoaWdoZXN0IChwb3NpdGl2ZSkgY2hhbmdlIGluIGF2ZXJhZ2UgcmFuayBvZiBhY3RpdmUgZWRpdG9ycyBjbGFzcyBpbiB0aGUgcHJldmlvdXMgMTIgbW9udGhzIChmcm9tIDIwMjAvMDkgdG8gMjAyMS8wOCwgdGhlIHRpbWUgc3BhbiBvZiB0aGlzIGFuYWx5c2lzKTsKLSAyLiBBbHNvLCBzb21lIG90aGVyIGNvdW50cmllcyBvZiB0aGUgR2xvYmFsIFNvdXRoIGFyZSBwb3NpdGlvbmVkIGF0IHRoZSB2ZXJ5IGJvdHRvbSBvZiB0aGUgbGlzdCBpbiB0aGF0IHJlc3BlY3Q7IGZpbmFsbHksCi0gMy4gTW9zdCBvZiB0aGUgY291bnRyaWVzIGVuY29tcGFzc2VkIGJ5IHRoaXMgYW5hbHlzaXMgdGVuZCB0byBoYXZlIGEgemVybyBjaGFuZ2Ugb2YgYXZlcmFnZSByYW5rIG9mIGFjdGl2ZSBlZGl0b3JzIGNsYXNzZXMuIAoKVGhlIHBlci1jb3VudHJ5IGRhdGEgYXJlIGdpdmVuIGluIHRoZSBmb2xsb3dpbmcgdGFibGU6CgpgYGB7ciwgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0KcmFua3NfY2hhbmdlX2NvdW50cnkgPC0gcmFua3NfY2hhbmdlICU+JSAKICBkcGx5cjo6c2VsZWN0KGNvdW50cnlfY29kZSwgZ2xvYmFsLCBtb250aCwgcmMpICU+JSAKICBkcGx5cjo6Z3JvdXBfYnkoY291bnRyeV9jb2RlLCBnbG9iYWwpICU+JSAKICBkcGx5cjo6c3VtbWFyaXNlKGF2Z19yYyA9IG1lYW4ocmMpKSAlPiUgCiAgZHBseXI6OmFycmFuZ2UoZGVzYyhhdmdfcmMpKQpjb3VudHJ5X2dsb2JhbF8yIDwtIGRhdGFfc2V0ICU+JSAKICBkcGx5cjo6c2VsZWN0KGNvdW50cnlfY29kZSwKICAgICAgICAgICAgICAgIGNvdW50cnlfbmFtZSwKICAgICAgICAgICAgICAgIGdsb2JhbCkKY291bnRyeV9nbG9iYWxfMiA8LSBjb3VudHJ5X2dsb2JhbF8yWyFkdXBsaWNhdGVkKGNvdW50cnlfZ2xvYmFsXzIpLCBdCnJhbmtzX2NoYW5nZV9jb3VudHJ5IDwtIGNvdW50cnlfZ2xvYmFsXzIgJT4lIAogIGRwbHlyOjpsZWZ0X2pvaW4ocmFua3NfY2hhbmdlX2NvdW50cnksIAogICAgICAgICAgICAgICAgICAgYnkgPSBjKCJjb3VudHJ5X2NvZGUiID0gImNvdW50cnlfY29kZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgImdsb2JhbCIgPSAiZ2xvYmFsIikpICU+JSAKICBkcGx5cjo6YXJyYW5nZShkZXNjKGF2Z19yYykpCkRUOjpkYXRhdGFibGUocmFua3NfY2hhbmdlX2NvdW50cnkpCmBgYApJZiB3ZSBzcGxpdCB0aGUgY291bnRyaWVzIGludG8gKGEpIHRob3NlIHdpdGggdGhlICpwb3NpdGl2ZSogY2hhbmdlIGluIGF2ZXJhZ2UgcmFuayBvZiBhY3RpdmUgZWRpdG9ycyBjbGFzcywgKGIpIHRob3NlIHdpdGggdGhlICpuZWdhdGl2ZSogY2hhbmdlIGluIGF2ZXJhZ2UgcmFuayBvZiBhY3RpdmUgZWRpdG9ycyBjbGFzcywgYW5kIChjKSB0aG9zZSB3aXRoIHRoZSAqemVybyogY2hhbmdlIGluIGF2ZXJhZ2UgcmFuayBvZiBhY3RpdmUgZWRpdG9ycyBjbGFzcywgYW5kIGNyb3NzLXRhYnVsYXRlIHRoYXQgaW5mb3JtYXRpb24gd2l0aCBHbG9iYWwgTm9ydGggdnMgR2xvYmFsIFNvdXRoLCB3ZSBmaW5kIG91dCB0aGF0IGAxNi45NSVgIG9mIGNvdW50cmllcyBpbiB0aGUgR2xvYmFsIE5vcnRoIGFuZCBgMTMuNTQlYCBvZiBjb3VudHJpZXMgaW4gdGhlIEdsb2JhbCBTb3V0aCBoYWQgYW4gb3ZlcmFsbCAqKm5lZ2F0aXZlKiogY2hhbmdlIGluIHRoZSBwcmV2aW91cyB0d2VsdmUgbW9udGhzLCB3aGlsZSBgNS4wOSVgIG9mIGNvdW50cmllcyBpbiB0aGUgR2xvYmFsIE5vcnRoIGFuZCBgMjMuOTYlYCBvZiBjb3VudHJpZXMgaW4gdGhlIEdsb2JhbCBTb3V0aCBoYWQgYW4gb3ZlcmFsbCAqKnBvc2l0aXZlKiogY2hhbmdlIGluIHRoZSBwcmV2aW91cyB0d2VsdmUgbW9udGhzLgoKYGBge3IsIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9CnJhbmtzX2NoYW5nZV9jb3VudHJ5JGNoYW5nZV9jbGFzcyA8LSBzYXBwbHkocmFua3NfY2hhbmdlX2NvdW50cnkkYXZnX3JjLCBmdW5jdGlvbih4KSB7CiAgaWYgKHggPT0gMCkgewogICAgcmV0dXJuKCJaZXJvIikKICB9IGVsc2UgaWYgKHggPCAwKSB7CiAgICByZXR1cm4oIk5lZ2F0aXZlIikKICB9IGVsc2UgewogICAgcmV0dXJuKCJQb3NpdGl2ZSIpCiAgfQp9KQpyYW5rc19jaGFuZ2VfY291bnRyeV90YWJsZSA8LSBhcy5kYXRhLmZyYW1lKAogIHRhYmxlKHJhbmtzX2NoYW5nZV9jb3VudHJ5JGdsb2JhbCwKICAgICAgICByYW5rc19jaGFuZ2VfY291bnRyeSRjaGFuZ2VfY2xhc3MpCiAgKQpjb2xuYW1lcyhyYW5rc19jaGFuZ2VfY291bnRyeV90YWJsZSkgPC0gCiAgYygiR2xvYmFsIiwgIkNoYW5nZSIsICJDb3VudHJpZXMiKQpyYW5rc19jaGFuZ2VfY291bnRyeV90YWJsZSRQZXJjZW50IDwtIAogIGlmZWxzZShyYW5rc19jaGFuZ2VfY291bnRyeV90YWJsZSRHbG9iYWwgPT0gIkdsb2JhbCBOb3J0aCIsIAogICAgICAgICByb3VuZChyYW5rc19jaGFuZ2VfY291bnRyeV90YWJsZSRDb3VudHJpZXMvbl9nbG9iYWxfbm9ydGgqMTAwLCAzKSwKICAgICAgICAgcm91bmQocmFua3NfY2hhbmdlX2NvdW50cnlfdGFibGUkQ291bnRyaWVzL25fZ2xvYmFsX3NvdXRoKjEwMCwgMykKICApCnJhbmtzX2NoYW5nZV9jb3VudHJ5X3RhYmxlIDwtIHJhbmtzX2NoYW5nZV9jb3VudHJ5X3RhYmxlICU+JSAKICBkcGx5cjo6YXJyYW5nZShHbG9iYWwsIGRlc2MoUGVyY2VudCkpCkRUOjpkYXRhdGFibGUocmFua3NfY2hhbmdlX2NvdW50cnlfdGFibGUpICAKYGBgCgpgYGB7ciwgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0KZ2dwbG90KHJhbmtzX2NoYW5nZV9jb3VudHJ5X3RhYmxlLCAKICAgICAgIGFlcyh4ID0gQ2hhbmdlLAogICAgICAgICAgIHkgPSBQZXJjZW50LAogICAgICAgICAgIGNvbG9yID0gQ2hhbmdlLCAKICAgICAgICAgICBmaWxsID0gQ2hhbmdlKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCAKICAgICAgICAgICBwb3NpdGlvbiA9ICJzdGFjayIpICsgCiAgZmFjZXRfd3JhcCh+R2xvYmFsKSArIAogIHhsYWIoIkNoYW5nZSIpICsgeWxhYigiJSBjb3VudHJpZXMiKSArIAogIGdndGl0bGUoIkFjdGl2ZSBFZGl0b3JzIikgKyAKICB0aGVtZV9idygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkgKyAKICB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X2JsYW5rKCkpICsgCiAgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSkgKwogIHRoZW1lKHN0cmlwLmJhY2tncm91bmQgPSAgZWxlbWVudF9ibGFuaygpKSArIAogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwLCBoanVzdCA9IC41KSkKYGBgCgpXZSBjYW4gY29uY2x1ZGUgdGhhdCBhIGxhcmdlIHBlcmNlbnQgKGAyMy45NiVgKSBvZiB0aGUgY291bnRyaWVzIGluIHRoZSBHbG9iYWwgU291dGggd2VyZSBleHBhbmRpbmcgdGhlIGV4dGVudCBvZiB0aGVpciBjb250cmlidXRpb25zIHRvIFdpa2lkYXRhLCBpbiBnZW5lcmFsLCBidXQgYWxzbyB0aGF0IG5vdCBhIHNtYWxsIHBlcmNlbnQgb2YgdGhlbSAoYDEzLjU0JWApIHdlcmUgY29udHJpYnV0aW5nIGxlc3MgYW5kIGxlc3MgaW4gZ2VuZXJhbC4gVGFraW5nIHRoZSBwZXJzcGVjdGl2ZSBvZiB0aGUgR2xvYmFsIFNvdXRoLCB0aGUgY29udHJpYnV0aW9ucyBmcm9tIHRoZSBmb2xsb3dpbmcgY291bnRyaWVzIHNlZW0gdG8gYmUgKmNyaXRpY2FsKiBpbiBhIHdheTsgYWxsIG9mIHRoZW0gaGFkIGEgbmVnYXRpdmUgY2hhbmdlIGluIHRoZSBhdmVyYWdlIHJhbmsgb2YgYWN0aXZlIGVkaXRvcnMgY2xhc3MgZnJvbSAyMDIwLzA5IHRvIDIwMjEvMDg6CgpgYGB7ciwgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0KRFQ6OmRhdGF0YWJsZShyYW5rc19jaGFuZ2VfY291bnRyeSAlPiUKICAgICAgICBkcGx5cjo6ZmlsdGVyKGdsb2JhbCA9PSAiR2xvYmFsIFNvdXRoIiwgCiAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VfY2xhc3MgPT0gIk5lZ2F0aXZlIikgJT4lCiAgICAgICAgZHBseXI6OnNlbGVjdChjb3VudHJ5X2NvZGUsIAogICAgICAgICAgICAgICAgICAgICAgY291bnRyeV9uYW1lLCAKICAgICAgICAgICAgICAgICAgICAgIGF2Z19yYykgJT4lIAogICAgICAgIGRwbHlyOjptdXRhdGUoY291bnRyeSA9IHBhc3RlMChjb3VudHJ5X25hbWUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICgiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRyeV9jb2RlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikiKSkgJT4lCiAgICAgICAgZHBseXI6OmFycmFuZ2UoYXZnX3JjKSAlPiUgCiAgICAgICAgZHBseXI6OnNlbGVjdChjb3VudHJ5LCBhdmdfcmMpCikKYGBgCgpXZSBub3cgcmVwZWF0IHRoZSB3aG9sZSBFZGl0b3IgQWN0aXZpdHkgTW9udGhseSBDaGFuZ2UgSW5kZXggYW5hbHlzaXMgZm9yIGVkaXRvciBhY3Rpdml0eSBpbiB0aGUgaXRlbXMgbmFtZXNwYWNlIChOUzowKS4KCiMjIyMgMS4yLjIuMiBJbiBpdGVtcyAoTlM6MCkgbmFtZXNwYWNlIG9ubHkKCkluIHRoZSBmb2xsb3dpbmcgY2hhcnQgd2UgdGFrZSB0aGUgKiphdmVyYWdlIG1vbnRobHkgY2hhbmdlKiogLSBhcyBkZXNjcmliZWQgLSAqKnBlciBtb250aCoqLCBhbmQgY29udHJhc3QgR2xvYmFsIE5vcnRoIHZzIEdsb2JhbCBTb3V0aCBvdmVyIHRpbWUsIGZvciBhY3RpdmUgZWRpdG9ycyBpbiB0aGUgKippdGVtcyAoTlM6MCkgbmFtZXNwYWNlIG9ubHkqKi4KCmBgYHtyLCBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQojIC0gd3JhbmdsZQphY3RpdmVfZWRzIDwtIGRhdGFfc2V0ICU+JSAKICBkcGx5cjo6c2VsZWN0KGNvdW50cnlfY29kZSwKICAgICAgICAgICAgICAgIGdsb2JhbCwgCiAgICAgICAgICAgICAgICBtb250aCwKICAgICAgICAgICAgICAgIGFjdGl2ZV9lZGl0b3JzX25zMCkgJT4lIAogIGRwbHlyOjpncm91cF9ieShjb3VudHJ5X2NvZGUsIGdsb2JhbCwgbW9udGgsIGFjdGl2ZV9lZGl0b3JzX25zMCkgJT4lIAogIGRwbHlyOjptdXRhdGUoY291bnQgPSBuKCkpICU+JSAKICB0aWR5cjo6cGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGFjdGl2ZV9lZGl0b3JzX25zMCwgCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlc19mcm9tID0gY291bnQsIAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXNfZmlsbCA9IDApICU+JQogIHRpZHlyOjpwaXZvdF9sb25nZXIoIWMoY291bnRyeV9jb2RlLCBnbG9iYWwsIG1vbnRoKSwKICAgICAgICAgICAgICAgICAgICAgIG5hbWVzX3RvID0gImFjdGl2ZV9lZGl0b3JzX25zMCIsCiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAiY291bnQiKQphY3RpdmVfZWRzJGFjdGl2ZV9lZGl0b3JzX25zMCA8LSBmYWN0b3IoYWN0aXZlX2VkcyRhY3RpdmVfZWRpdG9yc19uczAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIjAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIxIC0gMTAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIxMSAtIDIwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjEgLSAzMCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjMxIC0gNDAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI0MSAtIDUwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNTEgLSA2MCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjYxIC0gNzAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI3MSAtIDgwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODEgLSA5MCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjkxIC0gMTAwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPiAxMDAiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCmFjdGl2ZV9lZHMgPC0gYWN0aXZlX2VkcyAlPiUgCiAgZHBseXI6OmFycmFuZ2UoY291bnRyeV9jb2RlLCBnbG9iYWwsIG1vbnRoLCBhY3RpdmVfZWRpdG9yc19uczApIAphY3RpdmVfZWRzX2wgPC0gbGFwcGx5KHVuaXF1ZShhY3RpdmVfZWRzJGNvdW50cnlfY29kZSksIGZ1bmN0aW9uKHgpIHsKICBiIDwtIGxhcHBseSh1bmlxdWUoYWN0aXZlX2VkcyRnbG9iYWwpLCBmdW5jdGlvbih5KSB7CiAgICBhIDwtIGxhcHBseSh1bmlxdWUoYWN0aXZlX2VkcyRtb250aCksIGZ1bmN0aW9uKHopIHsKICAgICAgZCA8LSBhY3RpdmVfZWRzICU+JSAKICAgICAgICBkcGx5cjo6ZmlsdGVyKAogICAgICAgICAgY291bnRyeV9jb2RlID09IHgsCiAgICAgICAgICBnbG9iYWwgPT0geSwgCiAgICAgICAgICBtb250aCA9PSB6CiAgICAgICAgKQogICAgICB3IDwtIHdoaWNoKGQkY291bnQgPT0gMSkKICAgICAgaWYgKGxlbmd0aCh3KSA9PSAxKSB7CiAgICAgICAgZCA8LSBhcy5kYXRhLmZyYW1lKGRbdywgXSkKICAgICAgfSBlbHNlIHsKICAgICAgICBkIDwtIGRhdGEuZnJhbWUoY291bnRyeV9jb2RlID0geCwKICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsID0geSwKICAgICAgICAgICAgICAgICAgICAgICAgbW9udGggPSB6LAogICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVfZWRpdG9yc19uczAgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICBjb3VudCA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkKICAgICAgfQogICAgfSkKICAgIHJldHVybigKICAgICAgZGF0YS50YWJsZTo6cmJpbmRsaXN0KGEpCiAgICApCiAgfSkKICByZXR1cm4oCiAgICBkYXRhLnRhYmxlOjpyYmluZGxpc3QoYikKICApCn0pCmFjdGl2ZV9lZHNfbCA8LSBkYXRhLnRhYmxlOjpyYmluZGxpc3QoYWN0aXZlX2Vkc19sKQphY3RpdmVfZWRzX2wgPC0gYWN0aXZlX2Vkc19sICU+JSAKICBkcGx5cjo6YXJyYW5nZShjb3VudHJ5X2NvZGUsIGdsb2JhbCwgbW9udGgpCmFjdGl2ZV9lZHNfbCRjb3VudCA8LSBOVUxMCmFjdGl2ZV9lZHNfbCA8LSBjb3VudHJ5X2dsb2JhbCAlPiUgCiAgZHBseXI6OmxlZnRfam9pbihhY3RpdmVfZWRzX2wsIAogICAgICAgICAgICAgICAgICAgYnkgPSBjKCJjb3VudHJ5X2NvZGUiID0gImNvdW50cnlfY29kZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgImdsb2JhbCIgPSAiZ2xvYmFsIikpCnJhbmtzIDwtIGMoIjAiLAogICAgICAgICAgICIxIC0gMTAiLAogICAgICAgICAgICIxMSAtIDIwIiwKICAgICAgICAgICAiMjEgLSAzMCIsCiAgICAgICAgICAgIjMxIC0gNDAiLAogICAgICAgICAgICI0MSAtIDUwIiwKICAgICAgICAgICAiNTEgLSA2MCIsCiAgICAgICAgICAgIjYxIC0gNzAiLAogICAgICAgICAgICI3MSAtIDgwIiwKICAgICAgICAgICAiODEgLSA5MCIsCiAgICAgICAgICAgIjkxIC0gMTAwIiwKICAgICAgICAgICAiPiAxMDAiKQpyYW5rc19jaGFuZ2UgPC0gbGFwcGx5KHVuaXF1ZShhY3RpdmVfZWRzX2wkY291bnRyeV9jb2RlKSwgZnVuY3Rpb24oeCkgewogIGQgPC0gYXMuZGF0YS5mcmFtZSgKICAgIGFjdGl2ZV9lZHNfbCAlPiUKICAgICAgZHBseXI6OmZpbHRlcihjb3VudHJ5X2NvZGUgPT0geCkKICApICU+JSAKICAgIGRwbHlyOjphcnJhbmdlKG1vbnRoKQogIHJjIDwtIHZlY3Rvcihtb2RlID0gIm51bWVyaWMiLAogICAgICAgICAgICAgICBsZW5ndGggPSBkaW0oZClbMV0tMSkKICBmb3IgKGkgaW4gMjpkaW0oZClbMV0pIHsKICAgIHAxIDwtIHdoaWNoKHJhbmtzICVpbiUgZCRhY3RpdmVfZWRpdG9yc19uczBbaS0xXSkKICAgIHAyIDwtIHdoaWNoKHJhbmtzICVpbiUgZCRhY3RpdmVfZWRpdG9yc19uczBbaV0pCiAgICByY1tpLTFdIDwtIHAyIC0gcDEKICB9CiAgZCA8LSBkWzI6ZGltKGQpWzFdICwgXQogIGQkcmMgPC0gcmMKICByZXR1cm4oZCkKfSkKcmFua3NfY2hhbmdlIDwtIGRhdGEudGFibGU6OnJiaW5kbGlzdChyYW5rc19jaGFuZ2UpCnJhbmtzX2NoYW5nZV9nbG9iYWwgPC0gcmFua3NfY2hhbmdlICU+JSAKICBkcGx5cjo6c2VsZWN0KGdsb2JhbCwgbW9udGgsIHJjKSAlPiUgCiAgZHBseXI6Omdyb3VwX2J5KGdsb2JhbCwgbW9udGgpICU+JSAKICBkcGx5cjo6c3VtbWFyaXNlKGF2Z19yYyA9IG1lYW4ocmMpLCAKICAgICAgICAgICAgICAgICAgIHNkX3JjID0gc2QocmMpKQojIC0gY2hhcnQKZ2dwbG90Mjo6Z2dwbG90KHJhbmtzX2NoYW5nZV9nbG9iYWwsIAogICAgICAgICAgICAgICAgYWVzKHggPSBtb250aCwKICAgICAgICAgICAgICAgICAgICB5ID0gYXZnX3JjLAogICAgICAgICAgICAgICAgICAgIGdyb3VwID0gZ2xvYmFsLAogICAgICAgICAgICAgICAgICAgIGZpbGwgPSBnbG9iYWwsCiAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBnbG9iYWwsIAogICAgICAgICAgICAgICAgICAgIGxhYmVsID0gcm91bmQoYXZnX3JjLCAzKSkpICsKICBnZW9tX2xpbmUoc2l6ZSA9IC4yNSkgKyAKICBnZW9tX3BvaW50KCkgKwogIGdncmVwZWw6Omdlb21fdGV4dF9yZXBlbChzaXplID0gMywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3cubGVnZW5kID0gRkFMU0UpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiZGFya2JsdWUiLCAiZGFya29yYW5nZSIpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiZGFya2JsdWUiLCAiZGFya29yYW5nZSIpKSArCiAgeGxhYigiTW9udGgiKSArIHlsYWIoIkF2ZXJhZ2UgUmFuayBDaGFuZ2UiKSArIAogIGdndGl0bGUoIkFjdGl2ZSBFZGl0b3JzIGluIHRoZSBJdGVtcyBOYW1lc3BhY2UgKE5TOjApOiBBdmVyYWdlIFJhbmsgQ2hhbmdlXG5vZiBBY3RpdmUgRWRpdG9ycyBDbGFzcyIpICsgCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpICsgCiAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9ibGFuaygpKSArIAogIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNykpICsKICB0aGVtZShzdHJpcC5iYWNrZ3JvdW5kID0gIGVsZW1lbnRfYmxhbmsoKSkgKyAKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCwgaGp1c3QgPSAuNSkpCmBgYCAKQWdhaW4sIG5vIG9idmlvdXMgcGF0dGVybiBlbWVyZ2VzIGZyb20gdGhlIGFuYWx5c2lzIG9mIHRoZSBhZ2dyZWdhdGVkIGRhdGEuIE5vdyB3ZSB0YWtlIGEgZGl2ZSBpbnRvIHRoZSBwZXItY291bnRyeSBhbmFseXNpcy4KClRoZSBwZXItY291bnRyeSBkYXRhIGFyZSBnaXZlbiBpbiB0aGUgZm9sbG93aW5nIHRhYmxlOgoKYGBge3IsIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9CnJhbmtzX2NoYW5nZV9jb3VudHJ5IDwtIHJhbmtzX2NoYW5nZSAlPiUgCiAgZHBseXI6OnNlbGVjdChjb3VudHJ5X2NvZGUsIGdsb2JhbCwgbW9udGgsIHJjKSAlPiUgCiAgZHBseXI6Omdyb3VwX2J5KGNvdW50cnlfY29kZSwgZ2xvYmFsKSAlPiUgCiAgZHBseXI6OnN1bW1hcmlzZShhdmdfcmMgPSBtZWFuKHJjKSkgJT4lIAogIGRwbHlyOjphcnJhbmdlKGRlc2MoYXZnX3JjKSkKY291bnRyeV9nbG9iYWxfMiA8LSBkYXRhX3NldCAlPiUgCiAgZHBseXI6OnNlbGVjdChjb3VudHJ5X2NvZGUsCiAgICAgICAgICAgICAgICBjb3VudHJ5X25hbWUsCiAgICAgICAgICAgICAgICBnbG9iYWwpCmNvdW50cnlfZ2xvYmFsXzIgPC0gY291bnRyeV9nbG9iYWxfMlshZHVwbGljYXRlZChjb3VudHJ5X2dsb2JhbF8yKSwgXQpyYW5rc19jaGFuZ2VfY291bnRyeSA8LSBjb3VudHJ5X2dsb2JhbF8yICU+JSAKICBkcGx5cjo6bGVmdF9qb2luKHJhbmtzX2NoYW5nZV9jb3VudHJ5LCAKICAgICAgICAgICAgICAgICAgIGJ5ID0gYygiY291bnRyeV9jb2RlIiA9ICJjb3VudHJ5X2NvZGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJnbG9iYWwiID0gImdsb2JhbCIpKSAlPiUgCiAgZHBseXI6OmFycmFuZ2UoZGVzYyhhdmdfcmMpKQpEVDo6ZGF0YXRhYmxlKHJhbmtzX2NoYW5nZV9jb3VudHJ5KQpgYGAKCkFnYWluLCBzcGxpdCB0aGUgY291bnRyaWVzIGludG8gKGEpIHRob3NlIHdpdGggdGhlICpwb3NpdGl2ZSogY2hhbmdlIGluIGF2ZXJhZ2UgcmFuayBvZiBhY3RpdmUgZWRpdG9ycyBjbGFzcywgKGIpIHRob3NlIHdpdGggdGhlICpuZWdhdGl2ZSogY2hhbmdlIGluIGF2ZXJhZ2UgcmFuayBvZiBhY3RpdmUgZWRpdG9ycyBjbGFzcywgYW5kIChjKSB0aG9zZSB3aXRoIHRoZSAqemVybyogY2hhbmdlIGluIGF2ZXJhZ2UgcmFuayBvZiBhY3RpdmUgZWRpdG9ycyBjbGFzcywgYW5kIGNyb3NzLXRhYnVsYXRlIHRoYXQgaW5mb3JtYXRpb24gd2l0aCBHbG9iYWwgTm9ydGggdnMgR2xvYmFsIFNvdXRoOgoKYGBge3IsIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9CnJhbmtzX2NoYW5nZV9jb3VudHJ5JGNoYW5nZV9jbGFzcyA8LSBzYXBwbHkocmFua3NfY2hhbmdlX2NvdW50cnkkYXZnX3JjLCBmdW5jdGlvbih4KSB7CiAgaWYgKHggPT0gMCkgewogICAgcmV0dXJuKCJaZXJvIikKICB9IGVsc2UgaWYgKHggPCAwKSB7CiAgICByZXR1cm4oIk5lZ2F0aXZlIikKICB9IGVsc2UgewogICAgcmV0dXJuKCJQb3NpdGl2ZSIpCiAgfQp9KQpyYW5rc19jaGFuZ2VfY291bnRyeV90YWJsZSA8LSBhcy5kYXRhLmZyYW1lKAogIHRhYmxlKHJhbmtzX2NoYW5nZV9jb3VudHJ5JGdsb2JhbCwKICAgICAgICByYW5rc19jaGFuZ2VfY291bnRyeSRjaGFuZ2VfY2xhc3MpCiAgKQpjb2xuYW1lcyhyYW5rc19jaGFuZ2VfY291bnRyeV90YWJsZSkgPC0gCiAgYygiR2xvYmFsIiwgIkNoYW5nZSIsICJDb3VudHJpZXMiKQpyYW5rc19jaGFuZ2VfY291bnRyeV90YWJsZSRQZXJjZW50IDwtIAogIGlmZWxzZShyYW5rc19jaGFuZ2VfY291bnRyeV90YWJsZSRHbG9iYWwgPT0gIkdsb2JhbCBOb3J0aCIsIAogICAgICAgICByb3VuZChyYW5rc19jaGFuZ2VfY291bnRyeV90YWJsZSRDb3VudHJpZXMvbl9nbG9iYWxfbm9ydGgqMTAwLCAzKSwKICAgICAgICAgcm91bmQocmFua3NfY2hhbmdlX2NvdW50cnlfdGFibGUkQ291bnRyaWVzL25fZ2xvYmFsX3NvdXRoKjEwMCwgMykKICApCnJhbmtzX2NoYW5nZV9jb3VudHJ5X3RhYmxlIDwtIHJhbmtzX2NoYW5nZV9jb3VudHJ5X3RhYmxlICU+JSAKICBkcGx5cjo6YXJyYW5nZShHbG9iYWwsIGRlc2MoUGVyY2VudCkpCkRUOjpkYXRhdGFibGUocmFua3NfY2hhbmdlX2NvdW50cnlfdGFibGUpICAKYGBgCgpgYGB7ciwgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0KZ2dwbG90KHJhbmtzX2NoYW5nZV9jb3VudHJ5X3RhYmxlLCAKICAgICAgIGFlcyh4ID0gQ2hhbmdlLAogICAgICAgICAgIHkgPSBQZXJjZW50LAogICAgICAgICAgIGNvbG9yID0gQ2hhbmdlLCAKICAgICAgICAgICBmaWxsID0gQ2hhbmdlKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCAKICAgICAgICAgICBwb3NpdGlvbiA9ICJzdGFjayIpICsgCiAgZmFjZXRfd3JhcCh+R2xvYmFsKSArIAogIHhsYWIoIkNoYW5nZSIpICsgeWxhYigiJSBjb3VudHJpZXMiKSArIAogIGdndGl0bGUoIkFjdGl2ZSBFZGl0b3JzIGluIHRoZSBJdGVtcyBOYW1lc3BhY2UgKE5TOjApIikgKyAKICB0aGVtZV9idygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkgKyAKICB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X2JsYW5rKCkpICsgCiAgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSkgKwogIHRoZW1lKHN0cmlwLmJhY2tncm91bmQgPSAgZWxlbWVudF9ibGFuaygpKSArIAogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwLCBoanVzdCA9IC41KSkKYGBgCgpUaGUgcmVzdWx0cyBpbiB0aGUgaXRlbXMgbmFtZXNwYWNlIGFyZSBxdWl0ZSBzaW1pbGFyIHRvIHRob3NlIGZyb20gYWxsIG5hbWVzcGFjZXMuIFRoZSBsaXN0IG9mIGNvdW50cmllcyBpbiB0aGUgR2xvYmFsIFNvdXRoIHdpdGggdGhlIGhpZ2hlc3QgKipuZWdhdGl2ZSoqIGNoYW5nZSBpbiB0aGUgYXZlcmFnZSByYW5rIG9mIGFjdGl2ZSBlZGl0b3JzIGNsYXNzIGZyb20gMjAyMC8wOSB0byAyMDIxLzA4ICoqaW4gdGhlIGl0ZW1zIChOUzowKSBuYW1lc3BhY2UqKiBmb2xsb3dzLgoKYGBge3IsIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9CkRUOjpkYXRhdGFibGUocmFua3NfY2hhbmdlX2NvdW50cnkgJT4lCiAgICAgICAgZHBseXI6OmZpbHRlcihnbG9iYWwgPT0gIkdsb2JhbCBTb3V0aCIsIAogICAgICAgICAgICAgICAgICAgICAgY2hhbmdlX2NsYXNzID09ICJOZWdhdGl2ZSIpICU+JQogICAgICAgIGRwbHlyOjpzZWxlY3QoY291bnRyeV9jb2RlLCAKICAgICAgICAgICAgICAgICAgICAgIGNvdW50cnlfbmFtZSwgCiAgICAgICAgICAgICAgICAgICAgICBhdmdfcmMpICU+JSAKICAgICAgICBkcGx5cjo6bXV0YXRlKGNvdW50cnkgPSBwYXN0ZTAoY291bnRyeV9uYW1lLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAoIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cnlfY29kZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpIikpICU+JQogICAgICAgIGRwbHlyOjphcnJhbmdlKGF2Z19yYykgJT4lIAogICAgICAgIGRwbHlyOjpzZWxlY3QoY291bnRyeSwgYXZnX3JjKQopCmBgYAoKIyMgMi4gRWRpdHMKCiMjIyAyLjEgRWRpdHMgRGF0YXNldAoKVGhlICoqRWRpdHMqKiBkYXRhc2V0IHByZXNlbnRzIGRhdGEgb24gdGhlIG51bWJlciBvZiByZXZpc2lvbnMgbWFkZSBwZXIgY291bnRyeS4KVGhlIGRhdGFzZXRzIGVuY29tcGFzc2VzIHRoZSBmb2xsb3dpbmcgZmllbGRzOgoKLSAqKmlkKiogLSB0aGUgb2JzZXJ2YXRpb24gSUQKLSAqKmNvdW50cnlfY29kZSoqIC0gdGhlIGNvdW50cnkgSVNPIDMxNjYgYWxwaGEtMiBjb2RlCi0gKiptb250aCoqIC0gdGhlIG9ic2VydmF0aW9uIHllYXIgYW5kIG1vbnRoIGluIHRoZSBgWVlZWS1NTWAgZm9ybWF0Ci0gKiplZGl0cyoqIC0gbnVtYmVyIG9mIGFjdGl2ZSBlZGl0b3JzIGV4cHJlc3NlZCBpbiBpbnRlcnZhbHM6IGAxLTEwMGAsIGAxMDEtMjAwYCwgYDIwMS0zMDBgLCBgMzAxLTQwMGAsIGA0MDEtNTAwYCwgYDUwMS02MDBgLCBgNjAxLTcwMGAsIGA3MDEtODAwYCwgYDgwMS05MDBgLCBgOTAxLTEwMDBgLCBgPiAxMDAwYAotICoqZWRpdHNfbnMwKiogLSBudW1iZXIgb2YgYWN0aXZlIGVkaXRvcnMgaW4gdGhlIGNvbnRlbnQgbmFtZXNwYWNlcyAoTlM6MCkgZXhwcmVzc2VkIGluIGludGVydmFsczogIGAxLTEwMGAsIGAxMDEtMjAwYCwgYDIwMS0zMDBgLCBgMzAxLTQwMGAsIGA0MDEtNTAwYCwgYDUwMS02MDBgLCBgNjAxLTcwMGAsIGA3MDEtODAwYCwgYDgwMS05MDBgLCBgOTAxLTEwMDBgLCBgPiAxMDAwYAoKYGBge3IsIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9CmRhdGFfc2V0IDwtIHJlYWRyOjpyZWFkX2NzdihwYXN0ZTAoYW5hbHl0aWNzRGlyLCByZXZpc2lvbnNfZmlsZW5hbWUpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbF90eXBlcyA9IGNvbHMoKSkKY29sbmFtZXMoZGF0YV9zZXQpWzFdIDwtICJpZCIKRFQ6OmRhdGF0YWJsZShkYXRhX3NldCkKYGBgCkluIHRoZSBuZXh0IHN0ZXAsIHdlIGVucmljaCB0aGUgKipFZGl0b3JzKiogZGF0YXNldCBieSBhZGRpbmcgKGEpIGNvdW50cnkgbmFtZXMsIGFuZCAoYikgaW5jbHVkaW5nIGluZm9ybWF0aW9uIG9uIEdsb2JhbCBOb3J0aC9HbG9iYWwgU291dGggY2xhc3NpZmljYXRpb24gKHNlZSBbTGlzdCBvZiBjb3VudHJpZXMgYnkgcmVnaW9uYWwgY2xhc3NpZmljYXRpb25dKGh0dHBzOi8vbWV0YS53aWtpbWVkaWEub3JnL3dpa2kvTGlzdF9vZl9jb3VudHJpZXNfYnlfcmVnaW9uYWxfY2xhc3NpZmljYXRpb24pKS4gVGhlIFtCcmFuZHQgTGluZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQnJhbmR0X1JlcG9ydCNUaGVfQnJhbmR0X0xpbmUpIHdhcyB1c2VkIHRvIGVzdGFibGlzaCB0aGUgR2xvYmFsIE5vcnRoIHZzIEdsb2JhbCBTb3V0aCBkaWNob3RvbXkgaW4gY2FzZXMgbm90IGltbWVkaWF0ZWx5IGV2aWRlbnQgZnJvbSB0aGUgZGF0YS4KCmBgYHtyLCBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQojIC0gc2NyYXBlIE1ldGE6IExpc3Qgb2YgY291bnRyaWVzIGJ5IHJlZ2lvbmFsIGNsYXNzaWZpY2F0aW9uIAp1cmwgPC0gJ2h0dHBzOi8vbWV0YS53aWtpbWVkaWEub3JnL3dpa2kvTGlzdF9vZl9jb3VudHJpZXNfYnlfcmVnaW9uYWxfY2xhc3NpZmljYXRpb24nCmdzbl9saXN0IDwtIGh0bWx0YWI6Omh0bWx0YWIodXJsLCAxKQojIC0gbG9hZCBJU09jb2Rlczo6SVNPXzMxNjZfMQppc29fY29kZXMgPC0gSVNPY29kZXM6OklTT18zMTY2XzEKaXNvX2NvZGVzIDwtIGlzb19jb2RlcyAlPiUgCiAgZHBseXI6OnNlbGVjdChBbHBoYV8yLCBOYW1lKQojIC0gam9pbiBjb3VudHJ5IG5hbWVzCmRhdGFfc2V0IDwtIGRhdGFfc2V0ICU+JSAKICBkcGx5cjo6bGVmdF9qb2luKGlzb19jb2RlcywgCiAgICAgICAgICAgICAgICAgICBieSA9IGMoImNvdW50cnlfY29kZSIgPSAiQWxwaGFfMiIpKQpjb2xuYW1lcyhkYXRhX3NldClbNl0gPC0gImNvdW50cnlfbmFtZSIKIyAtIENvdW50cnkgbmFtZSBmb3IgS29zb3ZvIChhbHBoYS0yIGlzICJ4ayIpIAojIC0gaXMgbm90IGZvdW5kIGluIElTT2NvZGVzOjpJU09fMzE2Nl8xLCBmaXg6CncgPC0gd2hpY2goaXMubmEoZGF0YV9zZXQkY291bnRyeV9uYW1lKSkKZGF0YV9zZXQkY291bnRyeV9uYW1lW3ddIDwtICJLb3Nvdm8iCiMgLSBqb2luIEdsb2JhbCBOb3J0aC9HbG9iYWwgU291dGgKZGF0YV9zZXQgPC0gZGF0YV9zZXQgJT4lIAogIGRwbHlyOjpsZWZ0X2pvaW4oZ3NuX2xpc3QsIAogICAgICAgICAgICAgICAgICAgYnkgPSBjKCJjb3VudHJ5X25hbWUiID0gIkNvdW50cnkiKSkKY29sbmFtZXMoZGF0YV9zZXQpWzddIDwtICJyZWdpb24iCmNvbG5hbWVzKGRhdGFfc2V0KVs4XSA8LSAiZ2xvYmFsIgojIC0gZmluZCB1bm1hdGNoZWQgY291bnRyaWVzLCBmaXg6CncgPC0gd2hpY2goaXMubmEoZGF0YV9zZXQkZ2xvYmFsKSkKIyAtIHVuaXF1ZShkYXRhX3NldCRjb3VudHJ5X25hbWVbd10pCncgPC0gd2hpY2goZGF0YV9zZXQkY291bnRyeV9uYW1lID09ICLDhWxhbmQgSXNsYW5kcyIpCmRhdGFfc2V0JGdsb2JhbFt3XSA8LSAiR2xvYmFsIE5vcnRoIgpkYXRhX3NldCRyZWdpb25bd10gPC0gIkV1cm9wZSIKdyA8LSB3aGljaChkYXRhX3NldCRjb3VudHJ5X25hbWUgPT0gIkJvbGl2aWEsIFBsdXJpbmF0aW9uYWwgU3RhdGUgb2YiKQpkYXRhX3NldCRnbG9iYWxbd10gPC0gIkdsb2JhbCBTb3V0aCIKZGF0YV9zZXQkcmVnaW9uW3ddIDwtICJTb3V0aC9MYXRpbiBBbWVyaWNhIgp3IDwtIHdoaWNoKGRhdGFfc2V0JGNvdW50cnlfbmFtZSA9PSAiQm9uYWlyZSwgU2ludCBFdXN0YXRpdXMgYW5kIFNhYmEiKQpkYXRhX3NldCRnbG9iYWxbd10gPC0gIkdsb2JhbCBTb3V0aCIKZGF0YV9zZXQkcmVnaW9uW3ddIDwtICJTb3V0aC9MYXRpbiBBbWVyaWNhIgp3IDwtIHdoaWNoKGRhdGFfc2V0JGNvdW50cnlfbmFtZSA9PSAiQ8O0dGUgZCdJdm9pcmUiKQpkYXRhX3NldCRnbG9iYWxbd10gPC0gIkdsb2JhbCBTb3V0aCIKZGF0YV9zZXQkcmVnaW9uW3ddIDwtICJBZnJpY2EiCncgPC0gd2hpY2goZGF0YV9zZXQkY291bnRyeV9uYW1lID09ICJDdXJhw6dhbyIpCmRhdGFfc2V0JGdsb2JhbFt3XSA8LSAiR2xvYmFsIFNvdXRoIgpkYXRhX3NldCRyZWdpb25bd10gPC0gIlNvdXRoL0xhdGluIEFtZXJpY2EiCncgPC0gd2hpY2goZGF0YV9zZXQkY291bnRyeV9uYW1lID09ICJDemVjaGlhIikKZGF0YV9zZXQkZ2xvYmFsW3ddIDwtICJHbG9iYWwgTm9ydGgiCmRhdGFfc2V0JHJlZ2lvblt3XSA8LSAiRXVyb3BlIgp3IDwtIHdoaWNoKGRhdGFfc2V0JGNvdW50cnlfbmFtZSA9PSAiTm9ydGggTWFjZWRvbmlhIikKZGF0YV9zZXQkZ2xvYmFsW3ddIDwtICJHbG9iYWwgTm9ydGgiCmRhdGFfc2V0JHJlZ2lvblt3XSA8LSAiRXVyb3BlIgp3IDwtIHdoaWNoKGRhdGFfc2V0JGNvdW50cnlfbmFtZSA9PSAiTWFjYW8iKQpkYXRhX3NldCRnbG9iYWxbd10gPC0gIkdsb2JhbCBTb3V0aCIKZGF0YV9zZXQkcmVnaW9uW3ddIDwtICJBc2lhICYgUGFjaWZpYyIKdyA8LSB3aGljaChkYXRhX3NldCRjb3VudHJ5X25hbWUgPT0gIlBhbGVzdGluZSwgU3RhdGUgb2YiKQpkYXRhX3NldCRnbG9iYWxbd10gPC0gIkdsb2JhbCBTb3V0aCIKZGF0YV9zZXQkcmVnaW9uW3ddIDwtICJNaWRkbGUgZWFzdCIKdyA8LSB3aGljaChkYXRhX3NldCRjb3VudHJ5X25hbWUgPT0gIlLDqXVuaW9uIikKZGF0YV9zZXQkZ2xvYmFsW3ddIDwtICJHbG9iYWwgU291dGgiCmRhdGFfc2V0JHJlZ2lvblt3XSA8LSAiQXNpYSAmIFBhY2lmaWMiCncgPC0gd2hpY2goZGF0YV9zZXQkY291bnRyeV9uYW1lID09ICJFc3dhdGluaSIpCmRhdGFfc2V0JGdsb2JhbFt3XSA8LSAiR2xvYmFsIFNvdXRoIgpkYXRhX3NldCRyZWdpb25bd10gPC0gIkFmcmljYSIKdyA8LSB3aGljaChkYXRhX3NldCRjb3VudHJ5X25hbWUgPT0gIlRhaXdhbiwgUHJvdmluY2Ugb2YgQ2hpbmEiKQpkYXRhX3NldCRnbG9iYWxbd10gPC0gIkdsb2JhbCBOb3J0aCIKZGF0YV9zZXQkcmVnaW9uW3ddIDwtICJBc2lhICYgUGFjaWZpYyIKdyA8LSB3aGljaChkYXRhX3NldCRjb3VudHJ5X25hbWUgPT0gIktvc292byIpCmRhdGFfc2V0JGdsb2JhbFt3XSA8LSAiR2xvYmFsIE5vcnRoIgpkYXRhX3NldCRyZWdpb25bd10gPC0gIkV1cm9wZSIKdyA8LSB3aGljaChkYXRhX3NldCRjb3VudHJ5X25hbWUgPT0gIlNhaW50IEJhcnRow6lsZW15IikKZGF0YV9zZXQkZ2xvYmFsW3ddIDwtICJHbG9iYWwgU291dGgiCmRhdGFfc2V0JHJlZ2lvblt3XSA8LSAiU291dGgvTGF0aW4gQW1lcmljYSIKdyA8LSB3aGljaChkYXRhX3NldCRjb3VudHJ5X25hbWUgPT0gIkNhYm8gVmVyZGUiKQpkYXRhX3NldCRnbG9iYWxbd10gPC0gIkdsb2JhbCBTb3V0aCIKZGF0YV9zZXQkcmVnaW9uW3ddIDwtICJBZnJpY2EiCncgPC0gd2hpY2goZGF0YV9zZXQkY291bnRyeV9uYW1lID09ICJTaW50IE1hYXJ0ZW4gKER1dGNoIHBhcnQpIikKZGF0YV9zZXQkZ2xvYmFsW3ddIDwtICJHbG9iYWwgU291dGgiCmRhdGFfc2V0JHJlZ2lvblt3XSA8LSAiU291dGgvTGF0aW4gQW1lcmljYSIKRFQ6OmRhdGF0YWJsZShkYXRhX3NldCkKYGBgCmBgYHtyLCBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQojIC0ga2VlcCBHbG9iYWwgTm9ydGgvR2xvYmFsIFNvdXRoIGRhdGEKY291bnRyeV9nbG9iYWwgPC0gZGF0YV9zZXQgJT4lIAogIGRwbHlyOjpzZWxlY3QoY291bnRyeV9jb2RlLCAKICAgICAgICAgICAgICAgIGdsb2JhbCkKY291bnRyeV9nbG9iYWwgPC0gY291bnRyeV9nbG9iYWxbIWR1cGxpY2F0ZWQoY291bnRyeV9nbG9iYWwpLCBdCmBgYAoKIyMjIDIuMiBFZGl0cyBBbmFseXNpcwoKYGBge3IsIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9Cm5fZ2xvYmFsX25vcnRoIDwtIHVuaXF1ZSgKICBkYXRhX3NldCRjb3VudHJ5X2NvZGVbZGF0YV9zZXQkZ2xvYmFsID09ICJHbG9iYWwgTm9ydGgiXQogICkKbl9nbG9iYWxfbm9ydGggPC0gbGVuZ3RoKG5fZ2xvYmFsX25vcnRoKQpuX2dsb2JhbF9zb3V0aCA8LSB1bmlxdWUoCiAgZGF0YV9zZXQkY291bnRyeV9jb2RlW2RhdGFfc2V0JGdsb2JhbCA9PSAiR2xvYmFsIFNvdXRoIl0KICApCm5fZ2xvYmFsX3NvdXRoIDwtIGxlbmd0aChuX2dsb2JhbF9zb3V0aCkKYGBgCgpXZSBmaW5kIGEgdG90YWwgb2YgYHIgbl9nbG9iYWxfbm9ydGggKyBuX2dsb2JhbF9zb3V0aGAgY291bnRyaWVzIGluIHRoZSBhbmFseXNpcywgb2Ygd2hpY2ggYHIgbl9nbG9iYWxfbm9ydGhgIGJlbG9uZyB0byB0aGUgR2xvYmFsIE5vcnRoIGFuZCBgciBuX2dsb2JhbF9zb3V0aGAgdG8gdGhlIEdsb2JhbCBTb3V0aC4KCiMjIyMgMi4yLjEgRWRpdCBDbGFzc2VzCgpUaGUgZm9sbG93aW5nIGNoYXJ0IHNob3dzIHRoZSBwZXJjZW50IG9mIGNvdW50cmllcyBpbiB0aGUgR2xvYmFsIE5vcnRoIGFuZCBHbG9iYWwgU291dGgsIGluIGVhY2ggbW9udGggZnJvbSBTZXB0ZW1iZXIgMjAyMCB0byBBdWd1c3QgMjAyMSwgd2hpY2ggd2VyZSBmb3VuZCBpbiB0aGUgcmVzcGVjdGl2ZSBlZGl0IGNhdGVnb3JpZXM6CgpgYGB7ciwgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0KIyAtIHdyYW5nbGUKYWN0aXZlX2VkcyA8LSBkYXRhX3NldCAlPiUgCiAgZHBseXI6OnNlbGVjdChnbG9iYWwsIAogICAgICAgICAgICAgICAgbW9udGgsCiAgICAgICAgICAgICAgICBlZGl0cykgJT4lIAogIGRwbHlyOjpncm91cF9ieShnbG9iYWwsIG1vbnRoLCBlZGl0cykgJT4lIAogIGRwbHlyOjpzdW1tYXJpc2UoY291bnQgPSBuKCkpICU+JSAKICB0aWR5cjo6cGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGVkaXRzLCAKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzX2Zyb20gPSBjb3VudCwgCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlc19maWxsID0gMCkgJT4lCiAgdGlkeXI6OnBpdm90X2xvbmdlcighYyhnbG9iYWwsIG1vbnRoKSwKICAgICAgICAgICAgICAgICAgICAgIG5hbWVzX3RvID0gImVkaXRzIiwKICAgICAgICAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJjb3VudCIpCmFjdGl2ZV9lZHMkcHJvcG9ydGlvbiA8LSBpZmVsc2UoYWN0aXZlX2VkcyRnbG9iYWwgPT0gIkdsb2JhbCBOb3J0aCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZV9lZHMkY291bnQvbl9nbG9iYWxfbm9ydGgsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZV9lZHMkY291bnQvbl9nbG9iYWxfc291dGgpCmFjdGl2ZV9lZHMkcGVyY2VudCA8LSByb3VuZChhY3RpdmVfZWRzJHByb3BvcnRpb24qMTAwLCAzKQoKIyAtIGNoYXJ0CmFjdGl2ZV9lZHMkZWRpdHMgPC0gZmFjdG9yKGFjdGl2ZV9lZHMkZWRpdHMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCIwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMSAtIDEwMCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIxMDEgLSAyMDAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjAxIC0gMzAwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMzAxIC0gNDAwIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjQwMSAtIDUwMCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI1MDEgLSA2MDAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNjAxIC0gNzAwIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjcwMSAtIDgwMCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4MDEgLSA5MDAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOTAxIC0gMTAwMCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI+IDEwMDAiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCmNvbG5hbWVzKGFjdGl2ZV9lZHMpWzNdIDwtICJFZGl0IENsYXNzZXMiCmdncGxvdDI6OmdncGxvdChhY3RpdmVfZWRzLCAKICAgICAgICAgICAgICAgIGFlcyh4ID0gbW9udGgsCiAgICAgICAgICAgICAgICAgICAgeSA9IHBlcmNlbnQsCiAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSBgRWRpdCBDbGFzc2VzYCwKICAgICAgICAgICAgICAgICAgICBmaWxsID0gYEVkaXQgQ2xhc3Nlc2AsCiAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBgRWRpdCBDbGFzc2VzYCkpICsKICBnZW9tX2xpbmUoc2l6ZSA9IC4yNSkgKyAKICBnZW9tX3BvaW50KCkgKyAKICBmYWNldF93cmFwKH5nbG9iYWwpICsgCiAgeGxhYigiTW9udGgiKSArIHlsYWIoIiUgY291bnRyaWVzIikgKyAKICBnZ3RpdGxlKCJFZGl0cyIpICsgCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpICsgCiAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9ibGFuaygpKSArIAogIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNykpICsKICB0aGVtZShzdHJpcC5iYWNrZ3JvdW5kID0gIGVsZW1lbnRfYmxhbmsoKSkgKyAKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCwgaGp1c3QgPSAuNSkpCmBgYAoKVGhlIHJlc3VsdCBxdWFsaXRhdGl2ZWx5IHJlcGxpY2F0ZXMgdGhlIGZpbmRpbmcgb2J0YWluZWQgZnJvbSB0aGUgcmVzcGVjdGl2ZSBhbmFseXNpcyBvZiBhY3RpdmUgZWRpdG9yIGNsYXNzZXMuIAoKVGhlIGZvbGxvd2luZyBjaGFydCBzaG93cyB0aGUgc2FtZSBkYXRhIGV4Y2VwdCBmb3Igbm93IHdlIGNvbnNpZGVyIG9ubHkgZWRpdHMgbWFkZSBpbiB0aGUgaXRlbXMgbmFtZXNwYWNlIChOUzowKS4KCmBgYHtyLCBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQojIC0gd3JhbmdsZQphY3RpdmVfZWRzIDwtIGRhdGFfc2V0ICU+JSAKICBkcGx5cjo6c2VsZWN0KGdsb2JhbCwgCiAgICAgICAgICAgICAgICBtb250aCwKICAgICAgICAgICAgICAgIGVkaXRzX25zMCkgJT4lIAogIGRwbHlyOjpncm91cF9ieShnbG9iYWwsIG1vbnRoLCBlZGl0c19uczApICU+JSAKICBkcGx5cjo6c3VtbWFyaXNlKGNvdW50ID0gbigpKSAlPiUgCiAgdGlkeXI6OnBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBlZGl0c19uczAsIAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXNfZnJvbSA9IGNvdW50LCAKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzX2ZpbGwgPSAwKSAlPiUKICB0aWR5cjo6cGl2b3RfbG9uZ2VyKCFjKGdsb2JhbCwgbW9udGgpLAogICAgICAgICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAiZWRpdHNfbnMwIiwKICAgICAgICAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJjb3VudCIpCmFjdGl2ZV9lZHMkcHJvcG9ydGlvbiA8LSBpZmVsc2UoYWN0aXZlX2VkcyRnbG9iYWwgPT0gIkdsb2JhbCBOb3J0aCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZV9lZHMkY291bnQvbl9nbG9iYWxfbm9ydGgsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZV9lZHMkY291bnQvbl9nbG9iYWxfc291dGgpCmFjdGl2ZV9lZHMkcGVyY2VudCA8LSByb3VuZChhY3RpdmVfZWRzJHByb3BvcnRpb24qMTAwLCAzKQoKIyAtIGNoYXJ0CmFjdGl2ZV9lZHMkZWRpdHNfbnMwIDwtIGZhY3RvcihhY3RpdmVfZWRzJGVkaXRzX25zMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIjAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIxIC0gMTAwIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEwMSAtIDIwMCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMDEgLSAzMDAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIzMDEgLSA0MDAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNDAxIC0gNTAwIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjUwMSAtIDYwMCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI2MDEgLSA3MDAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNzAxIC0gODAwIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjgwMSAtIDkwMCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI5MDEgLSAxMDAwIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIj4gMTAwMCIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKY29sbmFtZXMoYWN0aXZlX2VkcylbM10gPC0gIkVkaXQgQ2xhc3NlcyIKZ2dwbG90Mjo6Z2dwbG90KGFjdGl2ZV9lZHMsIAogICAgICAgICAgICAgICAgYWVzKHggPSBtb250aCwKICAgICAgICAgICAgICAgICAgICB5ID0gcGVyY2VudCwKICAgICAgICAgICAgICAgICAgICBncm91cCA9IGBFZGl0IENsYXNzZXNgLAogICAgICAgICAgICAgICAgICAgIGZpbGwgPSBgRWRpdCBDbGFzc2VzYCwKICAgICAgICAgICAgICAgICAgICBjb2xvciA9IGBFZGl0IENsYXNzZXNgKSkgKwogIGdlb21fbGluZShzaXplID0gLjI1KSArIAogIGdlb21fcG9pbnQoKSArIAogIGZhY2V0X3dyYXAofmdsb2JhbCkgKyAKICB4bGFiKCJNb250aCIpICsgeWxhYigiJSBjb3VudHJpZXMiKSArIAogIGdndGl0bGUoIkVkaXRzIGluIHRoZSBJdGVtcyBOYW1lc3BhY2UgKE5TOjApIikgKyAKICB0aGVtZV9idygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkgKyAKICB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X2JsYW5rKCkpICsgCiAgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSkgKwogIHRoZW1lKHN0cmlwLmJhY2tncm91bmQgPSAgZWxlbWVudF9ibGFuaygpKSArIAogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwLCBoanVzdCA9IC41KSkKYGBgCkFzIHdlIGNhbiBzZWUsIHRoZSByZXN1bHQgaXMgKHF1YWxpdGF0aXZlbHksIGFuZCBhbG1vc3QgZnVsbHkpIHJlcGxpY2F0ZWQgd2hlbiBsb29raW5nIGludG8gdGhlIGl0ZW1zIG5hbWVzcGFjZSBvbmx5LgoKIyMjIyAyLjIuMiBBdmVyYWdlIEVkaXRzIFJhbmsKClRoZSBhbmFseXNpcyBmb2xsb3dzIHRoZSBzYW1lIGxvZ2ljIGFzIGV4cGxhaW5lZCBpbiBzZWN0aW9uICoqMS4yLjIqKiBleGNlcHQgZm9yIHRoZSBkaWZmZXJlbmNlIGluIHRoZSBpbnRlcnZhbHMgdXNlZCBmb3IgdGhlIGVkaXQgY2xhc3Nlcy4KCmBgYHtyLCBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQojIC0gd3JhbmdsZQphY3RpdmVfZWRzIDwtIGRhdGFfc2V0ICU+JSAKICBkcGx5cjo6c2VsZWN0KGdsb2JhbCwgCiAgICAgICAgICAgICAgICBtb250aCwKICAgICAgICAgICAgICAgIGVkaXRzKQphY3RpdmVfZWRzJGVkaXRzIDwtIGRwbHlyOjpyZWNvZGUoYWN0aXZlX2VkcyRlZGl0cywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMCIgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEgLSAxMDAiID0gMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIxMDEgLSAyMDAiID0gMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMDEgLSAzMDAiID0gNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIzMDEgLSA0MDAiID0gNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI0MDEgLSA1MDAiID0gNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI1MDEgLSA2MDAiID0gNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI2MDEgLSA3MDAiID0gOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI3MDEgLSA4MDAiID0gOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4MDEgLSA5MDAiID0gMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOTAxIC0gMTAwMCIgPSAxMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI+IDEwMDAiID0gMTIpCmFjdGl2ZV9lZHMgPC0gYWN0aXZlX2VkcyAlPiUgCiAgZHBseXI6OnNlbGVjdF9hbGwoKSAlPiUgCiAgZHBseXI6Omdyb3VwX2J5KGdsb2JhbCwgbW9udGgpICU+JSAKICBkcGx5cjo6c3VtbWFyaXNlKGF2ZXJhZ2VfcmFuayA9IG1lYW4oZWRpdHMpLCAKICAgICAgICAgICAgICAgICAgIHNkID0gc2QoZWRpdHMpKQojIC0gY2hhcnQKZ2dwbG90Mjo6Z2dwbG90KGFjdGl2ZV9lZHMsIAogICAgICAgICAgICAgICAgYWVzKHggPSBtb250aCwKICAgICAgICAgICAgICAgICAgICB5ID0gYXZlcmFnZV9yYW5rLAogICAgICAgICAgICAgICAgICAgIGdyb3VwID0gZ2xvYmFsLAogICAgICAgICAgICAgICAgICAgIGZpbGwgPSBnbG9iYWwsCiAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBnbG9iYWwpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIAogICAgICAgICAgIHdpZHRoID0gLjQsCiAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgpKSArCiAgeGxhYigiTW9udGgiKSArIHlsYWIoIkF2ZXJhZ2UgUmFuayIpICsgCiAgZ2d0aXRsZSgiRWRpdHMgQXZlcmFnZSBSYW5rIikgKyAKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiZGFya2JsdWUiLCAiZGFya29yYW5nZSIpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiZGFya2JsdWUiLCAiZGFya29yYW5nZSIpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpICsgCiAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9ibGFuaygpKSArIAogIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNykpICsKICB0aGVtZShzdHJpcC5iYWNrZ3JvdW5kID0gIGVsZW1lbnRfYmxhbmsoKSkgKyAKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCwgaGp1c3QgPSAuNSkpCmBgYApJbiB0aGUgZm9sbG93aW5nIGNoYXJ0IHdlIHJlcGxpY2F0ZSB0aGUgZmluZGluZyBjb25zaWRlcmluZyBlZGl0cyBpbiB0aGUgaXRlbXMgbmFtZXNwYWNlIChOUzowKSBvbmx5LgoKYGBge3IsIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9CiMgLSB3cmFuZ2xlCmFjdGl2ZV9lZHMgPC0gZGF0YV9zZXQgJT4lIAogIGRwbHlyOjpzZWxlY3QoZ2xvYmFsLCAKICAgICAgICAgICAgICAgIG1vbnRoLAogICAgICAgICAgICAgICAgZWRpdHNfbnMwKQphY3RpdmVfZWRzJGVkaXRzX25zMCA8LSBkcGx5cjo6cmVjb2RlKGFjdGl2ZV9lZHMkZWRpdHNfbnMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIwIiA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEgLSAxMDAiID0gMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTAxIC0gMjAwIiA9IDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwMSAtIDMwMCIgPSA0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIzMDEgLSA0MDAiID0gNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNDAxIC0gNTAwIiA9IDYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjUwMSAtIDYwMCIgPSA3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI2MDEgLSA3MDAiID0gOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNzAxIC0gODAwIiA9IDksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjgwMSAtIDkwMCIgPSAxMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOTAxIC0gMTAwMCIgPSAxMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPiAxMDAwIiA9IDEyKQphY3RpdmVfZWRzIDwtIGFjdGl2ZV9lZHMgJT4lIAogIGRwbHlyOjpzZWxlY3RfYWxsKCkgJT4lIAogIGRwbHlyOjpncm91cF9ieShnbG9iYWwsIG1vbnRoKSAlPiUgCiAgZHBseXI6OnN1bW1hcmlzZShhdmVyYWdlX3JhbmsgPSBtZWFuKGVkaXRzX25zMCksIAogICAgICAgICAgICAgICAgICAgc2QgPSBzZChlZGl0c19uczApKQojIC0gY2hhcnQKZ2dwbG90Mjo6Z2dwbG90KGFjdGl2ZV9lZHMsIAogICAgICAgICAgICAgICAgYWVzKHggPSBtb250aCwKICAgICAgICAgICAgICAgICAgICB5ID0gYXZlcmFnZV9yYW5rLAogICAgICAgICAgICAgICAgICAgIGdyb3VwID0gZ2xvYmFsLAogICAgICAgICAgICAgICAgICAgIGZpbGwgPSBnbG9iYWwsCiAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBnbG9iYWwpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIAogICAgICAgICAgIHdpZHRoID0gLjQsCiAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgpKSArCiAgeGxhYigiTW9udGgiKSArIHlsYWIoIkF2ZXJhZ2UgUmFuayIpICsgCiAgZ2d0aXRsZSgiRWRpdHMgQXZlcmFnZSBSYW5rIGluIHRoZSBJdGVtcyBOYW1lc3BhY2UgKE5TOjApIikgKyAKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiZGFya2JsdWUiLCAiZGFya29yYW5nZSIpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiZGFya2JsdWUiLCAiZGFya29yYW5nZSIpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpICsgCiAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9ibGFuaygpKSArIAogIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNykpICsKICB0aGVtZShzdHJpcC5iYWNrZ3JvdW5kID0gIGVsZW1lbnRfYmxhbmsoKSkgKyAKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCwgaGp1c3QgPSAuNSkpCmBgYAojIyMjIDIuMi4yIEVkaXRvciBBY3Rpdml0eSBNb250aGx5IENoYW5nZSBJbmRleAoKIyMjIyAyLjIuMi4xIEluIGFsbCBuYW1lc3BhY2VzCgpBZ2FpbiwgdGhlIGFuYWx5c2lzIGZvbGxvd3MgdGhlIHNhbWUgbG9naWMgaXMgZXhlbXBsaWZpZWQgaW4gdGhlIHJlc3BlY3RpdmUgYW5hbHlzaXMgb2YgdGhlIGFjdGl2ZSBlZGl0b3JzIGRhdGEuCgpgYGB7ciwgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0KIyAtIHdyYW5nbGUKYWN0aXZlX2VkcyA8LSBkYXRhX3NldCAlPiUgCiAgZHBseXI6OnNlbGVjdChjb3VudHJ5X2NvZGUsCiAgICAgICAgICAgICAgICBnbG9iYWwsIAogICAgICAgICAgICAgICAgbW9udGgsCiAgICAgICAgICAgICAgICBlZGl0cykgJT4lIAogIGRwbHlyOjpncm91cF9ieShjb3VudHJ5X2NvZGUsIGdsb2JhbCwgbW9udGgsIGVkaXRzKSAlPiUgCiAgZHBseXI6Om11dGF0ZShjb3VudCA9IG4oKSkgJT4lIAogIHRpZHlyOjpwaXZvdF93aWRlcihuYW1lc19mcm9tID0gZWRpdHMsIAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXNfZnJvbSA9IGNvdW50LCAKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzX2ZpbGwgPSAwKSAlPiUKICB0aWR5cjo6cGl2b3RfbG9uZ2VyKCFjKGNvdW50cnlfY29kZSwgZ2xvYmFsLCBtb250aCksCiAgICAgICAgICAgICAgICAgICAgICBuYW1lc190byA9ICJlZGl0cyIsCiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAiY291bnQiKQphY3RpdmVfZWRzJGVkaXRzIDwtIGZhY3RvcihhY3RpdmVfZWRzJGVkaXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCIwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMSAtIDEwMCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIxMDEgLSAyMDAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjAxIC0gMzAwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMzAxIC0gNDAwIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjQwMSAtIDUwMCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI1MDEgLSA2MDAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNjAxIC0gNzAwIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjcwMSAtIDgwMCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4MDEgLSA5MDAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOTAxIC0gMTAwMCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI+IDEwMDAiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCmFjdGl2ZV9lZHMgPC0gYWN0aXZlX2VkcyAlPiUgCiAgZHBseXI6OmFycmFuZ2UoY291bnRyeV9jb2RlLCBnbG9iYWwsIG1vbnRoLCBlZGl0cykgCmFjdGl2ZV9lZHNfbCA8LSBsYXBwbHkodW5pcXVlKGFjdGl2ZV9lZHMkY291bnRyeV9jb2RlKSwgZnVuY3Rpb24oeCkgewogIGIgPC0gbGFwcGx5KHVuaXF1ZShhY3RpdmVfZWRzJGdsb2JhbCksIGZ1bmN0aW9uKHkpIHsKICAgIGEgPC0gbGFwcGx5KHVuaXF1ZShhY3RpdmVfZWRzJG1vbnRoKSwgZnVuY3Rpb24oeikgewogICAgICBkIDwtIGFjdGl2ZV9lZHMgJT4lIAogICAgICAgIGRwbHlyOjpmaWx0ZXIoCiAgICAgICAgICBjb3VudHJ5X2NvZGUgPT0geCwKICAgICAgICAgIGdsb2JhbCA9PSB5LCAKICAgICAgICAgIG1vbnRoID09IHoKICAgICAgICApCiAgICAgIHcgPC0gd2hpY2goZCRjb3VudCA9PSAxKQogICAgICBpZiAobGVuZ3RoKHcpID09IDEpIHsKICAgICAgICBkIDwtIGFzLmRhdGEuZnJhbWUoZFt3LCBdKQogICAgICB9IGVsc2UgewogICAgICAgIGQgPC0gZGF0YS5mcmFtZShjb3VudHJ5X2NvZGUgPSB4LAogICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWwgPSB5LAogICAgICAgICAgICAgICAgICAgICAgICBtb250aCA9IHosCiAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRzID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCiAgICAgIH0KICAgIH0pCiAgICByZXR1cm4oCiAgICAgIGRhdGEudGFibGU6OnJiaW5kbGlzdChhKQogICAgKQogIH0pCiAgcmV0dXJuKAogICAgZGF0YS50YWJsZTo6cmJpbmRsaXN0KGIpCiAgKQp9KQphY3RpdmVfZWRzX2wgPC0gZGF0YS50YWJsZTo6cmJpbmRsaXN0KGFjdGl2ZV9lZHNfbCkKYWN0aXZlX2Vkc19sIDwtIGFjdGl2ZV9lZHNfbCAlPiUgCiAgZHBseXI6OmFycmFuZ2UoY291bnRyeV9jb2RlLCBnbG9iYWwsIG1vbnRoKQphY3RpdmVfZWRzX2wkY291bnQgPC0gTlVMTAphY3RpdmVfZWRzX2wgPC0gY291bnRyeV9nbG9iYWwgJT4lIAogIGRwbHlyOjpsZWZ0X2pvaW4oYWN0aXZlX2Vkc19sLCAKICAgICAgICAgICAgICAgICAgIGJ5ID0gYygiY291bnRyeV9jb2RlIiA9ICJjb3VudHJ5X2NvZGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJnbG9iYWwiID0gImdsb2JhbCIpKQpyYW5rcyA8LSBjKCIwIiwKICAgICAgICAgICAiMSAtIDEwMCIsCiAgICAgICAgICAgIjEwMSAtIDIwMCIsCiAgICAgICAgICAgIjIwMSAtIDMwMCIsCiAgICAgICAgICAgIjMwMSAtIDQwMCIsCiAgICAgICAgICAgIjQwMSAtIDUwMCIsCiAgICAgICAgICAgIjUwMSAtIDYwMCIsCiAgICAgICAgICAgIjYwMSAtIDcwMCIsCiAgICAgICAgICAgIjcwMSAtIDgwMCIsCiAgICAgICAgICAgIjgwMSAtIDkwMCIsCiAgICAgICAgICAgIjkwMSAtIDEwMDAiLAogICAgICAgICAgICI+IDEwMDAiKQpyYW5rc19jaGFuZ2UgPC0gbGFwcGx5KHVuaXF1ZShhY3RpdmVfZWRzX2wkY291bnRyeV9jb2RlKSwgZnVuY3Rpb24oeCkgewogIGQgPC0gYXMuZGF0YS5mcmFtZSgKICAgIGFjdGl2ZV9lZHNfbCAlPiUKICAgICAgZHBseXI6OmZpbHRlcihjb3VudHJ5X2NvZGUgPT0geCkKICApICU+JSAKICAgIGRwbHlyOjphcnJhbmdlKG1vbnRoKQogIHJjIDwtIHZlY3Rvcihtb2RlID0gIm51bWVyaWMiLAogICAgICAgICAgICAgICBsZW5ndGggPSBkaW0oZClbMV0tMSkKICBmb3IgKGkgaW4gMjpkaW0oZClbMV0pIHsKICAgIHAxIDwtIHdoaWNoKHJhbmtzICVpbiUgZCRlZGl0c1tpLTFdKQogICAgcDIgPC0gd2hpY2gocmFua3MgJWluJSBkJGVkaXRzW2ldKQogICAgcmNbaS0xXSA8LSBwMiAtIHAxCiAgfQogIGQgPC0gZFsyOmRpbShkKVsxXSAsIF0KICBkJHJjIDwtIHJjCiAgcmV0dXJuKGQpCn0pCnJhbmtzX2NoYW5nZSA8LSBkYXRhLnRhYmxlOjpyYmluZGxpc3QocmFua3NfY2hhbmdlKQpyYW5rc19jaGFuZ2VfZ2xvYmFsIDwtIHJhbmtzX2NoYW5nZSAlPiUgCiAgZHBseXI6OnNlbGVjdChnbG9iYWwsIG1vbnRoLCByYykgJT4lIAogIGRwbHlyOjpncm91cF9ieShnbG9iYWwsIG1vbnRoKSAlPiUgCiAgZHBseXI6OnN1bW1hcmlzZShhdmdfcmMgPSBtZWFuKHJjKSwgCiAgICAgICAgICAgICAgICAgICBzZF9yYyA9IHNkKHJjKSkKIyAtIGNoYXJ0CmdncGxvdDI6OmdncGxvdChyYW5rc19jaGFuZ2VfZ2xvYmFsLCAKICAgICAgICAgICAgICAgIGFlcyh4ID0gbW9udGgsCiAgICAgICAgICAgICAgICAgICAgeSA9IGF2Z19yYywKICAgICAgICAgICAgICAgICAgICBncm91cCA9IGdsb2JhbCwKICAgICAgICAgICAgICAgICAgICBmaWxsID0gZ2xvYmFsLAogICAgICAgICAgICAgICAgICAgIGNvbG9yID0gZ2xvYmFsLCAKICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IHJvdW5kKGF2Z19yYywgMykpKSArCiAgZ2VvbV9saW5lKHNpemUgPSAuMjUpICsgCiAgZ2VvbV9wb2ludCgpICsKICBnZ3JlcGVsOjpnZW9tX3RleHRfcmVwZWwoc2l6ZSA9IDMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoImRhcmtibHVlIiwgImRhcmtvcmFuZ2UiKSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoImRhcmtibHVlIiwgImRhcmtvcmFuZ2UiKSkgKwogIHhsYWIoIk1vbnRoIikgKyB5bGFiKCJBdmVyYWdlIFJhbmsgQ2hhbmdlIikgKyAKICBnZ3RpdGxlKCJFZGl0czogQXZlcmFnZSBSYW5rIENoYW5nZVxub2YgRWRpdCBDbGFzcyIpICsgCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpICsgCiAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9ibGFuaygpKSArIAogIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNykpICsKICB0aGVtZShzdHJpcC5iYWNrZ3JvdW5kID0gIGVsZW1lbnRfYmxhbmsoKSkgKyAKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCwgaGp1c3QgPSAuNSkpCmBgYCAKQWdhaW4sIG5vIG9idmlvdXMgcGF0dGVybiBpcyBwcmVzZW50IGluIHRoZSBhbmFseXNpcyBvZiBhZ2dyZWdhdGUgZGF0YS4gV2UgdGFrZSBhIGxvb2sgYXQgcGVyLWNvdW50cnkgZGF0YSBub3c6CgpgYGB7ciwgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0KcmFua3NfY2hhbmdlX2NvdW50cnkgPC0gcmFua3NfY2hhbmdlICU+JSAKICBkcGx5cjo6c2VsZWN0KGNvdW50cnlfY29kZSwgZ2xvYmFsLCBtb250aCwgcmMpICU+JSAKICBkcGx5cjo6Z3JvdXBfYnkoY291bnRyeV9jb2RlLCBnbG9iYWwpICU+JSAKICBkcGx5cjo6c3VtbWFyaXNlKGF2Z19yYyA9IG1lYW4ocmMpKSAlPiUgCiAgZHBseXI6OmFycmFuZ2UoZGVzYyhhdmdfcmMpKQpjb3VudHJ5X2dsb2JhbF8yIDwtIGRhdGFfc2V0ICU+JSAKICBkcGx5cjo6c2VsZWN0KGNvdW50cnlfY29kZSwKICAgICAgICAgICAgICAgIGNvdW50cnlfbmFtZSwKICAgICAgICAgICAgICAgIGdsb2JhbCkKY291bnRyeV9nbG9iYWxfMiA8LSBjb3VudHJ5X2dsb2JhbF8yWyFkdXBsaWNhdGVkKGNvdW50cnlfZ2xvYmFsXzIpLCBdCnJhbmtzX2NoYW5nZV9jb3VudHJ5IDwtIGNvdW50cnlfZ2xvYmFsXzIgJT4lIAogIGRwbHlyOjpsZWZ0X2pvaW4ocmFua3NfY2hhbmdlX2NvdW50cnksIAogICAgICAgICAgICAgICAgICAgYnkgPSBjKCJjb3VudHJ5X2NvZGUiID0gImNvdW50cnlfY29kZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgImdsb2JhbCIgPSAiZ2xvYmFsIikpICU+JSAKICBkcGx5cjo6YXJyYW5nZShkZXNjKGF2Z19yYykpCkRUOjpkYXRhdGFibGUocmFua3NfY2hhbmdlX2NvdW50cnkpCmBgYAoKTm93IHdlIHNwbGl0IHRoZSBjb3VudHJpZXMgaW50byAoYSkgdGhvc2Ugd2l0aCB0aGUgKnBvc2l0aXZlKiBjaGFuZ2UgaW4gYXZlcmFnZSByYW5rIG9mIGFjdGl2ZSBlZGl0b3JzIGNsYXNzLCAoYikgdGhvc2Ugd2l0aCB0aGUgKm5lZ2F0aXZlKiBjaGFuZ2UgaW4gYXZlcmFnZSByYW5rIG9mIGFjdGl2ZSBlZGl0b3JzIGNsYXNzLCBhbmQgKGMpIHRob3NlIHdpdGggdGhlICp6ZXJvKiBjaGFuZ2UgaW4gYXZlcmFnZSByYW5rIG9mIGFjdGl2ZSBlZGl0b3JzIGNsYXNzLCBhbmQgY3Jvc3MtdGFidWxhdGUgdGhhdCBpbmZvcm1hdGlvbiB3aXRoIEdsb2JhbCBOb3J0aCB2cyBHbG9iYWwgU291dGg6CgpgYGB7ciwgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0KcmFua3NfY2hhbmdlX2NvdW50cnkkY2hhbmdlX2NsYXNzIDwtIHNhcHBseShyYW5rc19jaGFuZ2VfY291bnRyeSRhdmdfcmMsIGZ1bmN0aW9uKHgpIHsKICBpZiAoeCA9PSAwKSB7CiAgICByZXR1cm4oIlplcm8iKQogIH0gZWxzZSBpZiAoeCA8IDApIHsKICAgIHJldHVybigiTmVnYXRpdmUiKQogIH0gZWxzZSB7CiAgICByZXR1cm4oIlBvc2l0aXZlIikKICB9Cn0pCnJhbmtzX2NoYW5nZV9jb3VudHJ5X3RhYmxlIDwtIGFzLmRhdGEuZnJhbWUoCiAgdGFibGUocmFua3NfY2hhbmdlX2NvdW50cnkkZ2xvYmFsLAogICAgICAgIHJhbmtzX2NoYW5nZV9jb3VudHJ5JGNoYW5nZV9jbGFzcykKICApCmNvbG5hbWVzKHJhbmtzX2NoYW5nZV9jb3VudHJ5X3RhYmxlKSA8LSAKICBjKCJHbG9iYWwiLCAiQ2hhbmdlIiwgIkNvdW50cmllcyIpCnJhbmtzX2NoYW5nZV9jb3VudHJ5X3RhYmxlJFBlcmNlbnQgPC0gCiAgaWZlbHNlKHJhbmtzX2NoYW5nZV9jb3VudHJ5X3RhYmxlJEdsb2JhbCA9PSAiR2xvYmFsIE5vcnRoIiwgCiAgICAgICAgIHJvdW5kKHJhbmtzX2NoYW5nZV9jb3VudHJ5X3RhYmxlJENvdW50cmllcy9uX2dsb2JhbF9ub3J0aCoxMDAsIDMpLAogICAgICAgICByb3VuZChyYW5rc19jaGFuZ2VfY291bnRyeV90YWJsZSRDb3VudHJpZXMvbl9nbG9iYWxfc291dGgqMTAwLCAzKQogICkKcmFua3NfY2hhbmdlX2NvdW50cnlfdGFibGUgPC0gcmFua3NfY2hhbmdlX2NvdW50cnlfdGFibGUgJT4lIAogIGRwbHlyOjphcnJhbmdlKEdsb2JhbCwgZGVzYyhQZXJjZW50KSkKRFQ6OmRhdGF0YWJsZShyYW5rc19jaGFuZ2VfY291bnRyeV90YWJsZSkgIApgYGAKCmBgYHtyLCBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQpnZ3Bsb3QocmFua3NfY2hhbmdlX2NvdW50cnlfdGFibGUsIAogICAgICAgYWVzKHggPSBDaGFuZ2UsCiAgICAgICAgICAgeSA9IFBlcmNlbnQsCiAgICAgICAgICAgY29sb3IgPSBDaGFuZ2UsIAogICAgICAgICAgIGZpbGwgPSBDaGFuZ2UpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIAogICAgICAgICAgIHBvc2l0aW9uID0gInN0YWNrIikgKyAKICBmYWNldF93cmFwKH5HbG9iYWwpICsgCiAgeGxhYigiQ2hhbmdlIikgKyB5bGFiKCIlIGNvdW50cmllcyIpICsgCiAgZ2d0aXRsZSgiRWRpdHMiKSArIAogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKSArIAogIHRoZW1lKHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfYmxhbmsoKSkgKyAKICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpKSArCiAgdGhlbWUoc3RyaXAuYmFja2dyb3VuZCA9ICBlbGVtZW50X2JsYW5rKCkpICsgCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTAsIGhqdXN0ID0gLjUpKQpgYGAKClRha2luZyB0aGUgcGVyc3BlY3RpdmUgb2YgdGhlIEdsb2JhbCBTb3V0aCwgdGhlIGNvbnRyaWJ1dGlvbnMgZnJvbSB0aGUgZm9sbG93aW5nIGNvdW50cmllcyBzZWVtIHRvIGJlICpjcml0aWNhbCogaW4gYSB3YXk7IGFsbCBvZiB0aGVtIGhhZCBhIG5lZ2F0aXZlIGNoYW5nZSBpbiB0aGUgYXZlcmFnZSByYW5rIG9mIGVkaXQgY2xhc3MgZnJvbSAyMDIwLzA5IHRvIDIwMjEvMDg6CgpgYGB7ciwgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0KRFQ6OmRhdGF0YWJsZShyYW5rc19jaGFuZ2VfY291bnRyeSAlPiUKICAgICAgICBkcGx5cjo6ZmlsdGVyKGdsb2JhbCA9PSAiR2xvYmFsIFNvdXRoIiwgCiAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VfY2xhc3MgPT0gIk5lZ2F0aXZlIikgJT4lCiAgICAgICAgZHBseXI6OnNlbGVjdChjb3VudHJ5X2NvZGUsIAogICAgICAgICAgICAgICAgICAgICAgY291bnRyeV9uYW1lLCAKICAgICAgICAgICAgICAgICAgICAgIGF2Z19yYykgJT4lIAogICAgICAgIGRwbHlyOjptdXRhdGUoY291bnRyeSA9IHBhc3RlMChjb3VudHJ5X25hbWUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICgiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRyeV9jb2RlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikiKSkgJT4lCiAgICAgICAgZHBseXI6OmFycmFuZ2UoYXZnX3JjKSAlPiUgCiAgICAgICAgZHBseXI6OnNlbGVjdChjb3VudHJ5LCBhdmdfcmMpCikKYGBgCgpXZSBub3cgcmVwZWF0IHRoZSB3aG9sZSBFZGl0cyBNb250aGx5IENoYW5nZSBJbmRleCBhbmFseXNpcyBmb3IgZWRpdHMgaW4gdGhlIGl0ZW1zIG5hbWVzcGFjZSAoTlM6MCkuCgojIyMjIDIuMi4yLjIgSW4gaXRlbXMgKE5TOjApIG5hbWVzcGFjZSBvbmx5CgpJbiB0aGUgZm9sbG93aW5nIGNoYXJ0IHdlIHRha2UgdGhlICoqYXZlcmFnZSBtb250aGx5IGNoYW5nZSoqIC0gYXMgZGVzY3JpYmVkIC0gKipwZXIgbW9udGgqKiwgYW5kIGNvbnRyYXN0IEdsb2JhbCBOb3J0aCB2cyBHbG9iYWwgU291dGggb3ZlciB0aW1lLCBmb3IgYWN0aXZlIGVkaXRvcnMgaW4gdGhlICoqaXRlbXMgKE5TOjApIG5hbWVzcGFjZSBvbmx5KiouCgpgYGB7ciwgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0KIyAtIHdyYW5nbGUKYWN0aXZlX2VkcyA8LSBkYXRhX3NldCAlPiUgCiAgZHBseXI6OnNlbGVjdChjb3VudHJ5X2NvZGUsCiAgICAgICAgICAgICAgICBnbG9iYWwsIAogICAgICAgICAgICAgICAgbW9udGgsCiAgICAgICAgICAgICAgICBlZGl0c19uczApICU+JSAKICBkcGx5cjo6Z3JvdXBfYnkoY291bnRyeV9jb2RlLCBnbG9iYWwsIG1vbnRoLCBlZGl0c19uczApICU+JSAKICBkcGx5cjo6bXV0YXRlKGNvdW50ID0gbigpKSAlPiUgCiAgdGlkeXI6OnBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBlZGl0c19uczAsIAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXNfZnJvbSA9IGNvdW50LCAKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzX2ZpbGwgPSAwKSAlPiUKICB0aWR5cjo6cGl2b3RfbG9uZ2VyKCFjKGNvdW50cnlfY29kZSwgZ2xvYmFsLCBtb250aCksCiAgICAgICAgICAgICAgICAgICAgICBuYW1lc190byA9ICJlZGl0c19uczAiLAogICAgICAgICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gImNvdW50IikKYWN0aXZlX2VkcyRlZGl0c19uczAgPC0gZmFjdG9yKGFjdGl2ZV9lZHMkZWRpdHNfbnMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCIwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMSAtIDEwMCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIxMDEgLSAyMDAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjAxIC0gMzAwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMzAxIC0gNDAwIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjQwMSAtIDUwMCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI1MDEgLSA2MDAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNjAxIC0gNzAwIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjcwMSAtIDgwMCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4MDEgLSA5MDAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOTAxIC0gMTAwMCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI+IDEwMDAiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCmFjdGl2ZV9lZHMgPC0gYWN0aXZlX2VkcyAlPiUgCiAgZHBseXI6OmFycmFuZ2UoY291bnRyeV9jb2RlLCBnbG9iYWwsIG1vbnRoLCBlZGl0c19uczApIAphY3RpdmVfZWRzX2wgPC0gbGFwcGx5KHVuaXF1ZShhY3RpdmVfZWRzJGNvdW50cnlfY29kZSksIGZ1bmN0aW9uKHgpIHsKICBiIDwtIGxhcHBseSh1bmlxdWUoYWN0aXZlX2VkcyRnbG9iYWwpLCBmdW5jdGlvbih5KSB7CiAgICBhIDwtIGxhcHBseSh1bmlxdWUoYWN0aXZlX2VkcyRtb250aCksIGZ1bmN0aW9uKHopIHsKICAgICAgZCA8LSBhY3RpdmVfZWRzICU+JSAKICAgICAgICBkcGx5cjo6ZmlsdGVyKAogICAgICAgICAgY291bnRyeV9jb2RlID09IHgsCiAgICAgICAgICBnbG9iYWwgPT0geSwgCiAgICAgICAgICBtb250aCA9PSB6CiAgICAgICAgKQogICAgICB3IDwtIHdoaWNoKGQkY291bnQgPT0gMSkKICAgICAgaWYgKGxlbmd0aCh3KSA9PSAxKSB7CiAgICAgICAgZCA8LSBhcy5kYXRhLmZyYW1lKGRbdywgXSkKICAgICAgfSBlbHNlIHsKICAgICAgICBkIDwtIGRhdGEuZnJhbWUoY291bnRyeV9jb2RlID0geCwKICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsID0geSwKICAgICAgICAgICAgICAgICAgICAgICAgbW9udGggPSB6LAogICAgICAgICAgICAgICAgICAgICAgICBlZGl0c19uczAgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICBjb3VudCA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkKICAgICAgfQogICAgfSkKICAgIHJldHVybigKICAgICAgZGF0YS50YWJsZTo6cmJpbmRsaXN0KGEpCiAgICApCiAgfSkKICByZXR1cm4oCiAgICBkYXRhLnRhYmxlOjpyYmluZGxpc3QoYikKICApCn0pCmFjdGl2ZV9lZHNfbCA8LSBkYXRhLnRhYmxlOjpyYmluZGxpc3QoYWN0aXZlX2Vkc19sKQphY3RpdmVfZWRzX2wgPC0gYWN0aXZlX2Vkc19sICU+JSAKICBkcGx5cjo6YXJyYW5nZShjb3VudHJ5X2NvZGUsIGdsb2JhbCwgbW9udGgpCmFjdGl2ZV9lZHNfbCRjb3VudCA8LSBOVUxMCmFjdGl2ZV9lZHNfbCA8LSBjb3VudHJ5X2dsb2JhbCAlPiUgCiAgZHBseXI6OmxlZnRfam9pbihhY3RpdmVfZWRzX2wsIAogICAgICAgICAgICAgICAgICAgYnkgPSBjKCJjb3VudHJ5X2NvZGUiID0gImNvdW50cnlfY29kZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgImdsb2JhbCIgPSAiZ2xvYmFsIikpCnJhbmtzIDwtIGMoIjAiLAogICAgICAgICAgICIxIC0gMTAwIiwKICAgICAgICAgICAiMTAxIC0gMjAwIiwKICAgICAgICAgICAiMjAxIC0gMzAwIiwKICAgICAgICAgICAiMzAxIC0gNDAwIiwKICAgICAgICAgICAiNDAxIC0gNTAwIiwKICAgICAgICAgICAiNTAxIC0gNjAwIiwKICAgICAgICAgICAiNjAxIC0gNzAwIiwKICAgICAgICAgICAiNzAxIC0gODAwIiwKICAgICAgICAgICAiODAxIC0gOTAwIiwKICAgICAgICAgICAiOTAxIC0gMTAwMCIsCiAgICAgICAgICAgIj4gMTAwMCIpCnJhbmtzX2NoYW5nZSA8LSBsYXBwbHkodW5pcXVlKGFjdGl2ZV9lZHNfbCRjb3VudHJ5X2NvZGUpLCBmdW5jdGlvbih4KSB7CiAgZCA8LSBhcy5kYXRhLmZyYW1lKAogICAgYWN0aXZlX2Vkc19sICU+JQogICAgICBkcGx5cjo6ZmlsdGVyKGNvdW50cnlfY29kZSA9PSB4KQogICkgJT4lIAogICAgZHBseXI6OmFycmFuZ2UobW9udGgpCiAgcmMgPC0gdmVjdG9yKG1vZGUgPSAibnVtZXJpYyIsCiAgICAgICAgICAgICAgIGxlbmd0aCA9IGRpbShkKVsxXS0xKQogIGZvciAoaSBpbiAyOmRpbShkKVsxXSkgewogICAgcDEgPC0gd2hpY2gocmFua3MgJWluJSBkJGVkaXRzX25zMFtpLTFdKQogICAgcDIgPC0gd2hpY2gocmFua3MgJWluJSBkJGVkaXRzX25zMFtpXSkKICAgIHJjW2ktMV0gPC0gcDIgLSBwMQogIH0KICBkIDwtIGRbMjpkaW0oZClbMV0gLCBdCiAgZCRyYyA8LSByYwogIHJldHVybihkKQp9KQpyYW5rc19jaGFuZ2UgPC0gZGF0YS50YWJsZTo6cmJpbmRsaXN0KHJhbmtzX2NoYW5nZSkKcmFua3NfY2hhbmdlX2dsb2JhbCA8LSByYW5rc19jaGFuZ2UgJT4lIAogIGRwbHlyOjpzZWxlY3QoZ2xvYmFsLCBtb250aCwgcmMpICU+JSAKICBkcGx5cjo6Z3JvdXBfYnkoZ2xvYmFsLCBtb250aCkgJT4lIAogIGRwbHlyOjpzdW1tYXJpc2UoYXZnX3JjID0gbWVhbihyYyksIAogICAgICAgICAgICAgICAgICAgc2RfcmMgPSBzZChyYykpCiMgLSBjaGFydApnZ3Bsb3QyOjpnZ3Bsb3QocmFua3NfY2hhbmdlX2dsb2JhbCwgCiAgICAgICAgICAgICAgICBhZXMoeCA9IG1vbnRoLAogICAgICAgICAgICAgICAgICAgIHkgPSBhdmdfcmMsCiAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSBnbG9iYWwsCiAgICAgICAgICAgICAgICAgICAgZmlsbCA9IGdsb2JhbCwKICAgICAgICAgICAgICAgICAgICBjb2xvciA9IGdsb2JhbCwgCiAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSByb3VuZChhdmdfcmMsIDMpKSkgKwogIGdlb21fbGluZShzaXplID0gLjI1KSArIAogIGdlb21fcG9pbnQoKSArCiAgZ2dyZXBlbDo6Z2VvbV90ZXh0X3JlcGVsKHNpemUgPSAzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJkYXJrYmx1ZSIsICJkYXJrb3JhbmdlIikpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJkYXJrYmx1ZSIsICJkYXJrb3JhbmdlIikpICsKICB4bGFiKCJNb250aCIpICsgeWxhYigiQXZlcmFnZSBSYW5rIENoYW5nZSIpICsgCiAgZ2d0aXRsZSgiRWRpdHMgaW4gdGhlIEl0ZW1zIE5hbWVzcGFjZSAoTlM6MCk6IEF2ZXJhZ2UgUmFuayBDaGFuZ2Vcbm9mIEVkaXQgQ2xhc3MiKSArIAogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKSArIAogIHRoZW1lKHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfYmxhbmsoKSkgKyAKICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpKSArCiAgdGhlbWUoc3RyaXAuYmFja2dyb3VuZCA9ICBlbGVtZW50X2JsYW5rKCkpICsgCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTAsIGhqdXN0ID0gLjUpKQpgYGAgCkFnYWluLCBubyBvYnZpb3VzIHBhdHRlcm4gZW1lcmdlcyBmcm9tIHRoZSBhbmFseXNpcyBvZiB0aGUgYWdncmVnYXRlZCBkYXRhLgpUaGUgcGVyLWNvdW50cnkgZGF0YSBhcmUgZ2l2ZW4gaW4gdGhlIGZvbGxvd2luZyB0YWJsZToKCmBgYHtyLCBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQpyYW5rc19jaGFuZ2VfY291bnRyeSA8LSByYW5rc19jaGFuZ2UgJT4lIAogIGRwbHlyOjpzZWxlY3QoY291bnRyeV9jb2RlLCBnbG9iYWwsIG1vbnRoLCByYykgJT4lIAogIGRwbHlyOjpncm91cF9ieShjb3VudHJ5X2NvZGUsIGdsb2JhbCkgJT4lIAogIGRwbHlyOjpzdW1tYXJpc2UoYXZnX3JjID0gbWVhbihyYykpICU+JSAKICBkcGx5cjo6YXJyYW5nZShkZXNjKGF2Z19yYykpCmNvdW50cnlfZ2xvYmFsXzIgPC0gZGF0YV9zZXQgJT4lIAogIGRwbHlyOjpzZWxlY3QoY291bnRyeV9jb2RlLAogICAgICAgICAgICAgICAgY291bnRyeV9uYW1lLAogICAgICAgICAgICAgICAgZ2xvYmFsKQpjb3VudHJ5X2dsb2JhbF8yIDwtIGNvdW50cnlfZ2xvYmFsXzJbIWR1cGxpY2F0ZWQoY291bnRyeV9nbG9iYWxfMiksIF0KcmFua3NfY2hhbmdlX2NvdW50cnkgPC0gY291bnRyeV9nbG9iYWxfMiAlPiUgCiAgZHBseXI6OmxlZnRfam9pbihyYW5rc19jaGFuZ2VfY291bnRyeSwgCiAgICAgICAgICAgICAgICAgICBieSA9IGMoImNvdW50cnlfY29kZSIgPSAiY291bnRyeV9jb2RlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2xvYmFsIiA9ICJnbG9iYWwiKSkgJT4lIAogIGRwbHlyOjphcnJhbmdlKGRlc2MoYXZnX3JjKSkKRFQ6OmRhdGF0YWJsZShyYW5rc19jaGFuZ2VfY291bnRyeSkKYGBgCgpBZ2Fpbiwgc3BsaXQgdGhlIGNvdW50cmllcyBpbnRvIChhKSB0aG9zZSB3aXRoIHRoZSAqcG9zaXRpdmUqIGNoYW5nZSBpbiBhdmVyYWdlIHJhbmsgb2YgYWN0aXZlIGVkaXRvcnMgY2xhc3MsIChiKSB0aG9zZSB3aXRoIHRoZSAqbmVnYXRpdmUqIGNoYW5nZSBpbiBhdmVyYWdlIHJhbmsgb2YgYWN0aXZlIGVkaXRvcnMgY2xhc3MsIGFuZCAoYykgdGhvc2Ugd2l0aCB0aGUgKnplcm8qIGNoYW5nZSBpbiBhdmVyYWdlIHJhbmsgb2YgYWN0aXZlIGVkaXRvcnMgY2xhc3MsIGFuZCBjcm9zcy10YWJ1bGF0ZSB0aGF0IGluZm9ybWF0aW9uIHdpdGggR2xvYmFsIE5vcnRoIHZzIEdsb2JhbCBTb3V0aDoKCmBgYHtyLCBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQpyYW5rc19jaGFuZ2VfY291bnRyeSRjaGFuZ2VfY2xhc3MgPC0gc2FwcGx5KHJhbmtzX2NoYW5nZV9jb3VudHJ5JGF2Z19yYywgZnVuY3Rpb24oeCkgewogIGlmICh4ID09IDApIHsKICAgIHJldHVybigiWmVybyIpCiAgfSBlbHNlIGlmICh4IDwgMCkgewogICAgcmV0dXJuKCJOZWdhdGl2ZSIpCiAgfSBlbHNlIHsKICAgIHJldHVybigiUG9zaXRpdmUiKQogIH0KfSkKcmFua3NfY2hhbmdlX2NvdW50cnlfdGFibGUgPC0gYXMuZGF0YS5mcmFtZSgKICB0YWJsZShyYW5rc19jaGFuZ2VfY291bnRyeSRnbG9iYWwsCiAgICAgICAgcmFua3NfY2hhbmdlX2NvdW50cnkkY2hhbmdlX2NsYXNzKQogICkKY29sbmFtZXMocmFua3NfY2hhbmdlX2NvdW50cnlfdGFibGUpIDwtIAogIGMoIkdsb2JhbCIsICJDaGFuZ2UiLCAiQ291bnRyaWVzIikKcmFua3NfY2hhbmdlX2NvdW50cnlfdGFibGUkUGVyY2VudCA8LSAKICBpZmVsc2UocmFua3NfY2hhbmdlX2NvdW50cnlfdGFibGUkR2xvYmFsID09ICJHbG9iYWwgTm9ydGgiLCAKICAgICAgICAgcm91bmQocmFua3NfY2hhbmdlX2NvdW50cnlfdGFibGUkQ291bnRyaWVzL25fZ2xvYmFsX25vcnRoKjEwMCwgMyksCiAgICAgICAgIHJvdW5kKHJhbmtzX2NoYW5nZV9jb3VudHJ5X3RhYmxlJENvdW50cmllcy9uX2dsb2JhbF9zb3V0aCoxMDAsIDMpCiAgKQpyYW5rc19jaGFuZ2VfY291bnRyeV90YWJsZSA8LSByYW5rc19jaGFuZ2VfY291bnRyeV90YWJsZSAlPiUgCiAgZHBseXI6OmFycmFuZ2UoR2xvYmFsLCBkZXNjKFBlcmNlbnQpKQpEVDo6ZGF0YXRhYmxlKHJhbmtzX2NoYW5nZV9jb3VudHJ5X3RhYmxlKSAgCmBgYAoKYGBge3IsIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9CmdncGxvdChyYW5rc19jaGFuZ2VfY291bnRyeV90YWJsZSwgCiAgICAgICBhZXMoeCA9IENoYW5nZSwKICAgICAgICAgICB5ID0gUGVyY2VudCwKICAgICAgICAgICBjb2xvciA9IENoYW5nZSwgCiAgICAgICAgICAgZmlsbCA9IENoYW5nZSkpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgCiAgICAgICAgICAgcG9zaXRpb24gPSAic3RhY2siKSArIAogIGZhY2V0X3dyYXAofkdsb2JhbCkgKyAKICB4bGFiKCJDaGFuZ2UiKSArIHlsYWIoIiUgY291bnRyaWVzIikgKyAKICBnZ3RpdGxlKCJFZGl0cyBpbiB0aGUgSXRlbXMgTmFtZXNwYWNlIChOUzowKSIpICsgCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpICsgCiAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9ibGFuaygpKSArIAogIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNykpICsKICB0aGVtZShzdHJpcC5iYWNrZ3JvdW5kID0gIGVsZW1lbnRfYmxhbmsoKSkgKyAKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCwgaGp1c3QgPSAuNSkpCmBgYAoKVGhlIHJlc3VsdHMgaW4gdGhlIGl0ZW1zIG5hbWVzcGFjZSBhcmUgcXVpdGUgc2ltaWxhciB0byB0aG9zZSBmcm9tIGFsbCBuYW1lc3BhY2VzLiBUaGUgbGlzdCBvZiBjb3VudHJpZXMgaW4gdGhlIEdsb2JhbCBTb3V0aCB3aXRoIHRoZSBoaWdoZXN0ICoqbmVnYXRpdmUqKiBjaGFuZ2UgaW4gdGhlIGF2ZXJhZ2UgcmFuayBvZiBlZGl0IGNsYXNzIGZyb20gMjAyMC8wOSB0byAyMDIxLzA4ICoqaW4gdGhlIGl0ZW1zIChOUzowKSBuYW1lc3BhY2UqKiBmb2xsb3dzLgoKYGBge3IsIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9CkRUOjpkYXRhdGFibGUocmFua3NfY2hhbmdlX2NvdW50cnkgJT4lCiAgICAgICAgZHBseXI6OmZpbHRlcihnbG9iYWwgPT0gIkdsb2JhbCBTb3V0aCIsIAogICAgICAgICAgICAgICAgICAgICAgY2hhbmdlX2NsYXNzID09ICJOZWdhdGl2ZSIpICU+JQogICAgICAgIGRwbHlyOjpzZWxlY3QoY291bnRyeV9jb2RlLCAKICAgICAgICAgICAgICAgICAgICAgIGNvdW50cnlfbmFtZSwgCiAgICAgICAgICAgICAgICAgICAgICBhdmdfcmMpICU+JSAKICAgICAgICBkcGx5cjo6bXV0YXRlKGNvdW50cnkgPSBwYXN0ZTAoY291bnRyeV9uYW1lLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAoIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cnlfY29kZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpIikpICU+JQogICAgICAgIGRwbHlyOjphcnJhbmdlKGF2Z19yYykgJT4lIAogICAgICAgIGRwbHlyOjpzZWxlY3QoY291bnRyeSwgYXZnX3JjKQopCmBgYAoK