Food
Security Cluster Myanmar homepage
Summary of new achievements

Beneficiaries of humanitarian action formed 51% of the 49,950
beneficiaries in July 2022. The remainder were reached through
development interventions.
In this report, when beneficiaries are mentioned, the Food Security
Cluster is referring to unique beneficiaries or individuals. This is
different from a beneficiary frequency which is an instance of a person
receiving aid i.e. a person who receives food distributions, a crop,
vegetable and seed kit and farmer training would be counted as three
beneficiary frequencies, but as only one beneficiary.
As monthly reporting has just started, the volume of reporting is
still lower than the pro-rated quarterly submissions. This means that
several partners will hold off on reporting their achievements until the
end of the quarter.
Beneficiaries reached per month
date | beneficiaries | new_beneficiaries | %_increase |
Jan 2022 | 1,315,218 | 1,315,218 |
|
Feb 2022 | 1,810,622 | 495,404 | 37.67 |
Mar 2022 | 2,134,763 | 324,141 | 17.90 |
Apr 2022 | 2,340,458 | 205,695 | 9.64 |
May 2022 | 2,763,136 | 422,678 | 18.06 |
Jun 2022 | 3,217,244 | 454,108 | 16.43 |
Jul 2022 | 3,267,194 | 49,950 | 1.55 |
In terms of activities, farmer training and food distributions formed
the bulk of the activities implemented in July. However, as mentioned
earlier, these figure will be revised when new data comes in.

Overall, however, food distribution remains far and away the largest
activity.
Beneficiaries by acitivity, as of 31 July 2022
activity | jan_to_jun | july | %_of_july | total | %_of_total |
food distribution | 2,665,934 | 16,909 | 33.85 | 2,682,843 | 82.11 |
FFS and farmer training | 230,378 | 16,775 | 33.58 | 247,153 | 7.56 |
crop, vegetable and seed kits | 158,542 | 10,419 | 20.86 | 168,961 | 5.17 |
multi-purpose cash transfer | 111,489 | 5,262 | 10.53 | 116,751 | 3.57 |
food_cash for work_assets | 36,199 | 28 | 0.06 | 36,227 | 1.11 |
IGA and small grants | 5,870 | 238 | 0.48 | 6,108 | 0.19 |
community infrastructure and equipment | 4,761 | 0 | 0.00 | 4,761 | 0.15 |
HEB and fortfied rice | 1,876 | 0 | 0.00 | 1,876 | 0.06 |
vocational training | 1,627 | 208 | 0.42 | 1,835 | 0.06 |
kitchen garden kits | 475 | 111 | 0.22 | 586 | 0.02 |
livestock kits | 93 | 0 | 0.00 | 93 | 0.00 |
Total | 3,217,244 | 49,950 | 100.00 | 3,267,194 | 100.00 |
Food security interventions in July 2022 overwhelmingly targeted
persons in host and local communities, this group forms 87.21% of all
food distribution support, or 43,562 beneficiary frequencies (this
includes if a person had been reached previously and are currently
receiving their second or third round of assistance).
1. Geographies
1.1 States
A total of 3,267,194 beneficiaries were reached in July 2022.

Overall, these are year-to-date state-level breakdowns of
beneficiaries reached:

July saw much fewer persons reached in Yangon than in previous
months. It is hoped that the reallocation of resources out of the
affluent urban core has been accelerated. It is also encouraging to see
Magway receive the second-most support, after Rakhine.
1.2 Townships
A total of 132 townships have been reached across 16 states/regions
as of 31st July 2022. In July alone, 52 townships were reached.
11,182 beneficiaries were reached in Magway township, this was 22% of
the total.
Top townships by beneficiaries reached, July 2022
state | township | jan_to_jun | july1 | %_of_july | total | %_of_total |
Magway | Magway | 10,335 | 11,182 | 22.39 | 21,517 | 0.66 |
Rakhine | Maungdaw | 108,160 | 7,247 | 14.51 | 115,407 | 3.53 |
Magway | Chauk | 8,110 | 3,479 | 6.96 | 11,589 | 0.35 |
Rakhine | Sittwe | 152,770 | 3,269 | 6.54 | 156,039 | 4.78 |
Kayin | Hpapun | 44,904 | 3,169 | 6.34 | 48,073 | 1.47 |
Rakhine | Buthidaung | 201,354 | 2,513 | 5.03 | 203,867 | 6.24 |
Chin | Falam | 13,670 | 2,495 | 4.99 | 16,165 | 0.49 |
Rakhine | Kyauktaw | 20,198 | 2,129 | 4.26 | 22,327 | 0.68 |
Kayah | Loikaw | 110,091 | 2,098 | 4.20 | 112,189 | 3.43 |
Magway | Yenangyaung | 11,168 | 1,885 | 3.77 | 13,053 | 0.40 |
Ayeyarwady | Bogale | 9,061 | 1,838 | 3.68 | 10,899 | 0.33 |
Rakhine | Pauktaw | 31,680 | 1,582 | 3.17 | 33,262 | 1.02 |
1These top 12 townships are where 86% of beneficiaries were reached in July |
When comparing the current footprint to that of the first quarter,
the more activity was observed in Mandalay, Magway, Kayah and Kayin.

5 newly-reached townships were added in July 2022. They all in Shan
South are are Laikha, Loilen, Mongnai, Mongpan and Nansang. All very
traditionally remote and underserved areas.
Of the 2,544 sites reached, 421 had more than one partner
present.
Number of partners by location, as of 31 July 2022
partners | location |
1_partner | 1,986 |
2_partners | 384 |
3_partners | 34 |
4_partners | 3 |
The food security cluster’s partners can mostly be found in Yangon,
Rakhine and Kachin.

2. Activities
2.1 Progress by activity
The dotted red line shows the end of Q2 2022. The thick line in grey
shows the progress in 2021 for the same activity. It should be noted
that the 2021 progress lines are just a reference and not meant to be a
direct comparison. The scope of the HRP was much different at the start
of 2021 and the response only became nationwide in June; the FSC was
also much smaller than it is now in 2022. Indeed, with the post-coup
crisis affecting both humanitarian and development programming, the need
for stronger coordination to adapt food food security programming has
pushed many partners to enter the FSC. This type of comparison will be
more useful next year.

In July 2022, progress primarily came from multi-purpose cash
transfers, farmer training, food distributions and vocational
training.
2.2 Agricultural and livelihoods activities
422,315 persons were reached through a combination of crop, vegetable
and seed kits, FFS and farmer training, IGA and small grants and
livestock kits.
Beneficiaries reached by agricultural and livelihood activities
activity | jan_to_jun | july | total1 | %_total |
FFS and farmer training | 230,378 | 16,775 | 247,153 | 58.52 |
crop, vegetable and seed kits | 158,542 | 10,419 | 168,961 | 40.01 |
IGA and small grants | 5,870 | 238 | 6,108 | 1.45 |
livestock kits | 93 | 0 | 93 | 0.02 |
Total | 394,883 | 27,432 | 422,315 | 100.00 |
1as of 31 July 2022 |
2.3 Delivery modalities
Only HEB and fortified rice, community infrastructure and equipment
and kitchen garden kits were delivered entirely through in-kind
modalities.
Percentage of benficiaries reached by activity and delivery
modality
Activity | In-kind | CBT/CVA | Hybrid | Service delivery | Beneficiaries1 |
Food distribution | 86.5% | 11.9% | 1.6% | 0.0% | 2,682,843 |
FFS and farmer training | 11.5% | 16.2% |
| 72.3% | 247,153 |
Crop, vegetable and seed kits | 87.5% | 0.3% | 12.0% | 0.2% | 168,961 |
Multi-purpose cash transfer | 0.0% | 90.2% | 9.8% |
| 116,751 |
Food_cash for work_assets | 16.1% | 83.9% |
|
| 36,227 |
IGA and small grants | 4.3% | 94.4% | 0.5% | 0.9% | 6,108 |
Community infrastructure and equipment | 100.0% |
|
|
| 4,761 |
Heb and fortfied rice | 100.0% |
|
|
| 1,876 |
Vocational training | 0.0% | 20.5% |
| 79.5% | 1,835 |
Kitchen garden kits | 100.0% |
|
|
| 586 |
Livestock kits | 97.8% | 0.0% | 0.0% | 2.2% | 93 |
1as of 31 July 2022 |
There are also clear differences between the different beneficiary
types and the delivery modalities employed with them. Beneficiaries from
host/local communities largely received in-kind distributions whilst
those from camps and IDP sites mostly received cash-based interventions,
indicating that partners mostly worked in the same areas in Q1 and
Q2.

Areas with the highest number of IDPs, such as Sagaing, Rakhine and
Kachin, reach most of their beneficiaries through cash-based
programming.

3. Cash-based programming
3.1 MMK per household
Compared to Q1, beneficiaries in Q2 are much less likely to have
received cash transfers of less than USD 10 per household. The most
common transfer values were between USD 60 and 70, an increase from the
previous quarter.
In July 2022, the most common transfers values were between MMK
100,000 and MMK 200,000,

About 40% of beneficiaries of multi-purpose cash transfers in July
2022 were of quite high value.

3.2 MMK per person
The boxplots below shows the range of cash transfer values (all
values are per person, to facilitate comparability) by activity. The
average for reach activity is marked by the thick line in the middle of
each box. The leftmost and rightmost side of each box indicate the 25th
and 75th percentile of transfer values, respectively. The length of each
box is a gauge for how much variation there is in the transfer values of
each activity.
These plots use data for the entire year, instead of just July.

Each of the bubbles represents an individual intervention, with their
position along the x-axis showing the USD per person value of the
intervention and the size of each bubble indicating the number of
beneficiaries reached.
Food distributions tended to have the tightest range of values, which
proves that food assistance is quite standardised amongst partners.
3.3 Food distributions
Beneficiaries in Rakhine are split into two groups, one at around MMK
7,000 and another at MMK 17,000. Kayin has a very large number of
persons who received less than MMK 1,000 each.
Distributions in Chin and Ayeyarwady had very consistent values as
they were all implemented by the same implementing partner.
The table below compares the different bins for cash transfer values
of food distributions with the minimum expenditure basket for food
established by the Cash Working Group. They have established a floor of
MMK 190,555 (or USD 114.55) for the food security component per
household per month.
Overall, 1.86% of food distribution beneficiaries have received at
least 100% of the food security MEB and 8.99% have received at least 50%
of the food security MEB (MMK 19,056 or USD 11.45 per person).
MMK values of food disributions by percentage of MEB received
mmk_person_bin | avg_pc_of_meb | avg_mmk_month | beneficiaries1 | pc_of_hhd |
<10K | 17.11 | 6,519 | 100,964 | 22.85 |
10K_<30K | 43.03 | 16,398 | 313,022 | 70.84 |
30K_<60K | 98.54 | 37,553 | 24,495 | 5.54 |
60K_<100K | 207.72 | 79,164 | 2,242 | 0.51 |
100K_<200K | 324.66 | 123,731 | 663 | 0.15 |
300K_<1M | 894.43 | 340,876 | 500 | 0.11 |
1Only persons reached through CBT/CVA modalities are included |
3.4 Implementing partners
The plots below show the the average cash transfer values by activity
for the top 7 partners implementing that activity. The x-axis shows the
number of beneficiaries reached and the depth of the colour indicates
the value of the cash transfer.

4. Partners
A total of 75 partners have reported into the Food Security Cluster
as of July 2022 – there are 66 implementing partners and 28 reporting
partners. This first instance of monthly reporting has seen a
significant dip in submissions, but response has overall been better
than expected.
All this means is that several partners are waiting until the end of
the quarter to report in.
This section will mostly only look at year-to-date achievements.

4.1 Implementing partners
There are 16 partners that were involved in direct implementation
that have reported achievements in July 2022, in comparison with 66 in
the first quarter. These implementing partners corresponded to a total
of 28 reporting organisations. The largest reporting organisation, 2690,
had 24 implementing partners.
The interactive plot below shows the number of beneficiaries and
townships reached by implementing partner.
14 partners (21% of the total) have a presence in more than 5
townships. 11 partners (16% of the total) are present in more than 10
townships.
4.2 Monthly progress by partner
The thick grey line shows an organisation’s progress from last year,
which, as mentioned, cannot exactly be used for a straight comparison as
the scope of the HRP in 2021 was different until the approval of the
IERP, additionally, many partners only joined the cluster late in 2021
or even in 2022. Still, it serves as a reference.

The table below lists the top 15 partners by number of beneficiaries
reached in 2022.
Top implementing partners by beneficiaries reached, as of
31-07-2022
implementing_partner | beneficiaries | states | townships |
org_8540 | 384,980 | 2 | 4 |
org_5722 | 285,255 | 1 | 3 |
org_9693 | 200,966 | 1 | 3 |
org_4933 | 181,102 | 1 | 4 |
org_5440 | 169,086 | 1 | 4 |
org_6827 | 159,724 | 1 | 4 |
org_1206 | 156,433 | 1 | 4 |
org_9566 | 150,307 | 6 | 16 |
org_3315 | 149,258 | 5 | 21 |
org_2690 | 148,895 | 6 | 21 |
org_5677 | 122,788 | 9 | 20 |
org_5283 | 122,358 | 9 | 26 |
org_6197 | 113,704 | 1 | 3 |
org_8004 | 110,408 | 3 | 11 |
org_6792 | 105,410 | 1 | 2 |
4.3 Donors
The table below summarises the reach and scope (in terms of
geographic extent and number of organisations supported) of donors who
support at least two reporting organisations.
Organisations supported and geographic reach by donor
donor1 | report_orgs | implementing_orgs | states | townships |
LIFT | 7 | 11 | 6 | 15 |
FCDO | 6 | 8 | 6 | 21 |
Organizational own funds | 6 | 7 | 14 | 49 |
MHF | 5 | 6 | 4 | 7 |
ECHO | 3 | 4 | 3 | 5 |
GIZ | 3 | 3 | 3 | 8 |
BHA | 2 | 5 | 4 | 11 |
CIAA | 2 | 2 | 2 | 5 |
UN Women | 2 | 3 | 2 | 7 |
1Only showing donors supporting more than one reporting partner |
Sagaing, Shan (East), Tanintharyi and Magway have the fewest number
of donors present.
Number of donors by state
state | donors | implementing_partners |
Kayin | 15 | 14 |
Kayah | 14 | 7 |
Kachin | 13 | 15 |
Rakhine | 10 | 19 |
Shan (South) | 9 | 9 |
Mon | 8 | 7 |
Chin | 6 | 7 |
Shan (North) | 6 | 9 |
Mandalay | 5 | 4 |
Bago (East) | 4 | 3 |
Yangon | 4 | 15 |
Ayeyarwady | 3 | 6 |
Magway | 3 | 3 |
Shan (East) | 3 | 3 |
Tanintharyi | 3 | 3 |
Sagaing | 2 | 3 |
However, as shown by the table below, even though the majority of
partners reported their donors, the omission of data from three key
partners has resulted in the vast majority of reported beneficiaries not
being associated with any donor.
Top donors by beneficiaries reached
donor1 | beneficiaries | %_beneficiaries |
No donor specified | 2,397,314 | 73.38 |
Organizational own funds | 249,180 | 7.63 |
UNDP | 117,634 | 3.60 |
FCDO | 97,942 | 3.00 |
CERF | 73,458 | 2.25 |
AICS | 70,984 | 2.17 |
LIFT | 43,968 | 1.35 |
BPRM | 31,640 | 0.97 |
WVI | 20,843 | 0.64 |
UN Women | 20,124 | 0.62 |
DFAT | 17,329 | 0.53 |
BHA | 16,356 | 0.50 |
HELVETAS | 13,851 | 0.42 |
AAP | 12,392 | 0.38 |
MHF | 12,331 | 0.38 |
1Donors starting with 'org_xxxx' are partners using their own organisational funds |
5. Beneficiaries
87.21% of all beneficiaries in July 2022 were from host or local
communities.
5.1 Beneficiary types
In July 2022, 87.21% of beneficiaries were from host or local
communities, in comparison to 75.12% for the whole year. 12.18% of
beneficiaries in July 2022 were IDPs, compared to 18.51% for the whole
year.
Persons reached by beneficiary type, as of 31 July 2022
beneficiary_type | jan_to_jun | july | %_of_july | total | %_of_total |
Host/local Community | 2,410,702 | 43,562 | 87.21 | 2,454,264 | 75.12 |
Internally Displaced | 598,577 | 6,082 | 12.18 | 604,659 | 18.51 |
Rakhine Stateless | 194,263 | 0 | 0.00 | 194,263 | 5.95 |
Returnees | 8,507 | 282 | 0.56 | 8,789 | 0.27 |
Resettled | 5,034 | 24 | 0.05 | 5,058 | 0.15 |
Locally integrated | 161 | 0 | 0.00 | 161 | 0.00 |
Total | 3,217,244 | 49,950 | 100.00 | 3,267,194 | 100.00 |
6. Comparison with targets
6.1 Reached vs target by township
The specifics of each township can be reviewed with the interactive
plot below. Each point is a township, with the size indicating the
number of beneficiaries. The x-axis indicates the target population by
township and the y-axis shows the number of beneficiaries reached, as of
31 July 2022.
The red line down the middle represents reaching 100% of the target.
Townships above this line have reached more beneficiaries than their
target and townships below the line have not met their target yet. The
further away a township is from the red line, the further above or below
its target it is. Mouse over each of the townships to see more
details.
The 13 townships along the extreme left side of the plot have
beneficiaries but do not have targets (their targets have just been
coded as 1 so that they show up on the plot). 198 townships with targets
have not been reached.
In most of the townships where the food security cluster is present,
the number of beneficiaries reached is under the cluster target.
Townships which have been heavily oversubscribed have been listed in the
second
quarter 5Ws report.
6.2 Map of beneficiaries reached in Q1 & Q2 2022 vs target

6.3 Interactive reference table
In the interactive table below, is a list of townships sorted by the
gap between the targeted population and beneficiaries reached in 2022.
Any of the columns can be sorted; the search bars above each column can
also be used to filter entries.
LS0tDQp0aXRsZTogIlJlcG9ydCBvbiA1V3MiDQpzdWJ0aXRsZTogIkp1bHkgMjAyMiINCmF1dGhvcjogIk15YW5tYXIgRm9vZCBTZWN1cml0eSBDbHVzdGVyIg0KZGF0ZTogIjIwMjItMDktMDEiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgdGhlbWU6IHJlYWRhYmxlDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogbm8NCiAgICBjb2xsYXBzZWQ6IG5vDQphbHdheXNfYWxsb3dfaHRtbDogeWVzDQotLS0NCg0KYGBge2NzcywgZWNobz1GQUxTRX0NCg0KI1RPQzo6YmVmb3JlIHsNCiAgY29udGVudDogIiI7DQogIGRpc3BsYXk6IGJsb2NrOw0KICBoZWlnaHQ6IDcwcHg7DQogIG1hcmdpbjogMmVtIDIwcHggNDBweCAyMHB4Ow0KICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIk15YW5tYXJfY2x1c3Rlcl9ibHVlLnBuZyIpOw0KICBiYWNrZ3JvdW5kLXNpemU6IGNvbnRhaW47DQogIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXI7DQogIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7DQp9DQpgYGANCg0KYGBgez1odG1sfQ0KPHN0eWxlPg0KICAgIGJvZHkgLm1haW4tY29udGFpbmVyIHsNCiAgICAgICAgbWF4LXdpZHRoOiAxMjgwcHg7DQogICAgfQ0KPC9zdHlsZT4NCmBgYA0KDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSwgZmlnLndpZHRoPTksIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZz1GQUxTRSkNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCmxpYnJhcnkoc3RyaW5naSkNCmxpYnJhcnkocGFuZGVyKQ0KbGlicmFyeShqYW5pdG9yKQ0KbGlicmFyeShmdXp6eWpvaW4pDQpsaWJyYXJ5KHNjYWxlcykNCmxpYnJhcnkobWFncml0dHIpDQpsaWJyYXJ5KHNmKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KbGlicmFyeSh2aXJpZGlzKQ0KbGlicmFyeShza2ltcikNCmxpYnJhcnkocGxvdGx5KQ0KbGlicmFyeShwYXRjaHdvcmspDQpsaWJyYXJ5KGJyb29tKQ0KbGlicmFyeShEVCkNCmxpYnJhcnkoaGVyZSkNCmxpYnJhcnkodGlkeXRleHQpDQpsaWJyYXJ5KGdnZm9yY2UpDQpsaWJyYXJ5KGZsZXh0YWJsZSkNCg0KdGhlbWVfc2V0KHRoZW1lX2xpZ2h0KCkpDQoNCiMgZGlzYWJsaW5nIHNjaWVudGlmaWMgbm90YXRpb24NCm9wdGlvbnMoc2NpcGVuID0gMTAwKQ0KDQojIHBhbmRlciB0YWJsZXMgYWxsIGluIG9uZSByb3cNCnBhbmRlck9wdGlvbnMoJ3RhYmxlLnNwbGl0LnRhYmxlJywgSW5mKQ0KDQojIHBhbmRlciB0aG91c2FuZHMgc2VwYXJhdG9yDQpwYW5kZXJPcHRpb25zKCJiaWcubWFyayIsICIsIikNCg0KIyByZXBsYWNlIA0Kb3B0cyA8LSBvcHRpb25zKGtuaXRyLmthYmxlLk5BID0gIiIpDQoNCmAlb3V0JWAgPC0gTmVnYXRlKGAlaW4lYCkNCg0KIyBmdW5jdGlvbiBmb3IgdHJhbnNwb3NpbmcgZGYNCnRyYW5zcG9zZV9kZiA8LSBmdW5jdGlvbihkZikgew0KICB0X2RmIDwtIGRhdGEudGFibGU6OnRyYW5zcG9zZShkZikNCiAgY29sbmFtZXModF9kZikgPC0gcm93bmFtZXMoZGYpDQogIHJvd25hbWVzKHRfZGYpIDwtIGNvbG5hbWVzKGRmKQ0KICB0X2RmIDwtIHRfZGYgJT4lDQogICAgdGliYmxlOjpyb3duYW1lc190b19jb2x1bW4oLmRhdGEgPSAuKSAlPiUNCiAgICB0aWJibGU6OmFzX3RpYmJsZSguKQ0KICByZXR1cm4odF9kZikNCn0NCg0KIyBmdW5jdGlvbiBiZW5lZmljaWFyeSBzdW1tYXJpZXMNCnN1bV9iZW4gPC0gZnVuY3Rpb24oZGYsIGNvbHVtbl92YXIpew0KICANCiAgY29sdW1uX3ZhciA8LSBlbnF1byhjb2x1bW5fdmFyKQ0KICANCiAgZGYgJT4lDQogICAgZ3JvdXBfYnkoISFjb2x1bW5fdmFyKSAlPiUgIyBtdXN0IGFkZCBiYW5nLWJhbmcNCiAgICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShuZXdfYmVuZWZpY2lhcmllcywgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICAgIC5ncm91cHMgPSAiZHJvcCIpICU+JSANCiAgICBhcnJhbmdlKGRlc2MoYmVuZWZpY2lhcmllcykpIA0KICAgIA0KfQ0KDQojIGZ1bmN0aW9uIGJlbmVmaWNpYXJ5IHN1bW1hcmllcywgMiBncm91cGVkIHZhcmlhYmxlcw0Kc3VtX2JlbjIgPC0gZnVuY3Rpb24oZGYsIGNvbHVtbl92YXIxLCBjb2x1bW5fdmFyMil7DQogIA0KICBjb2x1bW5fdmFyMSA8LSBlbnF1byhjb2x1bW5fdmFyMSkNCiAgY29sdW1uX3ZhcjIgPC0gZW5xdW8oY29sdW1uX3ZhcjIpDQogIA0KICBkZiAlPiUNCiAgICBncm91cF9ieSghIWNvbHVtbl92YXIxLCAhIWNvbHVtbl92YXIyKSAlPiUgIyBtdXN0IGFkZCBiYW5nLWJhbmcNCiAgICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShuZXdfYmVuZWZpY2lhcmllcywgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICAgIC5ncm91cHMgPSAiZHJvcCIpIA0KICAgIA0KfQ0KDQojIHNjYWxpbmcgZnVuY3Rpb25zIA0KcmFuZ2UwMSA8LSBmdW5jdGlvbih4KXsoeC1taW4oeCkpLyhtYXgoeCktbWluKHgpKX0NCnJhbmdlX3duYSA8LSBmdW5jdGlvbih4KXsoeC1taW4oeCwgbmEucm0gPSBUUlVFKSkvKG1heCh4LCBuYS5ybSA9IFRSVUUpLW1pbih4LCBuYS5ybSA9IFRSVUUpKX0NCg0KI21vZGUgZnVuY3Rpb24gDQptb2RlIDwtIGZ1bmN0aW9uKHgpIHsNCiAgdXggPC0gdW5pcXVlKHgpDQogIHV4W3doaWNoLm1heCh0YWJ1bGF0ZShtYXRjaCh4LCB1eCkpKV0NCn0NCmBgYA0KDQoNCmBgYHtyIGRhdGF9DQoNCmZzYyA8LSByZWFkX2NzdigiLi9kYXRhL2ZzYy5jc3YiKSAlPiUgDQogIG11dGF0ZShqdWx5ID0gaWZlbHNlKG1vbnRoX29mX2ltcGxlbWVudGF0aW9uID09ICJKdWx5IDIwMjIiLCANCiAgICAgICAgICAgICAgICAgICAgICAgImp1bHkiLCAiamFuX3RvX2p1biIpKSANCg0KZnNjXzIwMjEgPC0gcmVhZF9jc3YoIi4vZGF0YS9mc2NfMjAyMS5jc3YiKQ0KDQpwaW4gPC0gcmVhZF9jc3YoIi4vZGF0YS9mc19waW4uY3N2IikNCg0KaGRfbGlzdCA8LSBmc2MgJT4lIA0KICBncm91cF9ieShodW1hbml0YXJpYW5fb3JfZGV2ZWxvcG1lbnQsIGFjdGl2aXR5X3JlZCkgJT4lDQogIG11dGF0ZShoZCA9IGlmZWxzZShodW1hbml0YXJpYW5fb3JfZGV2ZWxvcG1lbnQgPT0gIkh1bWFuaXRhcmlhbiIgfA0KICAgICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eV9yZWQgPT0gImZvb2QgZGlzdHJpYnV0aW9uIiwgDQogICAgICAgICAgICAgICAgICAgICAiSHVtYW5pdGFyaWFuIiwgDQogICAgICAgICAgICAgICAgICAgICAiRGV2ZWxvcG1lbnQiKSkgJT4lIA0KICBtdXRhdGUoaHVtYW5pdGFyaWFuX29yX2RldmVsb3BtZW50ID0gDQogICAgICAgICAgIGlmZWxzZShhY3Rpdml0eV9yZWQgPT0gIm11bHRpLXB1cnBvc2UgY2FzaCB0cmFuc2ZlciIgJg0KICAgICAgICAgICAgICAgICAgICBodW1hbml0YXJpYW5fb3JfZGV2ZWxvcG1lbnQgPT0gIkRldmVsb3BtZW50IiwNCiAgICAgICAgICAgICAgICAgICJIdW1hbml0YXJpYW4iLCBodW1hbml0YXJpYW5fb3JfZGV2ZWxvcG1lbnQpDQogICAgICAgICApICU+JQ0KICBncm91cF9ieShoZCkgJT4lIA0KICBzdW1tYXJpc2VfYXQoImJlbmVmaWNpYXJpZXMiLCBzdW0pICU+JQ0KICBtdXRhdGUocGMgPSByb3VuZChiZW5lZmljaWFyaWVzIC8gc3VtKGJlbmVmaWNpYXJpZXMpICogMTAwLCBkaWdpdHMgPSAyKSkNCg0KIyBzaGFwZWZpbGVzDQpwY29kZTNfc2hhcGUgPC0gc3RfcmVhZCgiLi9tbXJfcG9sYm5kYV9hZG0zX21pbXVfMjUway9tbXJfcG9sYm5kYV9hZG0zX21pbXVfMjUway5zaHAiLCBxdWlldCA9IFRSVUUpICU+JSANCiAgcmVuYW1lKHN0YXRlID0gU1QsIA0KICAgICAgICBhZG1pbjFfcGNvZGUgPSBTVF9QQ09ERSwNCiAgICAgICAgdG93bnNoaXAgPSBUUywNCiAgICAgICAgYWRtaW4zX3Bjb2RlID0gVFNfUENPREUpICU+JSANCiBtdXRhdGUoYWRtaW4zX3Bjb2RlID0gaWZlbHNlKHN0cl9kZXRlY3QodG93bnNoaXAsICJIbGFpbmd0aGFyeWEiKSwgIk1NUjAxMzAwOCIsIGFkbWluM19wY29kZSkpDQoNCnBjb2RlMV9zaGFwZSA8LSBzdF9yZWFkKCIuL21tcl9wb2xibmRhMl9hZG0xX21pbXVfMjUway9tbXJfcG9sYm5kYTJfYWRtMV9taW11XzI1MGsuc2hwIiwgcXVpZXQgPSBUUlVFKSAlPiUgDQogcmVuYW1lKHN0YXRlID0gU1QsIA0KICAgICAgICBhZG1pbjFfcGNvZGUgPSBTVF9QQ09ERSkgJT4lIHN0X2FzX3NmKCkNCg0KYGBgDQoNCg0KW0Zvb2QgU2VjdXJpdHkgQ2x1c3RlciBNeWFubWFyIGhvbWVwYWdlXShodHRwczovL2Zvb2Qtc2VjdXJpdHktY2x1c3Rlci1teWFubWFyLmdpdGh1Yi5pby8pDQoNCjxicj4NCg0KDQojIyBTdW1tYXJ5IG9mIG5ldyBhY2hpZXZlbWVudHMgIA0KDQpgYGB7ciBtYXBzLXRzcC1qdWwsIGZpZy5oZWlnaHQ9OX0NCmZzYyAlPiUgDQogIGZpbHRlcihqdWx5ID09ICJqdWx5IikgJT4lIA0KICBncm91cF9ieShhZG1pbjNfcGNvZGVfb2xkKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKG5ld19iZW5lZmljaWFyaWVzKSkgJT4lIA0KICByaWdodF9qb2luKHBjb2RlM19zaGFwZSwgYnkgPSBjKCJhZG1pbjNfcGNvZGVfb2xkIiA9ICJhZG1pbjNfcGNvZGUiKSkgJT4lIA0KICBzdF9hc19zZigpICU+JSANCiAgZ2dwbG90KCkgKyANCiAgZ2VvbV9zZihhZXMoZmlsbCA9IGJlbmVmaWNpYXJpZXMpLCBzaXplID0gLjEpICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpcmVjdGlvbiA9IC0xLCANCiAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gImxvZzEwIiwNCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGMoMTAwLCAxMDAwLCAxMDAwMCwgMTAwMDAwLCA1MDAwMDApLCANCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGNvbW1hLCANCiAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyYXk5MCIsIA0KICAgICAgICAgICAgICAgICAgICAgYmVnaW4gPSAuMykgKyANCiAgdGhlbWVfdm9pZCgpICsgDQogIHRoZW1lKGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksIA0KICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwgDQogICAgICAgIGxlZ2VuZC5rZXkuc2l6ZSA9IHVuaXQoLjcsICJjbSIpLCANCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiLCBjb2xvdXIgPSAid2hpdGUiKSkgKyANCiAgbGFicyh0aXRsZSA9ICJCZW5lZmljaWFyaWVzIGJ5IHRvd25zaGlwLCBKdWx5IDIwMjIiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJUb3duc2hpcHMgaW4gZ3JleSBkbyBub3QgaGF2ZSBhbnkgcGFydG5lcnMgcHJlc2VudCIsIA0KICAgICAgIGZpbGwgPSAiQmVuZWZpY2lhcmllcyIpICsgDQogIA0KZnNjICU+JSANCiAgIyBmaWx0ZXIocXVhcnRlciA9PSAicTIiKSAlPiUgDQogIGdyb3VwX2J5KGFkbWluM19wY29kZV9vbGQpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpKSAlPiUgDQogIHJpZ2h0X2pvaW4ocGNvZGUzX3NoYXBlLCBieSA9IGMoImFkbWluM19wY29kZV9vbGQiID0gImFkbWluM19wY29kZSIpKSAlPiUgDQogIHN0X2FzX3NmKCkgJT4lIA0KICBnZ3Bsb3QoKSArIA0KICBnZW9tX3NmKGFlcyhmaWxsID0gYmVuZWZpY2lhcmllcyksIHNpemUgPSAuMSkgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlyZWN0aW9uID0gLTEsIHRyYW5zID0gImxvZzEwIiwgDQogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKDEwMCwgMTAwMCwgMTAwMDAsIDEwMDAwMCwgNTAwMDAwKSwgDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjb21tYSwgDQogICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmF5OTAiKSArIA0KICB0aGVtZV92b2lkKCkgKyANCiAgdGhlbWUobGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwgDQogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLCANCiAgICAgICAgbGVnZW5kLmtleS5zaXplID0gdW5pdCguNywgImNtIiksIA0KICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIsIGNvbG91ciA9ICJ3aGl0ZSIpKSArIA0KICBsYWJzKHRpdGxlID0gIkJlbmVmaWNpYXJpZXMgYnkgdG93bnNoaXAsIGFzIG9mIDIwMjItMDctMzEiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJUb3duc2hpcHMgaW4gZ3JleSBkbyBub3QgaGF2ZSBhbnkgcGFydG5lcnMgcHJlc2VudCIsIA0KICAgICAgIGZpbGwgPSAiQmVuZWZpY2lhcmllcyIpICANCg0KIyBnZ3NhdmUoIi4vbWFwc19xMV9xMi5wbmciLCBkcGkgPSAzMDAsIGhlaWdodCA9IDksIHdpZHRoID0gOCwgdW5pdHMgPSAiaW4iKQ0KICANCmBgYA0KDQoNCg0KYGBge3Igb3ZlcmFsbC1wYywgZXZhbD1GQUxTRX0NCmZpbHRlcihmc2MsIGh1bWFuaXRhcmlhbl9vcl9kZXZlbG9wbWVudCA9PSAiSHVtYW5pdGFyaWFuIikgJT4lIHtzdW0oLiRuZXdfYmVuZWZpY2lhcmllcyl9IC8gc3VtKHBpbiRmc190YXJnZXRlZCkNCg0Kcm91bmQoZmlsdGVyKGZzYywgaHVtYW5pdGFyaWFuX29yX2RldmVsb3BtZW50ID09ICJIdW1hbml0YXJpYW4iICYganVseSA9PSAianVseSIpICU+JSB7c3VtKC4kbmV3X2JlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSl9IC8gZmlsdGVyKGZzYywganVseSA9PSAianVseSIpICU+JSB7c3VtKC4kbmV3X2JlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSl9ICogMTAwLCBkaWdpdHMgPSAyKQ0KYGBgDQoNCkJlbmVmaWNpYXJpZXMgb2YgaHVtYW5pdGFyaWFuIGFjdGlvbiBmb3JtZWQgYHIgcm91bmQoZmlsdGVyKGZzYywgaHVtYW5pdGFyaWFuX29yX2RldmVsb3BtZW50ID09ICJIdW1hbml0YXJpYW4iICYganVseSA9PSAianVseSIpICU+JSB7c3VtKC4kbmV3X2JlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSl9IC8gZmlsdGVyKGZzYywganVseSA9PSAianVseSIpICU+JSB7c3VtKC4kbmV3X2JlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSl9ICogMTAwLCBkaWdpdHMgPSAyKWAlIG9mIHRoZSBgciBmaWx0ZXIoZnNjLCBqdWx5ID09ICJqdWx5IikgJT4lIHtzdW0oLiRuZXdfYmVuZWZpY2lhcmllcywgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIGJlbmVmaWNpYXJpZXMgaW4gSnVseSAyMDIyLiBUaGUgcmVtYWluZGVyIHdlcmUgcmVhY2hlZCB0aHJvdWdoIGRldmVsb3BtZW50IGludGVydmVudGlvbnMuDQoNCkluIHRoaXMgcmVwb3J0LCB3aGVuIGJlbmVmaWNpYXJpZXMgYXJlIG1lbnRpb25lZCwgdGhlIEZvb2QgU2VjdXJpdHkgQ2x1c3RlciBpcyByZWZlcnJpbmcgdG8gdW5pcXVlIGJlbmVmaWNpYXJpZXMgb3IgaW5kaXZpZHVhbHMuIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gYSBiZW5lZmljaWFyeSBmcmVxdWVuY3kgd2hpY2ggaXMgYW4gaW5zdGFuY2Ugb2YgYSBwZXJzb24gcmVjZWl2aW5nIGFpZCBpLmUuIGEgcGVyc29uIHdobyByZWNlaXZlcyBmb29kIGRpc3RyaWJ1dGlvbnMsIGEgY3JvcCwgdmVnZXRhYmxlIGFuZCBzZWVkIGtpdCBhbmQgZmFybWVyIHRyYWluaW5nIHdvdWxkIGJlIGNvdW50ZWQgYXMgdGhyZWUgYmVuZWZpY2lhcnkgZnJlcXVlbmNpZXMsIGJ1dCBhcyBvbmx5IG9uZSBiZW5lZmljaWFyeS4gDQoNCkFzIG1vbnRobHkgcmVwb3J0aW5nIGhhcyBqdXN0IHN0YXJ0ZWQsIHRoZSB2b2x1bWUgb2YgcmVwb3J0aW5nIGlzIHN0aWxsIGxvd2VyIHRoYW4gdGhlIHByby1yYXRlZCBxdWFydGVybHkgc3VibWlzc2lvbnMuIFRoaXMgbWVhbnMgdGhhdCBzZXZlcmFsIHBhcnRuZXJzIHdpbGwgaG9sZCBvZmYgb24gcmVwb3J0aW5nIHRoZWlyIGFjaGlldmVtZW50cyB1bnRpbCB0aGUgZW5kIG9mIHRoZSBxdWFydGVyLiANCg0KYGBge3J9DQpmc2MgJT4lICAgDQogIGdyb3VwX2J5KGRhdGUpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpKSAlPiUgDQogIGFycmFuZ2UoZGF0ZSkgJT4lIA0KICBtdXRhdGUoYmVuZWZpY2lhcmllcyA9IGN1bXN1bShiZW5lZmljaWFyaWVzKSwgDQogICAgICAgICBuZXdfYmVuZWZpY2lhcmllcyA9IGlmZWxzZSgNCiAgICAgICAgICAgaXMubmEoYmVuZWZpY2lhcmllcyAtIGxhZyhiZW5lZmljaWFyaWVzKSksIA0KICAgICAgICAgICBiZW5lZmljaWFyaWVzLCANCiAgICAgICAgICAgYmVuZWZpY2lhcmllcyAtIGxhZyhiZW5lZmljaWFyaWVzKQ0KICAgICAgICAgKSwgDQogICAgICAgICBgJV9pbmNyZWFzZWAgPSByb3VuZCgoYmVuZWZpY2lhcmllcyAtIGxhZyhiZW5lZmljaWFyaWVzKSkgLyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWcoYmVuZWZpY2lhcmllcykgKiAxMDAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBkaWdpdHMgPSAyKSwgDQogICAgICAgICBkYXRlID0gZm9ybWF0KGFzLkRhdGUoZGF0ZSksICIlYiAlWSIpKSAlPiUgDQogIGZsZXh0YWJsZSgpICU+JSANCiAgc2V0X2NhcHRpb24oIkJlbmVmaWNpYXJpZXMgcmVhY2hlZCBwZXIgbW9udGgiKSAlPiUgDQogIHRoZW1lX3plYnJhKCkgJT4lIA0KICBzZXRfdGFibGVfcHJvcGVydGllcyhsYXlvdXQgPSAiYXV0b2ZpdCIsIHdpZHRoID0gLjcpIA0KYGBgDQoNCjxicj4NCg0KSW4gdGVybXMgb2YgYWN0aXZpdGllcywgZmFybWVyIHRyYWluaW5nIGFuZCBmb29kIGRpc3RyaWJ1dGlvbnMgZm9ybWVkIHRoZSBidWxrIG9mIHRoZSBhY3Rpdml0aWVzIGltcGxlbWVudGVkIGluIEp1bHkuIEhvd2V2ZXIsIGFzIG1lbnRpb25lZCBlYXJsaWVyLCB0aGVzZSBmaWd1cmUgd2lsbCBiZSByZXZpc2VkIHdoZW4gbmV3IGRhdGEgY29tZXMgaW4uIA0KDQo8YnI+DQoNCg0KYGBge3IgYWN0aXZpdHktbGlzdH0NCmFjdGl2aXR5X2xpc3QgPC0gZnNjICU+JSANCiAgc3VtX2JlbjIocXVhcnRlciwgYWN0aXZpdHlfcmVkKSAlPiUgDQogIGdyb3VwX2J5KHF1YXJ0ZXIpICU+JSANCiAgbXV0YXRlKHBjID0gcm91bmQoYmVuZWZpY2lhcmllcyAvIHN1bShiZW5lZmljaWFyaWVzKSAqIDEwMCwgZGlnaXRzID0gMikpDQpgYGANCg0KDQpgYGB7ciBiYXJwbG90LWFjdGl2aXR5fQ0KDQpmc2MgJT4lIA0KICBmaWx0ZXIoanVseSA9PSAianVseSIpICU+JSANCiAgZ3JvdXBfYnkoYWN0aXZpdHkgPSBhY3Rpdml0eV9yZWQpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpKSAlPiUgDQogIG11dGF0ZShhY3Rpdml0eSA9IGZjdF9yZW9yZGVyKGFjdGl2aXR5LCBiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBiZW5lZmljaWFyaWVzLCANCiAgICAgICAgICAgICB5ID0gYWN0aXZpdHksIA0KICAgICAgICAgICAgIGZpbGwgPSBhY3Rpdml0eSkpICsgDQogIGdlb21fY29sKCkgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY29tbWEoYmVuZWZpY2lhcmllcykpLCANCiAgICAgICAgICAgIGhqdXN0ID0gImlud2FyZCIpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArDQogIGxhYnMoeCA9ICJOdW1iZXIgb2YgYmVuZWZpY2lhcmllcyIsIA0KICAgICAgIHkgPSAiIiwgDQogICAgICAgdGl0bGUgPSAiQmVuZWZpY2lhcmllcyByZWFjaGVkIGluIEp1bHkgMjAyMiwgYnkgYWN0aXZpdHkiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikNCg0KYGBgDQoNCjxicj4NCg0KT3ZlcmFsbCwgaG93ZXZlciwgZm9vZCBkaXN0cmlidXRpb24gcmVtYWlucyBmYXIgYW5kIGF3YXkgdGhlIGxhcmdlc3QgYWN0aXZpdHkuIA0KDQo8YnI+DQoNCmBgYHtyIHRhYmxlLWFjdGl2aXR5fQ0KZnNjICU+JSANCiAgZ3JvdXBfYnkoanVseSwgYWN0aXZpdHlfcmVkKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKG5ld19iZW5lZmljaWFyaWVzKSkgJT4lIA0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0ganVseSwgdmFsdWVzX2Zyb20gPSBiZW5lZmljaWFyaWVzLCANCiAgICAgICAgICAgICAgdmFsdWVzX2ZpbGwgPSAwKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IGphbl90b19qdW4gKyBqdWx5LCANCiAgICAgICAgIHBjID0gcm91bmQodG90YWwgLyBzdW0odG90YWwsIG5hLnJtID0gVFJVRSkgKiAxMDAsIA0KICAgICAgICAgICAgICAgICAgICBkaWdpdHMgPSAyKSwgDQogICAgICAgICBwY19qdWx5ID0gcm91bmQoanVseSAvIHN1bShqdWx5LCBuYS5ybSA9IFRSVUUpICogMTAwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlnaXRzID0gMikpICU+JSANCiAgZmlsdGVyKHRvdGFsICE9IDApICU+JSANCiAgYXJyYW5nZShkZXNjKHBjKSkgJT4lIA0KICBzZWxlY3QoYWN0aXZpdHkgPSBhY3Rpdml0eV9yZWQsIA0KICAgICAgICAgamFuX3RvX2p1biwganVseSwgDQogICAgICAgICBgJV9vZl9qdWx5YCA9IHBjX2p1bHksIA0KICAgICAgICAgdG90YWwsIA0KICAgICAgICAgYCVfb2ZfdG90YWxgID0gcGMpICU+JSANCiAgYWRvcm5fdG90YWxzKCJyb3ciKSAlPiUgDQogIGZsZXh0YWJsZSgpICU+JSANCiAgc2V0X2NhcHRpb24oY2FwdGlvbiA9ICJCZW5lZmljaWFyaWVzIGJ5IGFjaXRpdml0eSwgYXMgb2YgMzEgSnVseSAyMDIyIikgJT4lIA0KICB0aGVtZV96ZWJyYSgpICU+JSANCiAgc2V0X3RhYmxlX3Byb3BlcnRpZXMobGF5b3V0ID0gImF1dG9maXQiLA0KICAgICAgICAgICAgICB3aWR0aCA9IC44NSkNCg0KDQpgYGANCg0KPGJyPg0KDQoNCmBgYHtyIGJlbi10eXBlLWxpc3R9DQpiZW5fdHlwZV9saXN0IDwtIGZzYyAlPiUNCiAgZmlsdGVyKGp1bHkgPT0gImp1bHkiKSAlPiUgDQogIGdyb3VwX2J5KGJlbmVmaWNpYXJ5X3R5cGUpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpKSAlPiUgDQogIG11dGF0ZShwYyA9IHJvdW5kKGJlbmVmaWNpYXJpZXMgLyBzdW0oYmVuZWZpY2lhcmllcykgKiAxMDAsIGRpZ2l0cyA9IDIpKQ0KYGBgDQoNCkZvb2Qgc2VjdXJpdHkgaW50ZXJ2ZW50aW9ucyBpbiBKdWx5IDIwMjIgb3ZlcndoZWxtaW5nbHkgdGFyZ2V0ZWQgcGVyc29ucyBpbiBob3N0IGFuZCBsb2NhbCBjb21tdW5pdGllcywgdGhpcyBncm91cCBmb3JtcyBgciBiZW5fdHlwZV9saXN0ICU+JSBmaWx0ZXIoYmVuZWZpY2lhcnlfdHlwZSA9PSAiSG9zdC9sb2NhbCBDb21tdW5pdHkiKSAlPiUgcHVsbChwYylgJSBvZiBhbGwgZm9vZCBkaXN0cmlidXRpb24gc3VwcG9ydCwgb3IgYHIgYmVuX3R5cGVfbGlzdCAlPiUgZmlsdGVyKGJlbmVmaWNpYXJ5X3R5cGUgPT0gIkhvc3QvbG9jYWwgQ29tbXVuaXR5IikgJT4lIHB1bGwoYmVuZWZpY2lhcmllcykgJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIGJlbmVmaWNpYXJ5IGZyZXF1ZW5jaWVzICh0aGlzIGluY2x1ZGVzIGlmIGEgcGVyc29uIGhhZCBiZWVuIHJlYWNoZWQgcHJldmlvdXNseSBhbmQgYXJlIGN1cnJlbnRseSByZWNlaXZpbmcgdGhlaXIgc2Vjb25kIG9yIHRoaXJkIHJvdW5kIG9mIGFzc2lzdGFuY2UpLiANCg0KDQo8YnI+PGJyPjxicj4NCg0KIyMgMS4gR2VvZ3JhcGhpZXMNCg0KPGJyPjxicj4NCg0KIyMjIDEuMSBTdGF0ZXMNCg0KQSB0b3RhbCBvZiBgciBmb3JtYXQoc3VtKGZzYyRuZXdfYmVuZWZpY2lhcmllcyksIGJpZy5tYXJrID0gIiwiKWAgYmVuZWZpY2lhcmllcyB3ZXJlIHJlYWNoZWQgaW4gSnVseSAyMDIyLiANCg0KPGJyPg0KDQoNCmBgYHtyIHN0YXRlLWp1bHksIGZpZy5oZWlnaHQgPSA2fQ0KDQpmc2MgJT4lIA0KICBmaWx0ZXIoanVseSA9PSAianVseSIpICU+JSANCiAgZ3JvdXBfYnkoc3RhdGUpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpKSAlPiUgDQogIGdncGxvdChhZXMoeSA9IGZjdF9yZW9yZGVyKHN0YXRlLCBiZW5lZmljaWFyaWVzKSwgDQogICAgICAgICAgICAgeCA9IGJlbmVmaWNpYXJpZXMsIA0KICAgICAgICAgICAgIGZpbGwgPSBzdGF0ZSkpICsgDQogIGdlb21fY29sKCkgKyANCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGNvbW1hKGJlbmVmaWNpYXJpZXMpKSwgDQogICAgICAgICAgICBoanVzdCA9ICJpbndhcmQiKSArDQogIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBjb21tYSkgKyANCiAgbGFicyhmaWxsID0gIiIsIA0KICAgICAgIHggPSAiQmVuZWZpY2lhcmllcyIsIA0KICAgICAgIHkgPSAiIiwgDQogICAgICAgdGl0bGUgPSAiQmVuZWZpY2lhcmllcyByZWFjaGVkIGJ5IHN0YXRlLCBvbmx5IEp1bHkgMjAyMiIpICsgDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikNCiAgDQpgYGANCg0KPGJyPg0KDQpPdmVyYWxsLCB0aGVzZSBhcmUgeWVhci10by1kYXRlIHN0YXRlLWxldmVsIGJyZWFrZG93bnMgb2YgYmVuZWZpY2lhcmllcyByZWFjaGVkOiANCg0KPGJyPg0KDQpgYGB7ciBzdGF0ZS15dGQsIGZpZy5oZWlnaHQgPSA2fQ0KDQpmc2MgJT4lIA0KICBncm91cF9ieShzdGF0ZSkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShuZXdfYmVuZWZpY2lhcmllcykpICU+JSANCiAgZ2dwbG90KGFlcyh5ID0gZmN0X3Jlb3JkZXIoc3RhdGUsIGJlbmVmaWNpYXJpZXMpLCANCiAgICAgICAgICAgICB4ID0gYmVuZWZpY2lhcmllcywgDQogICAgICAgICAgICAgZmlsbCA9IHN0YXRlKSkgKyANCiAgZ2VvbV9jb2woKSArIA0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY29tbWEoYmVuZWZpY2lhcmllcykpLCANCiAgICAgICAgICAgIGhqdXN0ID0gImlud2FyZCIpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArIA0KICBsYWJzKGZpbGwgPSAiIiwgDQogICAgICAgeCA9ICJCZW5lZmljaWFyaWVzIiwgDQogICAgICAgeSA9ICIiLCANCiAgICAgICB0aXRsZSA9ICJCZW5lZmljaWFyaWVzIHJlYWNoZWQgYnkgc3RhdGUsIGFzIG9mIDMxIEp1bHkgMjAyMiIpICsgDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikNCiAgDQpgYGANCg0KPGJyPjxicj4NCg0KDQpgYGB7ciBzdGF0ZS1saXN0fQ0Kc3RhdGVfbGlzdCA8LSBmc2MgJT4lIA0KICBzdW1fYmVuMihzdGF0ZSwgcXVhcnRlcikgJT4lIA0KICBncm91cF9ieShxdWFydGVyKSAlPiUgDQogIG11dGF0ZShwYyA9IHJvdW5kKGJlbmVmaWNpYXJpZXMgLyBzdW0oYmVuZWZpY2lhcmllcykgKiAxMDAsIGRpZ2l0cyA9IDIpKQ0KDQpgYGANCg0KDQpKdWx5IHNhdyBtdWNoIGZld2VyIHBlcnNvbnMgcmVhY2hlZCBpbiBZYW5nb24gdGhhbiBpbiBwcmV2aW91cyBtb250aHMuIEl0IGlzIGhvcGVkIHRoYXQgdGhlIHJlYWxsb2NhdGlvbiBvZiByZXNvdXJjZXMgb3V0IG9mIHRoZSBhZmZsdWVudCB1cmJhbiBjb3JlIGhhcyBiZWVuIGFjY2VsZXJhdGVkLiBJdCBpcyBhbHNvIGVuY291cmFnaW5nIHRvIHNlZSBNYWd3YXkgcmVjZWl2ZSB0aGUgc2Vjb25kLW1vc3Qgc3VwcG9ydCwgYWZ0ZXIgUmFraGluZS4gDQoNCmBgYHtyIGV2YWw9IEZBTFNFfQ0KZnNjICU+JSANCiAgZmlsdGVyKGp1bHkgPT0gImp1bHkiKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKG5ld19iZW5lZmljaWFyaWVzKSkNCmBgYA0KDQoNCjxicj48YnI+DQoNCiMjIyAxLjIgVG93bnNoaXBzDQoNCkEgdG90YWwgb2YgYHIgZGlzdGluY3QoZnNjLCBhZG1pbjNfcGNvZGUpICU+JSBucm93KClgIHRvd25zaGlwcyBoYXZlIGJlZW4gcmVhY2hlZCBhY3Jvc3MgYHIgZGlzdGluY3QoZnNjLCBhZG1pbjFfcGNvZGUpICU+JSBucm93KClgIHN0YXRlcy9yZWdpb25zIGFzIG9mIDMxc3QgSnVseSAyMDIyLiBJbiBKdWx5IGFsb25lLCBgciBmaWx0ZXIoZnNjLCBqdWx5ID09ICJqdWx5IikgJT4lIGRpc3RpbmN0KGFkbWluM19wY29kZSkgJT4lIG5yb3coKWAgdG93bnNoaXBzIHdlcmUgcmVhY2hlZC4gDQoNCmBgYHtyIHRvcC10b3duc2hpcHMtcGMsIGluY2x1ZGU9RkFMU0V9DQpmc2MgJT4lIA0KICBncm91cF9ieShzdGF0ZSwgdG93bnNoaXApICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUgDQogIG11dGF0ZShwYyA9IGJlbmVmaWNpYXJpZXMgLyBzdW0oYmVuZWZpY2lhcmllcykpICU+JSANCiAgYXJyYW5nZShkZXNjKHBjKSkgJT4lIA0KICBmaWx0ZXIoYmVuZWZpY2lhcmllcyA+IDEyMDAwMCkgJT4lIA0KICB7c3VtKC4kcGMpfQ0KYGBgDQoNCjExLDE4MiBiZW5lZmljaWFyaWVzIHdlcmUgcmVhY2hlZCBpbiBNYWd3YXkgdG93bnNoaXAsIHRoaXMgd2FzIDIyJSBvZiB0aGUgdG90YWwuICANCg0KPGJyPg0KDQpgYGB7ciB0YWJsZS10b3AtdG93bnNoaXBzfQ0KZnNjICU+JSANCiAgZ3JvdXBfYnkoc3RhdGUsIHRvd25zaGlwLCBqdWx5KSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKG5ld19iZW5lZmljaWFyaWVzKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lIA0KICBwaXZvdF93aWRlcih2YWx1ZXNfZnJvbSA9IGJlbmVmaWNpYXJpZXMsIG5hbWVzX2Zyb20gPSBqdWx5LCANCiAgICAgICAgICAgICAgdmFsdWVzX2ZpbGwgPSAwKSAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IGphbl90b19qdW4gKyBqdWx5LCANCiAgICAgICAgIHBjID0gcm91bmQodG90YWwgLyBzdW0odG90YWwpICogMTAwLCANCiAgICAgICAgICAgICAgICAgICAgZGlnaXRzID0gMiksIA0KICAgICAgICAgcGNfanVseSA9IHJvdW5kKGp1bHkgLyBzdW0oanVseSkgKiAxMDAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWdpdHMgPSAyKSkgJT4lIA0KICBhcnJhbmdlKGRlc2MocGNfanVseSkpICU+JSANCiAgaGVhZCgxMikgJT4lIA0KICAjIHN1bW1hcmlzZV9hdCgianVseSIsIHN1bSkNCiAgc2VsZWN0KHN0YXRlLCB0b3duc2hpcCwgDQogICAgICAgICBqYW5fdG9fanVuLCBqdWx5LCANCiAgICAgICAgIGAlX29mX2p1bHlgID0gcGNfanVseSwgDQogICAgICAgICB0b3RhbCwgDQogICAgICAgICBgJV9vZl90b3RhbGAgPSBwYykgJT4lDQogIGZsZXh0YWJsZSgpICU+JSANCiAgc2V0X2NhcHRpb24oY2FwdGlvbiA9ICJUb3AgdG93bnNoaXBzIGJ5IGJlbmVmaWNpYXJpZXMgcmVhY2hlZCwgSnVseSAyMDIyIikgJT4lIA0KICB0aGVtZV96ZWJyYSgpICU+JSANCiAgZm9vdG5vdGUocGFydCA9ICJoZWFkZXIiLCANCiAgICAgICAgICAgaSA9IDEsIGogPSA0LA0KICAgICAgICAgICB2YWx1ZSA9IGFzX3BhcmFncmFwaCgoIlRoZXNlIHRvcCAxMiB0b3duc2hpcHMgYXJlIHdoZXJlIDg2JSBvZiBiZW5lZmljaWFyaWVzIHdlcmUgcmVhY2hlZCBpbiBKdWx5IikpKQ0KDQojIGZzYyAlPiUgZmlsdGVyKGp1bHkgPT0gImp1bHkiKSAlPiUgc3VtbWFyaXNlX2F0KCJuZXdfYmVuZWZpY2lhcmllcyIsIHN1bSkNCiAgDQpgYGANCg0KPGJyPg0KDQpXaGVuIGNvbXBhcmluZyB0aGUgY3VycmVudCBmb290cHJpbnQgdG8gdGhhdCBvZiB0aGUgZmlyc3QgcXVhcnRlciwgdGhlIG1vcmUgYWN0aXZpdHkgd2FzIG9ic2VydmVkIGluIE1hbmRhbGF5LCBNYWd3YXksIEtheWFoIGFuZCBLYXlpbi4gDQoNCg0KPGJyPg0KDQpgYGB7ciBtYXBzLWp1bHksIGZpZy5oZWlnaHQ9OX0NCmZzYyAlPiUgDQogIGZpbHRlcihqdWx5ID09ICJqdWx5IikgJT4lIA0KICBncm91cF9ieShhZG1pbjNfcGNvZGVfb2xkKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKG5ld19iZW5lZmljaWFyaWVzKSkgJT4lIA0KICByaWdodF9qb2luKHBjb2RlM19zaGFwZSwgYnkgPSBjKCJhZG1pbjNfcGNvZGVfb2xkIiA9ICJhZG1pbjNfcGNvZGUiKSkgJT4lIA0KICBzdF9hc19zZigpICU+JSANCiAgZ2dwbG90KCkgKyANCiAgZ2VvbV9zZihhZXMoZmlsbCA9IGJlbmVmaWNpYXJpZXMpLCBzaXplID0gLjEpICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpcmVjdGlvbiA9IC0xLA0KICAgICAgICAgICAgICAgICAgICAgb3B0aW9uID0gIm1ha28iLCANCiAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gImxvZzEwIiwNCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGMoMTAwLCAxMDAwLCAxMDAwMCwgMTAwMDAwLCA1MDAwMDApLCANCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGNvbW1hLCANCiAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyYXk5MCIsIA0KICAgICAgICAgICAgICAgICAgICAgYmVnaW4gPSAuMykgKyANCiAgdGhlbWVfdm9pZCgpICsgDQogIHRoZW1lKGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksIA0KICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwgDQogICAgICAgIGxlZ2VuZC5rZXkuc2l6ZSA9IHVuaXQoLjcsICJjbSIpLCANCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiLCBjb2xvdXIgPSAid2hpdGUiKSkgKyANCiAgbGFicyh0aXRsZSA9ICJCZW5lZmljaWFyaWVzIGJ5IHRvd25zaGlwLCBKdWx5IDIwMjIiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJUb3duc2hpcHMgaW4gZ3JleSBkbyBub3QgaGF2ZSBhbnkgcGFydG5lcnMgcHJlc2VudCIsIA0KICAgICAgIGZpbGwgPSAiQmVuZWZpY2lhcmllcyIpICsgDQogIA0KZnNjICU+JSANCiAgZmlsdGVyKGp1bHkgPT0gImp1bHkiKSAlPiUgDQogIGdyb3VwX2J5KGFkbWluM19wY29kZV9vbGQpICU+JSANCiAgc3VtbWFyaXNlKHBhcnRuZXJzID0gbl9kaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lcikpICU+JSANCiAgbXV0YXRlKHBhcnRuZXJzID0gYXMuY2hhcmFjdGVyKHBhcnRuZXJzKSkgJT4lIA0KICByaWdodF9qb2luKHBjb2RlM19zaGFwZSwgYnkgPSBjKCJhZG1pbjNfcGNvZGVfb2xkIiA9ICJhZG1pbjNfcGNvZGUiKSkgJT4lIA0KICBzdF9hc19zZigpICU+JSANCiAgZ2dwbG90KCkgKyANCiAgZ2VvbV9zZihhZXMoZmlsbCA9IHBhcnRuZXJzKSwgc2l6ZSA9IC4xKSArDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19kKGRpcmVjdGlvbiA9IC0xLA0KICAgICAgICAgICAgICAgICAgICAgICBvcHRpb24gPSAibWFrbyIsDQogICAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyYXk5MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICBiZWdpbiA9IC4zKSArIA0KICB0aGVtZV92b2lkKCkgKyANCiAgdGhlbWUobGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwgDQogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLCANCiAgICAgICAgbGVnZW5kLmtleS5zaXplID0gdW5pdCguNywgImNtIiksIA0KICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIsIGNvbG91ciA9ICJ3aGl0ZSIpKSArIA0KICBsYWJzKHRpdGxlID0gIlBhcnRuZXJzIGJ5IHRvd25zaGlwLCBKdWx5IDIwMjIiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJUb3duc2hpcHMgaW4gZ3JleSBkbyBub3QgaGF2ZSBhbnkgcGFydG5lcnMgcHJlc2VudCIsIA0KICAgICAgIGZpbGwgPSAiUGFydG5lcnMiKSAgDQoNCiMgZ2dzYXZlKCIuL3Bsb3RzL21hcHNfanVsXzIwMjJfYmVuZWZpY2lhcmVpc19wYXJ0bmVycy5wbmciLCBkcGkgPSAzMDAsIGhlaWdodCA9IDksIHdpZHRoID0gOCwgdW5pdHMgPSAiaW4iKQ0KICANCmBgYA0KDQo8YnI+DQoNCmBgYHtyIGV2YWwgPSBGQUxTRX0NCmZzYyAlPiUgDQogIGdyb3VwX2J5KHN0YXRlLCB0b3duc2hpcCwganVseSkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShuZXdfYmVuZWZpY2lhcmllcyksIC5ncm91cHMgPSAiZHJvcCIpICU+JSANCiAgcGl2b3Rfd2lkZXIodmFsdWVzX2Zyb20gPSBiZW5lZmljaWFyaWVzLCBuYW1lc19mcm9tID0ganVseSwgDQogICAgICAgICAgICAgIHZhbHVlc19maWxsID0gMCkgJT4lIA0KICBmaWx0ZXIoamFuX3RvX2p1biA9PSAwICYganVseSA+IDApICU+JSANCiAgY291bnQoc3RhdGUpICU+JSANCiAgc3VtbWFyaXNlKG4gPSBzdW0obikpDQpgYGANCg0KNSBuZXdseS1yZWFjaGVkIHRvd25zaGlwcyB3ZXJlIGFkZGVkIGluIEp1bHkgMjAyMi4gVGhleSBhbGwgaW4gU2hhbiBTb3V0aCBhcmUgYXJlIExhaWtoYSwgTG9pbGVuLCBNb25nbmFpLCBNb25ncGFuIGFuZCBOYW5zYW5nLiBBbGwgdmVyeSB0cmFkaXRpb25hbGx5IHJlbW90ZSBhbmQgdW5kZXJzZXJ2ZWQgYXJlYXMuIA0KDQpPZiB0aGUgYHIgZnNjICU+JSBjb3VudChzdGF0ZSwgdG93bnNoaXAsIGxvY2F0aW9uKSAlPiUgbnJvdygpICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCBzaXRlcyByZWFjaGVkLCA0MjEgaGFkIG1vcmUgdGhhbiBvbmUgcGFydG5lciBwcmVzZW50LiAgDQoNCjxicj4NCg0KYGBge3J9DQpmc2MgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGxvY2F0aW9uKSkgJT4lIA0KICBncm91cF9ieShsb2NhdGlvbiwgdG93bnNoaXApICU+JSAgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpLCANCiAgICAgICAgICAgIHBhcnRuZXJzID0gbl9kaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lciksIC5ncm91cHMgPSAiZHJvcCIpICU+JQ0KICBtdXRhdGUocGFydG5lcnMgPSByZWNvZGUocGFydG5lcnMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEiID0gIjFfcGFydG5lciIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIiID0gIjJfcGFydG5lcnMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICIzIiA9ICIzX3BhcnRuZXJzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiNCIgPSAiNF9wYXJ0bmVycyIpKSAlPiUgDQogIGdyb3VwX2J5KHBhcnRuZXJzKSAlPiUgDQogIHN1bW1hcmlzZV9hdCgibG9jYXRpb24iLCBuX2Rpc3RpbmN0KSAlPiUgIA0KICBmbGV4dGFibGUoKSAlPiUgDQogIHNldF9jYXB0aW9uKCJOdW1iZXIgb2YgcGFydG5lcnMgYnkgbG9jYXRpb24sIGFzIG9mIDMxIEp1bHkgMjAyMiIpICU+JSANCiAgdGhlbWVfemVicmEoKSAlPiUgDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0IikgDQpgYGANCg0KDQo8YnI+DQoNClRoZSBmb29kIHNlY3VyaXR5IGNsdXN0ZXIncyBwYXJ0bmVycyBjYW4gbW9zdGx5IGJlIGZvdW5kIGluIFlhbmdvbiwgUmFraGluZSBhbmQgS2FjaGluLg0KDQo8YnI+DQoNCmBgYHtyIGxvY2F0aW9ucy1wYXJ0bmVycy1zdGF0ZX0NCmZzYyAlPiUgDQogIGdyb3VwX2J5KHN0YXRlLCB0b3duc2hpcCwgbG9jYXRpb25fdHlwZSkgJT4lIA0KICBzdW1tYXJpc2UocGFydG5lcnMgPSBuX2Rpc3RpbmN0KGltcGxlbWVudGluZ19wYXJ0bmVyKSkgJT4lDQogIGZpbHRlcihsb2NhdGlvbl90eXBlICE9ICJJbmR1c3RyaWFsIHpvbmUiKSAlPiUgDQogIG11dGF0ZShtZWFuX3BhcnRuZXJzID0gbWVhbihwYXJ0bmVycywgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBwYXJ0bmVycywgeSA9IGZjdF9yZXYoc3RhdGUpLCBmaWxsID0gbG9jYXRpb25fdHlwZSkpICsNCiAgZ2VvbV9jb2woKSArDQogIGZhY2V0X3dyYXAofiBsb2NhdGlvbl90eXBlKSArIA0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjRjFDNDBGIiwgIiMxQUJDOUMiLCAiI0VDNzA2MyIpKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgDQogICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwLCBmYWNlID0gImJvbGQiKSwNCiAgICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiIzIxMjEyMSIpKSArIA0KICBsYWJzKHggPSAiTnVtYmVyIG9mIGltcGxlbWVudGluZyBwYXJ0bmVycyIsIHkgPSAiIiwgDQogICAgICAgdGl0bGUgPSAiTnVtYmVyIG9mIGltcGxlbWVudGluZyBwYXJ0bmVycyBieSBzdGF0ZSBhbmQgbG9jYXRpb24gdHlwZSIpDQogIA0KYGBgDQoNCjxicj48YnI+PGJyPg0KDQojIyAyLiBBY3Rpdml0aWVzDQoNCiMjIyAyLjEgUHJvZ3Jlc3MgYnkgYWN0aXZpdHkNCg0KVGhlIGRvdHRlZCByZWQgbGluZSBzaG93cyB0aGUgZW5kIG9mIFEyIDIwMjIuIFRoZSB0aGljayBsaW5lIGluIGdyZXkgc2hvd3MgdGhlIHByb2dyZXNzIGluIDIwMjEgZm9yIHRoZSBzYW1lIGFjdGl2aXR5LiBJdCBzaG91bGQgYmUgbm90ZWQgdGhhdCB0aGUgMjAyMSBwcm9ncmVzcyBsaW5lcyBhcmUganVzdCBhIHJlZmVyZW5jZSBhbmQgbm90IG1lYW50IHRvIGJlIGEgZGlyZWN0IGNvbXBhcmlzb24uIFRoZSBzY29wZSBvZiB0aGUgSFJQIHdhcyBtdWNoIGRpZmZlcmVudCBhdCB0aGUgc3RhcnQgb2YgMjAyMSBhbmQgdGhlIHJlc3BvbnNlIG9ubHkgYmVjYW1lIG5hdGlvbndpZGUgaW4gSnVuZTsgdGhlIEZTQyB3YXMgYWxzbyBtdWNoIHNtYWxsZXIgdGhhbiBpdCBpcyBub3cgaW4gMjAyMi4gSW5kZWVkLCB3aXRoIHRoZSBwb3N0LWNvdXAgY3Jpc2lzIGFmZmVjdGluZyBib3RoIGh1bWFuaXRhcmlhbiBhbmQgZGV2ZWxvcG1lbnQgcHJvZ3JhbW1pbmcsIHRoZSBuZWVkIGZvciBzdHJvbmdlciBjb29yZGluYXRpb24gdG8gYWRhcHQgZm9vZCBmb29kIHNlY3VyaXR5IHByb2dyYW1taW5nIGhhcyBwdXNoZWQgbWFueSBwYXJ0bmVycyB0byBlbnRlciB0aGUgRlNDLiBUaGlzIHR5cGUgb2YgY29tcGFyaXNvbiB3aWxsIGJlIG1vcmUgdXNlZnVsIG5leHQgeWVhci4gDQoNCjxicj4NCg0KYGBge3IgcHJvZ3Jlc3MtZmFjZXQtbGluZXBsb3R9DQoNCmFjdF9saW5lXzIwMjEgPC0gZnNjXzIwMjEgJT4lIA0KICBmaWx0ZXIodW5pcXVlX2JlbmVmaWNpYXJpZXMgPT0gIlllcyIpICU+JQ0KICBtdXRhdGUoZGF0ZSA9IGRhdGUgKyB5ZWFycygxKSkgJT4lIA0KICBncm91cF9ieShhY3Rpdml0eV9yZWQpICU+JSANCiAgYXJyYW5nZShkYXRlKSAlPiUgDQogIG11dGF0ZShjdW1fYmVuID0gY3Vtc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIG11dGF0ZShhY3Rpdml0eV9yZWQgPSBzdHJfcmVwbGFjZV9hbGwoYWN0aXZpdHlfcmVkLCAicHJvdmlzaW9uIG9mICIsICIiKSkgJT4lIA0KICBmaWx0ZXIoYWN0aXZpdHlfcmVkICVvdXQlIGMoImZpc2hlcnkga2l0cyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbW11bml0eSBpbmZyYXN0cnVjdHVyZSBhbmQgZXF1aXBtZW50IikpDQoNCmZzYyAlPiUgDQogIGdyb3VwX2J5KGRhdGUsIGFjdGl2aXR5X3JlZCkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSkgJT4lIA0KICAjIHJiaW5kKGZzY18yMDIxICU+JSANCiAgIyAgICAgICAgICMgZmlsdGVyKHVuaXF1ZV9iZW5lZmljaWFyaWVzID09ICJZZXMiKSAlPiUNCiAgIyAgICAgICAgIGdyb3VwX2J5KGRhdGUsIGFjdGl2aXR5X3JlZCkgJT4lIA0KICAjICAgICAgICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpKSAlPiUgDQogIGdyb3VwX2J5KGFjdGl2aXR5X3JlZCkgJT4lIA0KICBhcnJhbmdlKGRhdGUpICU+JSANCiAgbXV0YXRlKGN1bV9iZW4gPSBjdW1zdW0oYmVuZWZpY2lhcmllcykpICU+JSANCiAgYXJyYW5nZShhY3Rpdml0eV9yZWQpICU+JSANCiAgbXV0YXRlKGFjdGl2aXR5X3JlZCA9IHN0cl9yZXBsYWNlX2FsbChhY3Rpdml0eV9yZWQsICJwcm92aXNpb24gb2YgIiwgIiIpKSAlPiUNCiAgZmlsdGVyKGFjdGl2aXR5X3JlZCAlb3V0JSBjKCJmaXNoZXJ5IGtpdHMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb21tdW5pdHkgaW5mcmFzdHJ1Y3R1cmUgYW5kIGVxdWlwbWVudCIpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGRhdGUsIHkgPSBjdW1fYmVuLCBjb2xvdXIgPSBhY3Rpdml0eV9yZWQpKSArDQogIGdlb21fc3RlcChkYXRhID0gYWN0X2xpbmVfMjAyMSwgDQogICAgICAgICAgICBhZXMoeCA9IGRhdGUsIA0KICAgICAgICAgICAgICAgIHkgPSBjdW1fYmVuKSwgDQogICAgICAgICAgICBjb2xvdXIgPSAiZ3JleSIsDQogICAgICAgICAgICBzaXplID0gMiwgDQogICAgICAgICAgICBhbHBoYSA9IC40KSArIA0KICBnZW9tX3ZsaW5lKGNvbG91ciA9ICJyZWQiLCBsdHkgPSAyLCB4aW50ZXJjZXB0ID0gYXMubnVtZXJpYyhhcy5EYXRlKCIyMDIyLTA2LTAxIikpLCBhbHBoYSA9IC41KSArDQogICMgZ2VvbV92bGluZShjb2xvdXIgPSAicmVkIiwgbHR5ID0gMiwgeGludGVyY2VwdCA9IGFzLm51bWVyaWMoYXMuRGF0ZSgiMjAyMi0wMy0wMSIpKSwgYWxwaGEgPSAuNSkgKw0KICBnZW9tX3N0ZXAoc2l6ZSA9IDEpICsgDQogIHNjYWxlX3hfZGF0ZShkYXRlX2JyZWFrcyA9ICIxIG1vbnRoIiwgZGF0ZV9sYWJlbHMgPSAiJWIiKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBjb21tYSkgKw0KICBmYWNldF93cmFwKH4gYWN0aXZpdHlfcmVkLCBzY2FsZXMgPSAiZnJlZV95IikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA1LCBhbmdsZSA9IDYwLCBoanVzdCA9IDEsIHZqdXN0ID0gMSksIA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gNSksIA0KICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2LCBmYWNlID0gImJvbGQiKSwNCiAgICAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiMyMTIxMjEiKSkgKyANCiAgbGFicyh4ID0gIk1vbnRoIiwgDQogICAgICAgeSA9ICJDdW11bGF0aXZlIGJlbmVmaWNpYXJ5IGZyZXF1ZW5jaWVzIiwgDQogICAgICAgdGl0bGUgPSAiTW9udGhseSBwcm9ncmVzcyBieSBhY3Rpdml0eSwgYXMgb2YgSnVseSAyMDIyIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJGaWd1cmVzIGFyZSBpbiBjdW11bGF0aXZlIGJlbmVmaWNpYXJ5IGZyZXF1ZW5jaWVzIHJlYWNoZWQ7IHByZXZpb3VzIHllYXIncyBwcm9ncmVzcyBpcyBpbiBncmV5OyByZWQgbGluZSBtYXJrcyBKdW4gMjAyMiIpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpKSANCiAgDQojIGdnc2F2ZSgiYWN0aXZpdHlfZmFjZXRfbGluZS5wbmciLCBkcGkgPSAzMDAsIGhlaWdodCA9IDUsIHdpZHRoID0gOCwgdW5pdHMgPSAiaW4iKSAgDQoNCmBgYA0KDQo8YnI+DQoNCkluIEp1bHkgMjAyMiwgcHJvZ3Jlc3MgcHJpbWFyaWx5IGNhbWUgZnJvbSBtdWx0aS1wdXJwb3NlIGNhc2ggdHJhbnNmZXJzLCBmYXJtZXIgdHJhaW5pbmcsIGZvb2QgZGlzdHJpYnV0aW9ucyBhbmQgdm9jYXRpb25hbCB0cmFpbmluZy4gDQoNCjxicj48YnI+DQoNCiMjIyAyLjIgQWdyaWN1bHR1cmFsIGFuZCBsaXZlbGlob29kcyBhY3Rpdml0aWVzDQoNCmBgYHtyfQ0KYWdfbGlzdCA8LSBjKCJjcm9wLCB2ZWdldGFibGUgYW5kIHNlZWQga2l0cyIsDQogICAgICAgICAgICAgIkZGUyBhbmQgZmFybWVyIHRyYWluaW5nIiwNCiAgICAgICAgICAgICAiSUdBIGFuZCBzbWFsbCBncmFudHMiLA0KICAgICAgICAgICAgICJsaXZlc3RvY2sga2l0cyIpDQoNCg0KYGBgDQoNCmByIGZpbHRlcihmc2MsIGFjdGl2aXR5X3JlZCAlaW4lIGMoYWdfbGlzdCkpICU+JSB7c3VtKC4kbmV3X2JlbmVmaWNpYXJpZXMpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgcGVyc29ucyB3ZXJlIHJlYWNoZWQgdGhyb3VnaCBhIGNvbWJpbmF0aW9uIG9mIGNyb3AsIHZlZ2V0YWJsZSBhbmQgc2VlZCBraXRzLCBGRlMgYW5kIGZhcm1lciB0cmFpbmluZywgSUdBIGFuZCBzbWFsbCBncmFudHMgYW5kIGxpdmVzdG9jayBraXRzLiANCg0KPGJyPg0KDQpgYGB7ciB0YWJsZS1hZ3JpLWFjdGl2aXRpZXN9DQpmc2MgJT4lIA0KICBmaWx0ZXIoYWN0aXZpdHlfcmVkICVpbiUgYygiY3JvcCwgdmVnZXRhYmxlIGFuZCBzZWVkIGtpdHMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRkZTIGFuZCBmYXJtZXIgdHJhaW5pbmciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSUdBIGFuZCBzbWFsbCBncmFudHMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGl2ZXN0b2NrIGtpdHMiKSkgJT4lIA0KICBncm91cF9ieShhY3Rpdml0eV9yZWQsIGp1bHkpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpKSAlPiUNCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGp1bHksIA0KICAgICAgICAgICAgICB2YWx1ZXNfZnJvbSA9IGJlbmVmaWNpYXJpZXMsDQogICAgICAgICAgICAgIHZhbHVlc19maWxsID0gMCkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBtdXRhdGUodG90YWwgPSBqYW5fdG9fanVuICsganVseSkgJT4lIA0KICBtdXRhdGUoYCVfdG90YWxgID0gcm91bmQodG90YWwgLyBzdW0odG90YWwpICogMTAwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlnaXRzID0gMikpICU+JSAgDQogIGFycmFuZ2UoZGVzYyh0b3RhbCkpICU+JSANCiAgYWRvcm5fdG90YWxzKCJyb3ciKSAlPiUgDQogIHJlbmFtZShhY3Rpdml0eSA9IGFjdGl2aXR5X3JlZCkgJT4lIA0KICBmbGV4dGFibGUoKSAlPiUgDQogIHNldF9jYXB0aW9uKCJCZW5lZmljaWFyaWVzIHJlYWNoZWQgYnkgYWdyaWN1bHR1cmFsIGFuZCBsaXZlbGlob29kIGFjdGl2aXRpZXMiKSAlPiUgDQogIHRoZW1lX3plYnJhKCkgJT4lIA0KICBmb290bm90ZShwYXJ0ID0gImhlYWRlciIsIA0KICAgICAgICAgICBpID0gMSwgaiA9IDQsDQogICAgICAgICAgICAgdmFsdWUgPSBhc19wYXJhZ3JhcGgoKCJhcyBvZiAzMSBKdWx5IDIwMjIiKSkpICU+JSANCiAgc2V0X3RhYmxlX3Byb3BlcnRpZXMod2lkdGggPSAuOCwgbGF5b3V0ID0gImF1dG9maXQiKQ0KICANCmBgYA0KDQoNCjxicj48YnI+DQoNCiMjIyAyLjMgRGVsaXZlcnkgbW9kYWxpdGllcw0KDQpPbmx5IEhFQiBhbmQgZm9ydGlmaWVkIHJpY2UsIGNvbW11bml0eSBpbmZyYXN0cnVjdHVyZSBhbmQgZXF1aXBtZW50IGFuZCBraXRjaGVuIGdhcmRlbiBraXRzIHdlcmUgZGVsaXZlcmVkIGVudGlyZWx5IHRocm91Z2ggaW4ta2luZCBtb2RhbGl0aWVzLg0KDQo8YnI+DQoNCmBgYHtyfQ0KZnNjICU+JSANCiAgZmlsdGVyKCFpcy5uYShkZWxpdmVyeV9tb2RhbGl0eSkpICU+JSANCiAgbXV0YXRlKGRlbGl2ZXJ5X21vZGFsaXR5ID0gY2FzZV93aGVuKHN0cl9kZXRlY3QoZGVsaXZlcnlfbW9kYWxpdHksICJIeWJyaWQiKSB+ICJIeWJyaWQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoZGVsaXZlcnlfbW9kYWxpdHksICJTZXJ2aWNlIikgfiAiU2VydmljZSBkZWxpdmVyeSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IGRlbGl2ZXJ5X21vZGFsaXR5KSkgJT4lIA0KICBncm91cF9ieShhY3Rpdml0eV9yZWQsIGRlbGl2ZXJ5X21vZGFsaXR5KSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKG5ld19iZW5lZmljaWFyaWVzKSwgDQogICAgICAgICAgICAuZ3JvdXBzID0gImRyb3AiKSAlPiUgDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBkZWxpdmVyeV9tb2RhbGl0eSwgdmFsdWVzX2Zyb20gPSBiZW5lZmljaWFyaWVzKSAlPiUgDQogIGFkb3JuX3BlcmNlbnRhZ2VzKCJyb3ciKSAlPiUgDQogIGFkb3JuX3BjdF9mb3JtYXR0aW5nKCkgJT4lIA0KICBsZWZ0X2pvaW4oZnNjICU+JQ0KICAgICAgICAgIGZpbHRlcighaXMubmEoZGVsaXZlcnlfbW9kYWxpdHkpKSAlPiUNCiAgICAgICAgICBtdXRhdGUoZGVsaXZlcnlfbW9kYWxpdHkgPSBjYXNlX3doZW4oc3RyX2RldGVjdChkZWxpdmVyeV9tb2RhbGl0eSwgIkh5YnJpZCIpIH4gIkh5YnJpZCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChkZWxpdmVyeV9tb2RhbGl0eSwgIlNlcnZpY2UiKSB+ICJTZXJ2aWNlIGRlbGl2ZXJ5IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gZGVsaXZlcnlfbW9kYWxpdHkpKSAlPiUNCiAgICAgICAgICBncm91cF9ieShhY3Rpdml0eV9yZWQpICU+JQ0KICAgICAgICAgIHN1bW1hcmlzZShCZW5lZmljaWFyaWVzID0gc3VtKG5ld19iZW5lZmljaWFyaWVzKSwgDQogICAgICAgICAgICAgICAgICAgIC5ncm91cHMgPSAiZHJvcCIpLCANCiAgICAgICAgICBieSA9ICJhY3Rpdml0eV9yZWQiKSAlPiUNCiAgYXJyYW5nZShkZXNjKEJlbmVmaWNpYXJpZXMpKSAlPiUNCiAgbXV0YXRlKGFjdGl2aXR5X3JlZCA9IGlmZWxzZShhY3Rpdml0eV9yZWQgJWluJSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoIkZGUyBhbmQgZmFybWVyIHRyYWluaW5nIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklHQSBhbmQgc21hbGwgZ3JhbnRzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIRUIgYW5kIGZvcnRpZmllZCByaWNlIGZvciBhY3V0ZSBlbWVyZ2VuY2llcyIpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eV9yZWQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX3RvX3NlbnRlbmNlKGFjdGl2aXR5X3JlZCkpKSAlPiUgDQogIHJlbmFtZShBY3Rpdml0eSA9IGFjdGl2aXR5X3JlZCkgJT4lIA0KICBtdXRhdGVfYXQodmFycyhgSW4ta2luZGAsIGBTZXJ2aWNlIGRlbGl2ZXJ5YCwgYENCVC9DVkFgLCBgSHlicmlkYCksIA0KICAgICAgICAgICAgfnJlY29kZSguLCAiLSIgPSBOQV9jaGFyYWN0ZXJfKSkgJT4lDQogIGZpbHRlcihCZW5lZmljaWFyaWVzICE9IDApICU+JSANCiAgZmxleHRhYmxlKCkgJT4lIA0KICBzZXRfY2FwdGlvbigiUGVyY2VudGFnZSBvZiBiZW5maWNpYXJpZXMgcmVhY2hlZCBieSBhY3Rpdml0eSBhbmQgZGVsaXZlcnkgbW9kYWxpdHkiKSAlPiUgDQogIHRoZW1lX3plYnJhKCkgJT4lIA0KICBmb290bm90ZShwYXJ0ID0gImhlYWRlciIsIA0KICAgICAgICAgICBpID0gMSwgaiA9IDYsIA0KICAgICAgICAgICB2YWx1ZSA9IGFzX3BhcmFncmFwaCgiYXMgb2YgMzEgSnVseSAyMDIyIikpICU+JSANCiAgc2V0X3RhYmxlX3Byb3BlcnRpZXMobGF5b3V0ID0gImF1dG9maXQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSAuOTUpDQoNCmBgYA0KDQo8YnI+DQoNClRoZXJlIGFyZSBhbHNvIGNsZWFyIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIGRpZmZlcmVudCBiZW5lZmljaWFyeSB0eXBlcyBhbmQgdGhlIGRlbGl2ZXJ5IG1vZGFsaXRpZXMgZW1wbG95ZWQgd2l0aCB0aGVtLiBCZW5lZmljaWFyaWVzIGZyb20gaG9zdC9sb2NhbCBjb21tdW5pdGllcyBsYXJnZWx5IHJlY2VpdmVkIGluLWtpbmQgZGlzdHJpYnV0aW9ucyB3aGlsc3QgdGhvc2UgZnJvbSBjYW1wcyBhbmQgSURQIHNpdGVzIG1vc3RseSByZWNlaXZlZCBjYXNoLWJhc2VkIGludGVydmVudGlvbnMsIGluZGljYXRpbmcgdGhhdCBwYXJ0bmVycyBtb3N0bHkgd29ya2VkIGluIHRoZSBzYW1lIGFyZWFzIGluIFExIGFuZCBRMi4gDQoNCjxicj4NCg0KYGBge3IgZmFjZXQtYmVuLXR5cGUsIGZpZy5oZWlnaHQ9Nn0NCg0KZnNjICU+JSAgDQogICBtdXRhdGUoZGVsaXZlcnlfbW9kYWxpdHkgPSBjYXNlX3doZW4oc3RyX2RldGVjdChkZWxpdmVyeV9tb2RhbGl0eSwgIkh5YnJpZCIpIH4gIkh5YnJpZCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChkZWxpdmVyeV9tb2RhbGl0eSwgIlNlcnZpY2UiKSB+ICJTZXJ2aWNlIGRlbGl2ZXJ5IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gZGVsaXZlcnlfbW9kYWxpdHkpKSAlPiUgDQogIGZpbHRlcighaXMubmEoZGVsaXZlcnlfbW9kYWxpdHkpICYgIWlzLm5hKGxvY2F0aW9uX3R5cGUpKSAlPiUgDQogIHN1bV9iZW4yKGRlbGl2ZXJ5X21vZGFsaXR5LCBsb2NhdGlvbl90eXBlKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGRlbGl2ZXJ5X21vZGFsaXR5LCB5ID0gYmVuZWZpY2lhcmllcywgZmlsbCA9IGRlbGl2ZXJ5X21vZGFsaXR5KSkgKw0KICBnZW9tX2NvbCgpICsgDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBjb21tYSkgKyANCiAgZmFjZXRfd3JhcCh+bG9jYXRpb25fdHlwZSwgc2NhbGVzID0gImZyZWUiKSArIA0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDI1LCB2anVzdCA9IC43LCBoanVzdCA9IC41KSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4LCBmYWNlID0gImJvbGQiKSwNCiAgICAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiMyMTIxMjEiKSkgKw0KICBsYWJzKHggPSAiRGVsaXZlcnkgbW9kYWxpdHkiLCB5ID0gIkJlbmVmaWNpYXJpZXMiLA0KICAgICAgIHRpdGxlID0gIkRlbGl2ZXJ5IG1vZGFsaXRpZXMgYnkgbG9jYXRpb24gdHlwZSIpDQogIA0KDQpgYGANCg0KPGJyPg0KDQpBcmVhcyB3aXRoIHRoZSBoaWdoZXN0IG51bWJlciBvZiBJRFBzLCBzdWNoIGFzIFNhZ2FpbmcsIFJha2hpbmUgYW5kIEthY2hpbiwgcmVhY2ggbW9zdCBvZiB0aGVpciBiZW5lZmljaWFyaWVzIHRocm91Z2ggY2FzaC1iYXNlZCBwcm9ncmFtbWluZy4NCg0KPGJyPg0KDQpgYGB7ciBkZWxpdmVyeS1tb2RhbGl0aWVzLXN0YWNrZWQtYmFyfQ0Kc3RhdGVfdG90YWxzIDwtIGZzYyAlPiUgDQogIGZpbHRlcighaXMubmEoZGVsaXZlcnlfbW9kYWxpdHkpKSAlPiUgDQogIGdyb3VwX2J5KHN0YXRlKSAlPiUgDQogIHN1bW1hcmlzZSh0b3RhbCA9IHN1bShuZXdfYmVuZWZpY2lhcmllcykpICU+JSANCiAgbXV0YXRlKHBjID0gMSwgDQogICAgICAgICBzdGF0ZSA9IGZjdF9yZW9yZGVyKHN0YXRlLCB0b3RhbCkpDQoNCmZzYyAlPiUgIA0KICBmaWx0ZXIoIWlzLm5hKGRlbGl2ZXJ5X21vZGFsaXR5KSkgJT4lICANCiAgIG11dGF0ZShkZWxpdmVyeV9tb2RhbGl0eSA9IGNhc2Vfd2hlbihzdHJfZGV0ZWN0KGRlbGl2ZXJ5X21vZGFsaXR5LCAiSHlicmlkIikgfiAiSHlicmlkIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGRlbGl2ZXJ5X21vZGFsaXR5LCAiU2VydmljZSIpIH4gIlNlcnZpY2UgZGVsaXZlcnkiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBkZWxpdmVyeV9tb2RhbGl0eSkpICU+JQ0KICBncm91cF9ieShzdGF0ZSwgZGVsaXZlcnlfbW9kYWxpdHkpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpICU+JSANCiAgZ3JvdXBfYnkoc3RhdGUpICU+JSANCiAgbXV0YXRlKHBjID0gYmVuZWZpY2lhcmllcyAvIHN1bShiZW5lZmljaWFyaWVzKSwNCiAgICAgICAgIHN0YXRlID0gZmN0X3Jlb3JkZXIoc3RhdGUsIGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IHBjLCB5ID0gZmN0X3JldihzdGF0ZSksIGZpbGwgPSBkZWxpdmVyeV9tb2RhbGl0eSkpICsgDQogIGdlb21fY29sKCkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gcGVyY2VudCwgYnJlYWtzID0gc2VxKDAsIDEsIGJ5ID0gLjIpKSArIA0KICBnZW9tX3RleHQoYWVzKHkgPSBzdGF0ZSwgeCA9IHBjICsgMC4xMjUsIGxhYmVsID0gY29tbWEodG90YWwsIGFjY3VyYWN5ID0gMSksIGZpbGwgPSBOVUxMKSwgDQogICAgICAgICAgICBkYXRhID0gc3RhdGVfdG90YWxzLCBoanVzdCA9ICJpbndhcmQiLCBzaXplID0gMi41KSArDQogIGxhYnMoeCA9ICIlIG9mIHRvdGFsIiwgeSA9ICIiLCBmaWxsID0gIiIsIA0KICAgICAgIHRpdGxlID0gIlBlcmNlbnRhZ2Ugb2YgYmVuZWZpY2lhcmllcyByZWFjaGVkIGJ5IGRlbGl2ZXJ5IG1vZGFsaXRpZXMiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJCZW5lZmljaWFyaWVzIGFzIG9mIDMxIEp1bHkgMjAyMiBhdCB0aGUgZW5kIG9mIGVhY2ggYmFyIikNCg0KYGBgDQoNCjxicj48YnI+PGJyPg0KDQojIyAzLiBDYXNoLWJhc2VkIHByb2dyYW1taW5nDQoNCiMjIyAzLjEgTU1LIHBlciBob3VzZWhvbGQNCg0KQ29tcGFyZWQgdG8gUTEsIGJlbmVmaWNpYXJpZXMgaW4gUTIgYXJlIG11Y2ggbGVzcyBsaWtlbHkgdG8gaGF2ZSByZWNlaXZlZCBjYXNoIHRyYW5zZmVycyBvZiBsZXNzIHRoYW4gVVNEIDEwIHBlciBob3VzZWhvbGQuIFRoZSBtb3N0IGNvbW1vbiB0cmFuc2ZlciB2YWx1ZXMgd2VyZSBiZXR3ZWVuIFVTRCA2MCBhbmQgNzAsIGFuIGluY3JlYXNlIGZyb20gdGhlIHByZXZpb3VzIHF1YXJ0ZXIuDQoNCkluIEp1bHkgMjAyMiwgdGhlIG1vc3QgY29tbW9uIHRyYW5zZmVycyB2YWx1ZXMgd2VyZSBiZXR3ZWVuIE1NSyAxMDAsMDAwIGFuZCBNTUsgMjAwLDAwMCwgDQoNCg0KPGJyPg0KDQpgYGB7ciB1c2QtaGhkLWJpbi1iYXJwbG90LCBmaWcuaGVpZ2h0PTYuNX0NCg0KZnNjICU+JQ0KICBmaWx0ZXIoIWlzLm5hKG1ta19wZXJfaGhkKSAmICFpcy5uYShuZXdfYmVuZWZpY2lhcmllcykpICU+JSANCiAgZmlsdGVyKGRlbGl2ZXJ5X21vZGFsaXR5ICVpbiUgYygiQ0JUL0NWQSIsICJIeWJyaWQgKEluLWtpbmQgJiBDQlQvQ1ZBKSIpKSAlPiUNCiAgZ3JvdXBfYnkobW1rX2hoZF9iaW4sIGp1bHkpICU+JSANCiAgc3VtbWFyaXNlKGhvdXNlaG9sZHMgPSBzdW0oaG91c2Vob2xkcykpICU+JSANCiAgZ3JvdXBfYnkoanVseSkgJT4lIA0KICBtdXRhdGUoYCVfb2ZfaGhkYCA9IHJvdW5kKGhvdXNlaG9sZHMgLyBzdW0oaG91c2Vob2xkcykgKiAxMDAsIGRpZ2l0cyA9IDIpKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIGZpbHRlcihqdWx5ID09ICJqdWx5IikgJT4lIA0KICBtdXRhdGUobW1rX2hoZF9iaW4gPSBmY3RfcmVsZXZlbChtbWtfaGhkX2JpbiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCI8MTBLIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTBLXzwzMEsiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIzMEtfPDEwMEsiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIxMDBLXzwyMDBLIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMDBLXzwzMDBLIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMzAwS188MU0iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI+PTFNIikpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IG1ta19oaGRfYmluLCB5ID0gaG91c2Vob2xkcywgZmlsbCA9IG1ta19oaGRfYmluKSkgKyANCiAgZ2VvbV9jb2woKSArIA0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gYCVfb2ZfaGhkYCksIHZqdXN0ID0gLTAuNCwgc2l6ZSA9IDMpICsgDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19kKG9wdGlvbiA9ICJtYWtvIiwgZGlyZWN0aW9uID0gLTEpICsgDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBjb21tYSwgYnJlYWtzID0gc2VxKDAsIDgwMDAwLCBieSA9IDEwMDAwKSkgKyANCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLCANCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2MCwgaGp1c3QgPSAwLjgsIHZqdXN0ID0gMC45KSwgDQogICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgsIGZhY2UgPSAiYm9sZCIpLA0KICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiIzIxMjEyMSIpKSArDQogIGxhYnMoeCA9ICJNTUsgdmFsdWUgb2YgY2FzaCB0cmFuc2ZlciBwZXIgaG91c2Vob2xkIiwNCiAgICAgICB5ID0gIk51bWJlciBvZiBob3VzZWhvbGRzIiwNCiAgICAgICB0aXRsZSA9ICJOdW1iZXIgb2YgaG91c2Vob2xkcyBieSB2YWx1ZSBvZiBjYXNoIHRyYW5zZmVyIHBlciBob3VzZWhvbGQgKEp1bHkgMjAyMikiLA0KICAgICAgIHN1YnRpdGxlID0gIkZpZ3VyZXMgYXQgdGhlIHRvcCBvZiBlYWNoIGJhciBzaG93IHBlcmNlbnRhZ2Ugb2YgaG91c2Vob2xkc1xuT25seSBob3VzZWhvbGRzIHJlYWNoZWQgdGhyb3VnaCB0aGUgY2FzaCwgaHlicmlkIG9yIHZvdWNoZXIgbW9kYWxpdGllcyBhcmUgaW5jbHVkZWQiKQ0KDQpgYGANCg0KPGJyPg0KDQpBYm91dCA0MCUgb2YgYmVuZWZpY2lhcmllcyBvZiBtdWx0aS1wdXJwb3NlIGNhc2ggdHJhbnNmZXJzIGluIEp1bHkgMjAyMiB3ZXJlIG9mIHF1aXRlIGhpZ2ggdmFsdWUuIA0KDQo8YnI+DQoNCmBgYHtyfQ0KDQphY3Rpdml0eV90b3RhbHMgPC0gZnNjICU+JQ0KICBmaWx0ZXIoanVseSA9PSAianVseSIpICU+JSANCiAgZ3JvdXBfYnkoYWN0aXZpdHlfcmVkKSAlPiUgDQogIHN1bW1hcmlzZSh0b3RhbCA9IHN1bShuZXdfYmVuZWZpY2lhcmllcykpICU+JQ0KICBmaWx0ZXIoYWN0aXZpdHlfcmVkICE9ICJtaWNyb2ZpbmFuY2UgYWN0aXZpdGllcyIpICU+JSANCiAgbXV0YXRlKHBjID0gMSwgDQogICAgICAgICBhY3Rpdml0eV9yZWQgPSBmY3RfcmVvcmRlcihhY3Rpdml0eV9yZWQsIHRvdGFsKSkNCiAgDQpmc2MgJT4lICANCiAgZmlsdGVyKGp1bHkgPT0gImp1bHkiKSAlPiUgDQogIGdyb3VwX2J5KGFjdGl2aXR5X3JlZCwgbW1rX2hoZF9iaW4pICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpKSAlPiUgDQogIG11dGF0ZShwYyA9IGJlbmVmaWNpYXJpZXMgLyBzdW0oYmVuZWZpY2lhcmllcykpICU+JSANCiAgZmlsdGVyKGFjdGl2aXR5X3JlZCAhPSAibWljcm9maW5hbmNlIGFjdGl2aXRpZXMiKSAlPiUgDQogIG11dGF0ZShtbWtfaGhkX2JpbiA9IGZjdF9yZWxldmVsKG1ta19oaGRfYmluLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiPDEwSyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEwS188MzBLIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMzBLXzwxMDBLIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTAwS188MjAwSyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjAwS188MzAwSyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjMwMEtfPDFNIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPj0xTSIpKSkgJT4lIA0KICBhcnJhbmdlKG1ta19oaGRfYmluKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IHBjLCB5ID0gYWN0aXZpdHlfcmVkLA0KICAgICAgICAgICAgIGZpbGwgPSBmY3RfcmVsZXZlbChtbWtfaGhkX2JpbiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoIjwxMEsiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIxMEtfPDMwSyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjMwS188MTAwSyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEwMEtfPDIwMEsiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwMEtfPDMwMEsiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIzMDBLXzwxTSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIj49MU0iKSkpKSArIA0KICBnZW9tX2NvbCgpICsgDQogIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBwZXJjZW50LCBicmVha3MgPSBzZXEoMCwgMSwgYnkgPSAuMikpICsgDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19kKG9wdGlvbiA9ICJtYWtvIiwgZGlyZWN0aW9uID0gLTEsIA0KICAgICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmV5NTAiKSArIA0KICBnZW9tX3RleHQoYWVzKHkgPSBhY3Rpdml0eV9yZWQsIA0KICAgICAgICAgICAgICAgIHggPSBwYyArIC4xMjUsIA0KICAgICAgICAgICAgICAgIGxhYmVsID0gY29tbWEodG90YWwsIGFjY3VyYWN5ID0gMSksIGZpbGwgPSBOVUxMKSwgDQogICAgICAgICAgICBkYXRhID0gYWN0aXZpdHlfdG90YWxzLCBoanVzdCA9ICJpbndhcmQiLCBzaXplID0gMy41KSArIA0KICBsYWJzKHggPSAiJSBvZiBhY3Rpdml0eSB0b3RhbCIsIA0KICAgICAgIHkgPSAiIiwgDQogICAgICAgZmlsbCA9ICIiLCANCiAgICAgICB0aXRsZSA9ICJQZXJjZW50YWdlIG9mIGNhc2ggYmVuZWZpY2lhcmllcyBieSBhY3Rpdml0eSwgSnVseSAyMDIyIiwgDQogICAgICAgc3VidGl0bGUgPSAiQmVuZWZpY2lhcmllcyByZWFjaGVkIGluIEp1bHkgMjAyMiBhdCB0aGUgZW5kIG9mIGVhY2ggYmFyXG5HcmV5L05BIHNob3dzIGJlbmVmaWNpYXJpZXMgb2Ygbm9uLWNhc2ggaW50ZXJ2ZW50aW9ucyIpDQoNCiAgDQpgYGANCg0KPGJyPjxicj4NCg0KIyMjIDMuMiBNTUsgcGVyIHBlcnNvbg0KDQpUaGUgYm94cGxvdHMgYmVsb3cgc2hvd3MgdGhlIHJhbmdlIG9mIGNhc2ggdHJhbnNmZXIgdmFsdWVzIChhbGwgdmFsdWVzIGFyZSBwZXIgcGVyc29uLCB0byBmYWNpbGl0YXRlIGNvbXBhcmFiaWxpdHkpIGJ5IGFjdGl2aXR5LiBUaGUgYXZlcmFnZSBmb3IgcmVhY2ggYWN0aXZpdHkgaXMgbWFya2VkIGJ5IHRoZSB0aGljayBsaW5lIGluIHRoZSBtaWRkbGUgb2YgZWFjaCBib3guIFRoZSBsZWZ0bW9zdCBhbmQgcmlnaHRtb3N0IHNpZGUgb2YgZWFjaCBib3ggaW5kaWNhdGUgdGhlIDI1dGggYW5kIDc1dGggcGVyY2VudGlsZSBvZiB0cmFuc2ZlciB2YWx1ZXMsIHJlc3BlY3RpdmVseS4gVGhlIGxlbmd0aCBvZiBlYWNoIGJveCBpcyBhIGdhdWdlIGZvciBob3cgbXVjaCB2YXJpYXRpb24gdGhlcmUgaXMgaW4gdGhlIHRyYW5zZmVyIHZhbHVlcyBvZiBlYWNoIGFjdGl2aXR5Lg0KDQpUaGVzZSBwbG90cyB1c2UgZGF0YSBmb3IgdGhlIGVudGlyZSB5ZWFyLCBpbnN0ZWFkIG9mIGp1c3QgSnVseS4gDQoNCjxicj4NCg0KYGBge3IgYm94cGxvdC1hY3Rpdml0eS11c2QtcGVyLXBlcnNvbn0NCg0KZnNjICU+JSBmaWx0ZXIoIWlzLm5hKHRvdGFsX3ZhbHVlX21taykgJiANCiAgICAgICAgICAgICAgICAgYWN0aXZpdHlfcmVkICVvdXQlIGMoIkZGUyBhbmQgZmFybWVyIHRyYWluaW5nIiwgInZvY2F0aW9uYWwgdHJhaW5pbmciKSkgJT4lDQogIG11dGF0ZShhY3Rpdml0eV9yZWQgPSBmY3RfcmV2KGZjdF9yZWxldmVsKGFjdGl2aXR5X3JlZCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCJmb29kIGRpc3RyaWJ1dGlvbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjcm9wLCB2ZWdlbnRhYmxlIGFuZCBzZWVkIGtpdHMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXVsdGktcHVycG9zZSBjYXNoIHRyYW5zZmVyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvb2RfY2FzaCBmb3Igd29ya19hc3NldHMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklHQSBhbmQgc21hbGwgZ3JhbnRzIikpKSkgJT4lIA0KICBhcnJhbmdlKGFjdGl2aXR5X3JlZCkgJT4lIA0KICBnZ3Bsb3QoYWVzKHkgPSBhY3Rpdml0eV9yZWQsIA0KICAgICAgICAgICAgIHggPSBtbWtfcGVyX3BlcnNvbiwgDQogICAgICAgICAgICAgY29sb3VyID0gYWN0aXZpdHlfcmVkKSkgKyANCiAgZ2VvbV9qaXR0ZXIoYWxwaGEgPSAuMSwgDQogICAgICAgICAgICAgIGFlcyhzaXplID0gYmVuZWZpY2lhcmllcykpICsNCiAgZ2VvbV9ib3hwbG90KGFscGhhID0gLjgsIA0KICAgICAgICAgICAgICAgb3V0bGllci5hbHBoYSA9IC4yKSArIA0KICBzY2FsZV94X2NvbnRpbnVvdXModHJhbnMgPSAibG9nMTAiLCANCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGMoMTAwMDAsIDMwMDAwLCAxMDAwMDAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMDAwMDAsIDEwMDAwMDApLCANCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGNvbW1hKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNjAsIGhqdXN0ID0gLjUsIHZqdXN0ID0gLjUpKSArDQogIGxhYnMoeCA9ICJNTUsgcGVyIHBlcnNvbiIsIHkgPSAiIiwgDQogICAgICAgdGl0bGUgPSAiQm94cGxvdHMgb2YgTU1LIHRyYW5zZmVyIHZhbHVlcyBwZXIgcGVyc29uLCBhcyBvZiBKdWx5IDIwMjIiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJUaGljayBsaW5lIGluIGVhY2ggYm94IGlzIHRoZSBhdmVyYWdlO1xuIFBvaW50cyBhcmUgaW5kaXZpZHVhbCBpbnRlcnZlbnRpb25zLCBzaXplcyBpbmRpY2F0ZSBudW1iZXIgb2YgYmVuZWZpY2lhcmllcyIpDQoNCiANCmBgYA0KDQo8YnI+DQoNCkVhY2ggb2YgdGhlIGJ1YmJsZXMgcmVwcmVzZW50cyBhbiBpbmRpdmlkdWFsIGludGVydmVudGlvbiwgd2l0aCB0aGVpciBwb3NpdGlvbiBhbG9uZyB0aGUgeC1heGlzIHNob3dpbmcgdGhlIFVTRCBwZXIgcGVyc29uIHZhbHVlIG9mIHRoZSBpbnRlcnZlbnRpb24gYW5kIHRoZSBzaXplIG9mIGVhY2ggYnViYmxlIGluZGljYXRpbmcgdGhlIG51bWJlciBvZiBiZW5lZmljaWFyaWVzIHJlYWNoZWQuDQoNCkZvb2QgZGlzdHJpYnV0aW9ucyB0ZW5kZWQgdG8gaGF2ZSB0aGUgdGlnaHRlc3QgcmFuZ2Ugb2YgdmFsdWVzLCB3aGljaCBwcm92ZXMgdGhhdCBmb29kIGFzc2lzdGFuY2UgaXMgcXVpdGUgc3RhbmRhcmRpc2VkIGFtb25nc3QgcGFydG5lcnMuIA0KDQo8YnI+DQoNCmBgYHtyIHBsb3RseS10cmFuc2Zlci12YWx1ZS1zY2F0dGVyLCBmaWcuaGVpZ2h0PTZ9DQoNCm1vbmV5X3NjYXR0ZXIgPC0gZnNjICU+JSANCiAgZmlsdGVyKCFpcy5uYSh0b3RhbF92YWx1ZV9tbWspICYgDQogICAgICAgICAgIGFjdGl2aXR5X3JlZCAlb3V0JSBjKCJsaXZlc3RvY2sga2l0cyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2b2NhdGlvbmFsIHRyYWluaW5nIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZGUyBhbmQgZmFybWVyIHRyYWluaW5nIikpICU+JQ0KICBncm91cF9ieShzdGF0ZSwgdG93bnNoaXAsIGxvY2F0aW9uLCANCiAgICAgICAgICAgaW1wbGVtZW50aW5nX3BhcnRuZXIsIA0KICAgICAgICAgICBhY3Rpdml0eV9yZWQpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcyksIA0KICAgICAgICAgICAgdG90YWxfdmFsdWUgPSBzdW0odG90YWxfdmFsdWVfbW1rKSwgDQogICAgICAgICAgICByb3VuZHMgPSBuX2Rpc3RpbmN0KGRhdGUpLCANCiAgICAgICAgICAgIC5ncm91cHMgPSAiZHJvcCIpICU+JSANCiAgbXV0YXRlKHBlcl9wZXJzb24gPSByb3VuZCh0b3RhbF92YWx1ZSAvIGJlbmVmaWNpYXJpZXMsIGRpZ2l0cyA9IDIpKSAlPiUgDQogIGZpbHRlcih0b3RhbF92YWx1ZSA+IDApICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBiZW5lZmljaWFyaWVzLCANCiAgICAgICAgICAgICB5ID0gcGVyX3BlcnNvbiwgDQogICAgICAgICAgICAgY29sb3VyID0gYWN0aXZpdHlfcmVkLCANCiAgICAgICAgICAgICB0ZXh0ID0gcGFzdGUwKGltcGxlbWVudGluZ19wYXJ0bmVyLCAiXG4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5X3JlZCwgIlxuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiYmVuLiBmcmVxdWVuY2llczogIiwgY29tbWEoYmVuZWZpY2lhcmllcywgYWNjdXJhY3kgPSAxKSwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJNTUsgcGVyIHBlcnNvbjogIiwgY29tbWEocGVyX3BlcnNvbiwgYWNjdXJhY3kgPSAxKSwgIlxuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAidG90YWwgTU1LOiAiLCBjb21tYSh0b3RhbF92YWx1ZSwgYWNjdXJhY3kgPSAxKSwgIlxuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAicm91bmRzOiAiLCByb3VuZHMsICJcbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgdG93bnNoaXAsICIsICIsIHN0YXRlKSkpICsgDQogIGdlb21faml0dGVyKGFlcyhzaXplID0gdG90YWxfdmFsdWUpLCBhbHBoYSA9IC41KSArIA0KICBzY2FsZV95X2NvbnRpbnVvdXModHJhbnMgPSAibG9nMTAiLCANCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGMoMCwgMSwgMywgMTAsIDMwLCAxMDAsIDMwMCksDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBkb2xsYXJfZm9ybWF0KGFjY3VyYWN5ID0gMSkpICsgDQogIHNjYWxlX3hfY29udGludW91cyh0cmFucyA9ICJsb2cxMCIsIA0KICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gY29tbWEsIA0KICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygwLCAxMCwgMTAwLCAxMDAwLCAxMDAwMCwgMTAwMDAwLCAzMDAwMDApKSArIA0KICBzY2FsZV9zaXplX2NvbnRpbnVvdXMoZ3VpZGUgPSAibm9uZSIsIHJhbmdlID0gYygwLjMsIDUpKSArIA0KICBsYWJzKHggPSAiQmVuZWZpY2lhcnkgZnJlcXVlbmNpZXMiLCANCiAgICAgICB5ID0gIk1NSyB2YWx1ZSBwZXIgcGVyc29uIiwgDQogICAgICAgdGl0bGUgPSAiQXZlcmFnZSBNTUsgdHJhbnNmZXIgdmFsdWUgcGVyIHBlcnNvbiBpbiAyMDIyXG5CeSBvcmdhbmlzYXRpb24sIGxvY2F0aW9uIGFuZCBhY3Rpdml0eSIsIA0KICAgICAgIHN1YnRpdGxlID0gIkJ5IG9yZ2FuaXNhdGlvbiwgbG9jYXRpb24gYW5kIGFjdGl2aXR5IiwgDQogICAgICAgY29sb3VyID0gImJ5IG9yZywgbG9jYXRpb24gYW5kIGFjdGl2aXR5XG5kb3VibGUtY2xpY2sgdG8gc2VsZWN0IikgKyANCiAgdGhlbWUobGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUpLA0KICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUpLA0KICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4LCBmYWNlID0gImJvbGQiKSwNCiAgICAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiMyMTIxMjEiKSkgKyANCiAgZ3VpZGVzKGNvbG91ciA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KHNpemUgPSAxLCBhbHBoYSA9IDEpKSkgDQoNCmdncGxvdGx5KG1vbmV5X3NjYXR0ZXIsIHRvb2x0aXAgPSBjKCJ0ZXh0IiksIHdpZHRoID0gODIwKSAlPiUgDQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKSAlPiUNCiAgbGF5b3V0KHRpdGxlID0gbGlzdCh0ZXh0ID0gcGFzdGUwKCJBdmVyYWdlIE1NSyB0cmFuc2ZlciB2YWx1ZSBwZXIgcGVyc29uLCBhcyBvZiAzMSBKdWx5IDIwMjIiKSkpDQoNCg0KYGBgDQoNCg0KPGJyPjxicj48YnI+DQoNCiMjIyAzLjMgRm9vZCBkaXN0cmlidXRpb25zDQoNCmBgYHtyIHBsb3RseS1mb29kLWRpc3QtcmFuZ2V9DQoNCmZvb2RfZGlzdF9yYW5nZSA8LSBmc2MgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKG1ta19wZXJfcGVyc29uKSkgJT4lDQogIGZpbHRlcihhY3Rpdml0eV9yZWQgPT0gImZvb2QgZGlzdHJpYnV0aW9uIiAmIG1ta19wZXJfcGVyc29uIDwgNjAwMDAwKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IG1ta19wZXJfcGVyc29uLCB5ID0gc3RhdGUsIGNvbG91ciA9IHN0YXRlLCANCiAgICAgICAgICAgICB0ZXh0ID0gcGFzdGUwKGltcGxlbWVudGluZ19wYXJ0bmVyLCAiXG4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5X3JlZCwgIlxuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiYmVuLiBmcmVxdWVuY2llczogIiwgY29tbWEoYmVuZWZpY2lhcmllcywgYWNjdXJhY3kgPSAxKSwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJNTUsgcGVyIHBlcnNvbjogIiwgY29tbWEobW1rX3Blcl9wZXJzb24pLCAiXG4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0b3RhbCBNTUs6ICIsIGNvbW1hKHRvdGFsX3ZhbHVlX21taywgYWNjdXJhY3kgPSAxKSwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvd25zaGlwLCAiLCAiLCBzdGF0ZSkpKSArIA0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAxOTA1NS41LCBsdHkgPSAyLCBjb2xvdXIgPSAicmVkIiwgYWxwaGEgPSAuNSwgc2l6ZSA9IC4zKSArIA0KICBnZW9tX2ppdHRlcihhbHBoYSA9IDAuMSwgYWVzKHNpemUgPSBiZW5lZmljaWFyaWVzKSkgKw0KICBzY2FsZV9jb2xvdXJfdmlyaWRpc19kKCkgKw0KICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDAuMywgMTApKSArDQogIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBjb21tYV9mb3JtYXQoYWNjdXJhY3kgPSAxKSwgDQogICAgICAgICAgICAgICAgICAgICB0cmFucyA9ICJsb2cxMCIpICsNCiAgbGFicyh4ID0gIk1NSyB2YWx1ZSBwZXIgcGVyc29uIiwgDQogICAgICAgeSA9ICIiLCANCiAgICAgICB0aXRsZSA9ICJGb29kIGRpc3RyaWJ1dGlvbjogcmFuZ2Ugb2YgTU1LIHZhbHVlcyBwZXIgcGVyc29uIGJ5IHN0YXRlIGluIDIwMjIsIGFzIG9mIDMxLTA3LTIwMjIiLA0KICAgICAgIHNpemUgPSAiIiwgY29sb3VyID0gIiIpIA0KDQpnZ3Bsb3RseShmb29kX2Rpc3RfcmFuZ2UsIHRvb2x0aXAgPSBjKCJ0ZXh0IiksIHdpZHRoID0gODIwLCBoZWlnaHQgPSAgNjAwKSAlPiUgDQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKSAlPiUNCiAgbGF5b3V0KHRpdGxlID0gDQogICAgICAgICAgIGxpc3QodGV4dCA9IA0KICAgICAgICAgICAgICAgICAgcGFzdGUwKCJGb29kIGRpc3RyaWJ1dGlvbjogTU1LIHZhbHVlcyBieSBzdGF0ZSwgYXMgb2YgMzEtMDctMjAyMiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgIjxicj4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICI8c3VwPiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSByZWQgbGluZSBpcyA1MCUgb2YgMS81IG9mIGZvb2QgTUVCOyBkb3VibGUtY2xpY2sgb24gbGVnZW5kIHRvIHNlbGVjdCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgIjwvc3VwPiIpKSwgDQogICAgICAgICBsZWdlbmQgPSBsaXN0KGZvbnQgPSBsaXN0KHNpemUgPSA3KSkpIA0KYGBgDQoNCjxicj4NCg0KQmVuZWZpY2lhcmllcyBpbiBSYWtoaW5lIGFyZSBzcGxpdCBpbnRvIHR3byBncm91cHMsIG9uZSBhdCBhcm91bmQgTU1LIDcsMDAwIGFuZCBhbm90aGVyIGF0IE1NSyAxNywwMDAuIEtheWluIGhhcyBhIHZlcnkgbGFyZ2UgbnVtYmVyIG9mIHBlcnNvbnMgd2hvIHJlY2VpdmVkIGxlc3MgdGhhbiBNTUsgMSwwMDAgZWFjaC4gDQoNCkRpc3RyaWJ1dGlvbnMgaW4gQ2hpbiBhbmQgQXlleWFyd2FkeSBoYWQgdmVyeSBjb25zaXN0ZW50IHZhbHVlcyBhcyB0aGV5IHdlcmUgYWxsIGltcGxlbWVudGVkIGJ5IHRoZSBzYW1lIGltcGxlbWVudGluZyBwYXJ0bmVyLg0KDQpUaGUgdGFibGUgYmVsb3cgY29tcGFyZXMgdGhlIGRpZmZlcmVudCBiaW5zIGZvciBjYXNoIHRyYW5zZmVyIHZhbHVlcyBvZiBmb29kIGRpc3RyaWJ1dGlvbnMgd2l0aCB0aGUgbWluaW11bSBleHBlbmRpdHVyZSBiYXNrZXQgZm9yIGZvb2QgZXN0YWJsaXNoZWQgYnkgdGhlIENhc2ggV29ya2luZyBHcm91cC4gVGhleSBoYXZlIGVzdGFibGlzaGVkIGEgZmxvb3Igb2YgTU1LIDE5MCw1NTUgKG9yIFVTRCAxMTQuNTUpIGZvciB0aGUgZm9vZCBzZWN1cml0eSBjb21wb25lbnQgcGVyIGhvdXNlaG9sZCBwZXIgbW9udGguIA0KDQpPdmVyYWxsLCBgciByb3VuZCgoZmlsdGVyKGZzYywgdXNkX3Blcl9wZXJzb24gPj0gKDExNC41NSAvIDUpICYgYWN0aXZpdHlfcmVkID09ICJmb29kIGRpc3RyaWJ1dGlvbiIpICU+JSB7c3VtKC4kbmV3X2JlbmVmaWNpYXJpZXMpfSkgLyAoZmlsdGVyKGZzYywgIWlzLm5hKHVzZF9wZXJfcGVyc29uKSAmIGFjdGl2aXR5X3JlZCA9PSAiZm9vZCBkaXN0cmlidXRpb24iKSAlPiUge3N1bSguJG5ld19iZW5lZmljaWFyaWVzKX0pICogMTAwLCBkaWdpdHMgPSAyKWAlIG9mIGZvb2QgZGlzdHJpYnV0aW9uIGJlbmVmaWNpYXJpZXMgaGF2ZSByZWNlaXZlZCBhdCBsZWFzdCAxMDAlIG9mIHRoZSBmb29kIHNlY3VyaXR5IE1FQiBhbmQgYHIgcm91bmQoKGZpbHRlcihmc2MsIHVzZF9wZXJfcGVyc29uID49ICgxMTQuNTUgLyA1IC8gMikgJiBhY3Rpdml0eV9yZWQgPT0gImZvb2QgZGlzdHJpYnV0aW9uIikgJT4lIHtzdW0oLiRuZXdfYmVuZWZpY2lhcmllcyl9KSAvIChmaWx0ZXIoZnNjLCAhaXMubmEodXNkX3Blcl9wZXJzb24pICYgYWN0aXZpdHlfcmVkID09ICJmb29kIGRpc3RyaWJ1dGlvbiIpICU+JSB7c3VtKC4kbmV3X2JlbmVmaWNpYXJpZXMpfSkgKiAxMDAsIGRpZ2l0cyA9IDIpYCUgaGF2ZSByZWNlaXZlZCBhdCBsZWFzdCA1MCUgb2YgdGhlIGZvb2Qgc2VjdXJpdHkgTUVCIChNTUsgMTksMDU2IG9yIFVTRCAxMS40NSBwZXIgcGVyc29uKS4NCg0KPGJyPg0KDQpgYGB7ciB0YWJsZS1tZWItdXNkLWhoZC1iaW59DQoNCmZvb2RfYmlucyA8LSBmc2MgJT4lIGZpbHRlcihhY3Rpdml0eV9yZWQgJWluJSBjKCJmb29kIGRpc3RyaWJ1dGlvbiIpICYgDQogICAgICAgICAgICAgICAgICFpcy5uYShtbWtfcGVyX3BlcnNvbikgJiANCiAgICAgICAgICAgICAgICAgIWlzLm5hKG5ld19iZW5lZmljaWFyaWVzKSkgJT4lIA0KICBjb3VudChtbWtfcGVyc29uX2Jpbiwgd3QgPSBuZXdfYmVuZWZpY2lhcmllcykgJT4lIA0KICBtdXRhdGUocGNfb2ZfdG90YWwgPSByb3VuZChuIC8gc3VtKG4pICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBhcnJhbmdlKG1ta19wZXJzb25fYmluKQ0KDQpmc2MgJT4lIA0KICBmaWx0ZXIoYWN0aXZpdHlfcmVkICVpbiUgYygiZm9vZCBkaXN0cmlidXRpb24iKSAmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICFpcy5uYShtbWtfcGVyX3BlcnNvbikgJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaXMubmEobmV3X2JlbmVmaWNpYXJpZXMpKSAlPiUNCiAgbXV0YXRlKHBjX21lYiA9IG1ta19wZXJfcGVyc29uICogNSAvIDE5MDU1NSkgJT4lIA0KICBncm91cF9ieShtbWtfcGVyc29uX2JpbikgJT4lIA0KICBzdW1tYXJpc2UoYXZnX3BjX29mX21lYiA9IHJvdW5kKG1lYW4ocGNfbWViKSAqIDEwMCwgZGlnaXRzID0gMiksDQogICAgICAgICAgICBhdmdfbW1rX21vbnRoID0gcm91bmQobWVhbihtbWtfcGVyX3BlcnNvbiwgbmEucm0gPSBUUlVFKSksDQogICAgICAgICAgICBiZW5lZmljaWFyaWVzID0gcm91bmQoc3VtKG5ld19iZW5lZmljaWFyaWVzKSkpICU+JSANCiAgbXV0YXRlKHBjX29mX2hoZCA9IHJvdW5kKGJlbmVmaWNpYXJpZXMgLyBzdW0oYmVuZWZpY2lhcmllcykgKiAxMDAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlnaXRzID0gMiksIA0KICAgICAgICAgbW1rX3BlcnNvbl9iaW4gPSBmY3RfcmVsZXZlbChtbWtfcGVyc29uX2JpbiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCI8MTBLIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTBLXzwzMEsiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIzMEtfPDYwSyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjYwS188MTAwSyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEwMEtfPDIwMEsiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwMEtfPDMwMEsiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjMwMEtfPDFNIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPj0xTSIpKSkgJT4lIA0KICBhcnJhbmdlKG1ta19wZXJzb25fYmluKSAlPiUgDQogIGZsZXh0YWJsZSgpICU+JSANCiAgc2V0X2NhcHRpb24oIk1NSyB2YWx1ZXMgb2YgZm9vZCBkaXNyaWJ1dGlvbnMgYnkgcGVyY2VudGFnZSBvZiBNRUIgcmVjZWl2ZWQiKSAlPiUgDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0IikgJT4lIA0KICB0aGVtZV96ZWJyYSgpICU+JSANCiAgZm9vdG5vdGUocGFydCA9ICJoZWFkZXIiLA0KICAgICAgICAgICBpID0gMSwgaiA9IDQsIA0KICAgICAgICAgICB2YWx1ZSA9IGFzX3BhcmFncmFwaCgiT25seSBwZXJzb25zIHJlYWNoZWQgdGhyb3VnaCBDQlQvQ1ZBIG1vZGFsaXRpZXMgYXJlIGluY2x1ZGVkIikpDQoNCg0KYGBgDQoNCjxicj48YnI+DQoNCiMjIyAzLjQgSW1wbGVtZW50aW5nIHBhcnRuZXJzDQoNClRoZSBwbG90cyBiZWxvdyBzaG93IHRoZSB0aGUgYXZlcmFnZSBjYXNoIHRyYW5zZmVyIHZhbHVlcyBieSBhY3Rpdml0eSBmb3IgdGhlIHRvcCA3IHBhcnRuZXJzIGltcGxlbWVudGluZyB0aGF0IGFjdGl2aXR5LiBUaGUgeC1heGlzIHNob3dzIHRoZSBudW1iZXIgb2YgYmVuZWZpY2lhcmllcyByZWFjaGVkIGFuZCB0aGUgZGVwdGggb2YgdGhlIGNvbG91ciBpbmRpY2F0ZXMgdGhlIHZhbHVlIG9mIHRoZSBjYXNoIHRyYW5zZmVyLiANCg0KPGJyPg0KDQpgYGB7ciBwYXJ0bmVyLWNhc2gtdmFsdWVzLCBmaWcuaGVpZ2h0PTYuNX0NCnBhcnRuZXJfbWVhbl9tbWsgPC0gZnVuY3Rpb24odGJsLCBuYW1lKXsNCg0KICB0YmwgJT4lIA0KICAgIGZpbHRlcighaXMubmEobmV3X2JlbmVmaWNpYXJpZXMpICYgIWlzLm5hKG1ta19wZXJfaGhkKSkgJT4lDQogICAgZmlsdGVyKGRlbGl2ZXJ5X21vZGFsaXR5ICVpbiUgYygiQ0JUL0NWQSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkh5YnJpZCAoSW4ta2luZCAmIENCVC9DVkEpIikpICU+JQ0KICAgIGZpbHRlcihhY3Rpdml0eV9yZWQgPT0ge3tuYW1lfX0pICU+JQ0KICAgIG11dGF0ZShob3VzZWhvbGRzID0gaWZlbHNlKGFjdGl2aXR5X3JlZCA9PSAiZm9vZCBkaXN0cmlidXRpb24iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlbmVmaWNpYXJpZXMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG91c2Vob2xkcykpICU+JSANCiAgICBncm91cF9ieShpbXBsZW1lbnRpbmdfcGFydG5lcikgJT4lIA0KICAgIHN1bW1hcmlzZSh0b3RhbF92YWx1ZV9tbWsgPSBzdW0odG90YWxfdmFsdWVfbW1rKSwNCiAgICAgICAgICAgICAgYmVuZWZpY2lhcmllcyA9IHN1bShuZXdfYmVuZWZpY2lhcmllcyksIA0KICAgICAgICAgICAgICBob3VzZWhvbGRzID0gc3VtKGhvdXNlaG9sZHMpKSAlPiUgDQogICAgbXV0YXRlKG1lYW5fbW1rID0gdG90YWxfdmFsdWVfbW1rIC8gaG91c2Vob2xkcykgJT4lIA0KICAgIGFycmFuZ2UoZGVzYyhiZW5lZmljaWFyaWVzKSkgJT4lICANCiAgICB0b3Bfbig3KSAlPiUgDQogICAgbXV0YXRlKGltcGxlbWVudGluZ19wYXJ0bmVyID0gZmN0X3Jlb3JkZXIoaW1wbGVtZW50aW5nX3BhcnRuZXIsIGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogICAgZ2dwbG90KGFlcyh4ID0gYmVuZWZpY2lhcmllcywgDQogICAgICAgICAgICAgICB5ID0gaW1wbGVtZW50aW5nX3BhcnRuZXIsIA0KICAgICAgICAgICAgICAgZmlsbCA9IG1lYW5fbW1rKSkgKyANCiAgICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWFfZm9ybWF0KGFjY3VyYWN5ID0gMSkpICsgDQogICAgc2NhbGVfZmlsbF92aXJpZGlzKG9wdGlvbiA9ICJtYWtvIiwgZGlyZWN0aW9uID0gLTEsIGJlZ2luID0gMC4yLCANCiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gY29tbWFfZm9ybWF0KGFjY3VyYWN5ID0gMSkpICsNCiAgICBnZW9tX2NvbCgpICsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY29tbWEobWVhbl9tbWspKSwgDQogICAgICAgICAgICAgIHNpemUgPSAzLCANCiAgICAgICAgICAgICAgaGp1c3QgPSAiaW53YXJkIikgKyANCiAgICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gOCkpICsNCiAgbGFicyh4ID0gIk51bWJlciBvZiBiZW5lZmljaWFyaWVzIHJlYWNoZWQiLCANCiAgICAgICB5ID0gIiIsIA0KICAgICAgIGZpbGwgPSAiQXZnIE1NSyIpICsNCiAgICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpLA0KICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA1LjUpLCANCiAgICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksDQogICAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSkNCn0NCg0KZnNjICU+JSBwYXJ0bmVyX21lYW5fbW1rKCJtdWx0aS1wdXJwb3NlIGNhc2ggdHJhbnNmZXIiKSArDQogIGxhYnModGl0bGUgPSAiTXVsdGktcHVycG9zZSBjYXNoIHRyYW5zZmVyIChwZXIgaGhkKSIpICsgDQpmc2MgJT4lIHBhcnRuZXJfbWVhbl9tbWsoImZvb2QgZGlzdHJpYnV0aW9uIikgKw0KICBsYWJzKHRpdGxlID0gIkZvb2QgZGlzdHJpYnV0aW9ucyAocGVyIHBlcnNvbikiKSArDQpmc2MgJT4lIHBhcnRuZXJfbWVhbl9tbWsoImZvb2RfY2FzaCBmb3Igd29ya19hc3NldHMiKSArIA0KICBsYWJzKHRpdGxlID0gIkZvb2QvY2FzaCBmb3Igd29yay9hc3NldHMgKHBlciBoaGQpIikgKyANCmZzYyAlPiUgcGFydG5lcl9tZWFuX21taygiSUdBIGFuZCBzbWFsbCBncmFudHMiKSArDQogIGxhYnModGl0bGUgPSAiSUdBIGFuZCBzbWFsbCBncmFudHMgKHBlciBoaGQpIikgKyANCiAgcGxvdF9hbm5vdGF0aW9uKHRpdGxlID0gIkNhc2ggdHJhbnNmZXIgdmFsdWVzIG9mIHRoZSB0b3AgaW1wbGVtZW50aW5nIHBhcnRuZXJzIChieSBiZW5lZmljaWFyaWVzIHJlYWNoZWQpIiwgDQogICAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9ICJGYWNldGVkIGJ5IGFjdGl2aXR5IikNCg0KDQpgYGANCg0KPGJyPjxicj48YnI+DQoNCiMjIDQuIFBhcnRuZXJzDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0UsIGV2YWw9RkFMU0V9DQoNCmZzYyAlPiUgc2VsZWN0KG9yZ19jb2RlID0gcmVwb3J0aW5nX29yZ2FuaXphdGlvbikgJT4lIA0KICByYmluZCgNCiAgICBmc2MgJT4lIHNlbGVjdChvcmdfY29kZSA9IGltcGxlbWVudGluZ19wYXJ0bmVyKQ0KICApICU+JSANCiAgZGlzdGluY3Qob3JnX2NvZGUpICU+JSBucm93KCkNCg0KZnNjICU+JSBkaXN0aW5jdChyZXBvcnRpbmdfb3JnYW5pemF0aW9uKSAlPiUgbnJvdygpDQoNCmZzYyAlPiUgZGlzdGluY3QoaW1wbGVtZW50aW5nX3BhcnRuZXIpICU+JSBucm93KCkNCg0KYGBgDQoNCg0KQSB0b3RhbCBvZiA3NSBwYXJ0bmVycyBoYXZlIHJlcG9ydGVkIGludG8gdGhlIEZvb2QgU2VjdXJpdHkgQ2x1c3RlciBhcyBvZiBKdWx5IDIwMjIgLS0gdGhlcmUgYXJlIDY2IGltcGxlbWVudGluZyBwYXJ0bmVycyBhbmQgMjggcmVwb3J0aW5nIHBhcnRuZXJzLiBUaGlzIGZpcnN0IGluc3RhbmNlIG9mIG1vbnRobHkgcmVwb3J0aW5nIGhhcyBzZWVuIGEgc2lnbmlmaWNhbnQgZGlwIGluIHN1Ym1pc3Npb25zLCBidXQgcmVzcG9uc2UgaGFzIG92ZXJhbGwgYmVlbiBiZXR0ZXIgdGhhbiBleHBlY3RlZC4gDQoNCkFsbCB0aGlzIG1lYW5zIGlzIHRoYXQgc2V2ZXJhbCBwYXJ0bmVycyBhcmUgd2FpdGluZyB1bnRpbCB0aGUgZW5kIG9mIHRoZSBxdWFydGVyIHRvIHJlcG9ydCBpbi4gDQoNClRoaXMgc2VjdGlvbiB3aWxsIG1vc3RseSBvbmx5IGxvb2sgYXQgeWVhci10by1kYXRlIGFjaGlldmVtZW50cy4gDQoNCjxicj4NCg0KYGBge3IgbGluZXBsb3QtcGFydG5lcnN9DQpmc2MgJT4lIA0KICBncm91cF9ieShkYXRlKSAlPiUgDQogIHN1bW1hcmlzZShpbXBsZW1lbnRpbmcgPSBuX2Rpc3RpbmN0KGltcGxlbWVudGluZ19wYXJ0bmVyKSwgDQogICAgICAgICAgICByZXBvcnRpbmcgPSBuX2Rpc3RpbmN0KHJlcG9ydGluZ19vcmdhbml6YXRpb24pKSAlPiUgDQogIHBpdm90X2xvbmdlcihjb2xzID0gYyhpbXBsZW1lbnRpbmcsIHJlcG9ydGluZyksDQogICAgICAgICAgICAgICBuYW1lc190byA9ICJwYXJ0bmVyIiwgDQogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAiY291bnQiKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gZGF0ZSwgeSA9IGNvdW50LCANCiAgICAgICAgICAgICBjb2xvdXIgPSBwYXJ0bmVyKSkgKyANCiAgZ2VvbV9wb2ludChzaXplID0gMi41KSArDQogIGdlb21fbGluZShzaXplID0gMS41KSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBjb3VudCksIA0KICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgDQogICAgICAgICAgICB2anVzdCA9IC0uMykgKw0KICBzY2FsZV94X2RhdGUoZGF0ZV9sYWJlbHMgPSAiJWItJXkiLCANCiAgICAgICAgICAgICAgIGRhdGVfYnJlYWtzID0gIjEgbW9udGgiKSArDQogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiI0YzOUMxMiIsICIjMEU2NjU1IikpICsNCiAgbGFicyh4ID0gIiIsIHkgPSAiTnVtYmVyIG9mIHBhcnRuZXJzIiwgDQogICAgICAgY29sb3VyID0gIlBhcm50ZXJcbnR5cGUiLA0KICAgICAgIHRpdGxlID0gIk51bWJlciBvZiBwYXJ0bmVycyByZXBvcnRpbmcgYnkgbW9udGgsIDMxIEp1bHkgMjAyMiIpDQoNCmBgYA0KDQo8YnI+PGJyPg0KDQojIyMgNC4xIEltcGxlbWVudGluZyBwYXJ0bmVycw0KDQpUaGVyZSBhcmUgYHIgZnNjICU+JSBmaWx0ZXIoanVseSA9PSAianVseSIpICU+JSBkaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lcikgJT4lIG5yb3coKWAgcGFydG5lcnMgdGhhdCB3ZXJlIGludm9sdmVkIGluIGRpcmVjdCBpbXBsZW1lbnRhdGlvbiB0aGF0IGhhdmUgcmVwb3J0ZWQgYWNoaWV2ZW1lbnRzIGluIEp1bHkgMjAyMiwgaW4gY29tcGFyaXNvbiB3aXRoIGByIGZzYyAlPiUgZmlsdGVyKGp1bHkgIT0gImp1bHkiKSAlPiUgZGlzdGluY3QoaW1wbGVtZW50aW5nX3BhcnRuZXIpICU+JSBucm93KClgIGluIHRoZSBmaXJzdCBxdWFydGVyLiBUaGVzZSBpbXBsZW1lbnRpbmcgcGFydG5lcnMgY29ycmVzcG9uZGVkIHRvIGEgdG90YWwgb2YgYHIgZnNjICU+JSAgZGlzdGluY3QocmVwb3J0aW5nX29yZ2FuaXphdGlvbikgJT4lIG5yb3coKWAgcmVwb3J0aW5nIG9yZ2FuaXNhdGlvbnMuIFRoZSBsYXJnZXN0IHJlcG9ydGluZyBvcmdhbmlzYXRpb24sIDI2OTAsIGhhZCAyNCBpbXBsZW1lbnRpbmcgcGFydG5lcnMuDQoNClRoZSBpbnRlcmFjdGl2ZSBwbG90IGJlbG93IHNob3dzIHRoZSBudW1iZXIgb2YgYmVuZWZpY2lhcmllcyBhbmQgdG93bnNoaXBzIHJlYWNoZWQgYnkgaW1wbGVtZW50aW5nIHBhcnRuZXIuDQoNCmByIGZzYyAlPiUgZ3JvdXBfYnkoaW1wbGVtZW50aW5nX3BhcnRuZXIpICU+JSBzdW1tYXJpc2UodG93bnNoaXBzID0gbl9kaXN0aW5jdChhZG1pbjNfcGNvZGUpKSAlPiUgZmlsdGVyKHRvd25zaGlwcyA+IDUpICU+JSBucm93KClgIHBhcnRuZXJzICgyMSUgb2YgdGhlIHRvdGFsKSBoYXZlIGEgcHJlc2VuY2UgaW4gbW9yZSB0aGFuIDUgdG93bnNoaXBzLiBgciBmc2MgJT4lIGdyb3VwX2J5KGltcGxlbWVudGluZ19wYXJ0bmVyKSAlPiUgc3VtbWFyaXNlKHRvd25zaGlwcyA9IG5fZGlzdGluY3QoYWRtaW4zX3Bjb2RlKSkgJT4lIGZpbHRlcih0b3duc2hpcHMgPiAxMCkgJT4lIG5yb3coKWAgcGFydG5lcnMgKDE2JSBvZiB0aGUgdG90YWwpIGFyZSBwcmVzZW50IGluIG1vcmUgdGhhbiAxMCB0b3duc2hpcHMuDQoNCjxicj4NCg0KYGBge3IgcGxvdGx5LXBhcnRuZXItc2NhdHRlcn0NCg0KIyBNZWRpYW4gdmFsdWVzIGFyZSB4ID0gNTY3MSBhbmQgeSA9IDMuIEN1cnJlbnRseSB1c2luZyBtZWFuLiANCnBhcnRuZXJfc2NhdHRlciA8LSBmc2MgJT4lICANCiAgZ3JvdXBfYnkoaW1wbGVtZW50aW5nX3BhcnRuZXIpICU+JSANCiAgc3VtbWFyaXNlKHN0YXRlcyA9IG5fZGlzdGluY3Qoc3RhdGUpLCANCiAgICAgICAgICAgIHRvd25zaGlwcyA9IG5fZGlzdGluY3QoYWRtaW4zX3Bjb2RlKSwgDQogICAgICAgICAgICBiZW5lZmljaWFyaWVzID0gc3VtKG5ld19iZW5lZmljaWFyaWVzKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBiZW5lZmljaWFyaWVzLCB5ID0gdG93bnNoaXBzLCANCiAgICAgICAgICAgICB0ZXh0ID0gcGFzdGUwKGltcGxlbWVudGluZ19wYXJ0bmVyLCAiXG4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdGF0ZXM6ICIsIHN0YXRlcywgIlxuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAidG93bnNoaXBzOiAiLCB0b3duc2hpcHMsICJcbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgImJlbmVmaWNpYXJpZXM6ICIsIGNvbW1hKGJlbmVmaWNpYXJpZXMsIGFjY3VyYWN5ID0gMSkpKSkgKyANCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gNDgxNDUuMzMsIGx0eSA9IDIsIGNvbG91ciA9ICJyZWQiKSArIA0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSA0LjU1NTU1NiwgbHR5ID0gMiwgY29sb3VyID0gInJlZCIpICsgDQogIGdlb21fcG9pbnQoYWVzKHNpemUgPSBiZW5lZmljaWFyaWVzKSwgYWxwaGEgPSAuNykgKyANCiAgc2NhbGVfeF9jb250aW51b3VzKHRyYW5zID0gImxvZyIsIA0KICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gY29tbWEsIA0KICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygwLCAxMDAsIDMwMCwgMTAwMCwgMzAwMCwgMTAwMDAsIDMwMDAwLCAxMDAwMDAsIDMwMDAwMCkpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAyNSwgNSkpICsNCiAgbGFicyh4ID0gIk51bWJlciBvZiBiZW5lZmljaWFyaWVzIiwNCiAgICAgICB5ID0gIk51bWJlciBvZiB0b3duc2hpcHMiLA0KICAgICAgIHRpdGxlID0gIlBsb3Qgb2YgYmVuZWZpY2lhcmllcyBhbmQgdG93bnNoaXBzIHJlYWNoZWQsIGJ5IGltcGxlbWVudGluZyBwYXJ0bmVyIikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpDQoNCmdncGxvdGx5KHBhcnRuZXJfc2NhdHRlciwgdG9vbHRpcCA9IGMoInRleHQiKSwgd2lkdGggPSA4MjApICU+JQ0KICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkgJT4lIA0KICBsYXlvdXQodGl0bGUgPSANCiAgICAgICAgICAgbGlzdCgNCiAgICAgICAgICAgICB0ZXh0ID0NCiAgICAgICAgICAgICAgIHBhc3RlMCgNCiAgICAgICAgICAgICAgICAgIkJlbmVmaWNpYXJpZXMgYW5kIHRvd25zaGlwcyByZWFjaGVkLCBieSBpbXBsZW1lbnRpbmcgcGFydG5lciIsDQogICAgICAgICAgICAgICAgICI8YnI+IiwNCiAgICAgICAgICAgICAgICAgIjxzdXA+IiwNCiAgICAgICAgICAgICAgICAgIm1vdXNlIG92ZXIgZm9yIGRldGFpbHM7IHNpemVzIGluZGljYXRlIGJlbmVmaWNpYXJpZXMgcmVhY2hlZDsgcmVkIGxpbmVzIGFyZSBtZWFucyIsDQogICAgICAgICAgICAgICAgICI8L3N1cD4iDQogICAgICAgICAgICAgICApDQogICAgICAgICAgICkpDQoNCiMgTWFrZSBhIGNvbXBhcmlzb24gd2l0aCBRMQ0KYGBgDQoNCg0KDQo8YnI+PGJyPg0KDQojIyMgNC4yIE1vbnRobHkgcHJvZ3Jlc3MgYnkgcGFydG5lcg0KDQpUaGUgdGhpY2sgZ3JleSBsaW5lIHNob3dzIGFuIG9yZ2FuaXNhdGlvbidzIHByb2dyZXNzIGZyb20gbGFzdCB5ZWFyLCB3aGljaCwgYXMgbWVudGlvbmVkLCBjYW5ub3QgZXhhY3RseSBiZSB1c2VkIGZvciBhIHN0cmFpZ2h0IGNvbXBhcmlzb24gYXMgdGhlIHNjb3BlIG9mIHRoZSBIUlAgaW4gMjAyMSB3YXMgZGlmZmVyZW50IHVudGlsIHRoZSBhcHByb3ZhbCBvZiB0aGUgSUVSUCwgYWRkaXRpb25hbGx5LCBtYW55IHBhcnRuZXJzIG9ubHkgam9pbmVkIHRoZSBjbHVzdGVyIGxhdGUgaW4gMjAyMSBvciBldmVuIGluIDIwMjIuIFN0aWxsLCBpdCBzZXJ2ZXMgYXMgYSByZWZlcmVuY2UuDQoNCg0KPGJyPg0KDQpgYGB7ciBwYXJ0bmVyLXByb2dyZXNzLWZhY2V0LWxpbmV9DQoNCnBhcnRuZXJfdG9wIDwtIGZzYyAlPiUgDQogIHN1bV9iZW4oaW1wbGVtZW50aW5nX3BhcnRuZXIpICU+JSANCiAgYXJyYW5nZShkZXNjKGJlbmVmaWNpYXJpZXMpKSAlPiUgIA0KICBtdXRhdGUoaW1wbGVtZW50aW5nX3BhcnRuZXIgPSByZW9yZGVyKGltcGxlbWVudGluZ19wYXJ0bmVyLCAtYmVuZWZpY2lhcmllcykpICU+JSANCiAgcHVsbChpbXBsZW1lbnRpbmdfcGFydG5lcikgJT4lIA0KICBoZWFkKDEyKQ0KDQpsaW5lXzIwMjEgPC0gZnNjXzIwMjEgJT4lIA0KICByZW5hbWUoaW1wbGVtZW50aW5nX3BhcnRuZXIgPSBvcmdfY29kZSkgJT4lIA0KICBmaWx0ZXIodW5pcXVlX2JlbmVmaWNpYXJpZXMgPT0gIlllcyIpICU+JQ0KICBmaWx0ZXIoaW1wbGVtZW50aW5nX3BhcnRuZXIgJWluJSBwYXJ0bmVyX3RvcCkgJT4lIA0KICBzZWxlY3QoZGF0ZSwgaW1wbGVtZW50aW5nX3BhcnRuZXIsIGJlbmVmaWNpYXJpZXMsIGxvY2F0aW9uLCBhZG1pbjNfcGNvZGUpICU+JSANCiAgbXV0YXRlKGRhdGUgPSBkYXRlICsgeWVhcnMoMSkpICU+JSANCiAgZ3JvdXBfYnkobG9jYXRpb24sIGFkbWluM19wY29kZSkgJT4lIA0KICBzbGljZSh3aGljaC5tYXgoYmVuZWZpY2lhcmllcykpICU+JSANCiAgZ3JvdXBfYnkoaW1wbGVtZW50aW5nX3BhcnRuZXIpICU+JSANCiAgYXJyYW5nZShkYXRlKSAlPiUgDQogIG11dGF0ZShjdW1fYmVuID0gY3Vtc3VtKGJlbmVmaWNpYXJpZXMpKQ0KDQpmc2MgJT4lDQogIGZpbHRlcihpbXBsZW1lbnRpbmdfcGFydG5lciAlaW4lIHBhcnRuZXJfdG9wKSAlPiUNCiAgc2VsZWN0KGRhdGUsIA0KICAgICAgICAgaW1wbGVtZW50aW5nX3BhcnRuZXIsIA0KICAgICAgICAgYmVuZWZpY2lhcmllcyA9IG5ld19iZW5lZmljaWFyaWVzLCANCiAgICAgICAgIGxvY2F0aW9uLCBhZG1pbjNfcGNvZGUpICU+JSANCiAgIyByYmluZChmc2NfMjAyMSAlPiUgDQogICMgICAgICAgICBmaWx0ZXIodW5pcXVlX2JlbmVmaWNpYXJpZXMgPT0gIlllcyIpICU+JSANCiAgIyAgICAgICAgIGZpbHRlcihvcmdfY29kZSAlaW4lIHBhcnRuZXJfdG9wKSAlPiUgDQogICMgICAgICAgICBzZWxlY3QoZGF0ZSwgb3JnX2NvZGUsIGJlbmVmaWNpYXJpZXMsIGxvY2F0aW9uLCBhZG1pbjNfcGNvZGUpKSAlPiUgDQogIGdyb3VwX2J5KGxvY2F0aW9uLCBhZG1pbjNfcGNvZGUpICU+JSANCiAgc2xpY2Uod2hpY2gubWF4KGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIGdyb3VwX2J5KGltcGxlbWVudGluZ19wYXJ0bmVyKSAlPiUgDQogIGFycmFuZ2UoZGF0ZSkgJT4lIA0KICBtdXRhdGUoY3VtX2JlbiA9IGN1bXN1bShiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBkYXRlLCB5ID0gY3VtX2JlbikpICsNCiAgZ2VvbV9zdGVwKGRhdGEgPSBsaW5lXzIwMjEsIA0KICAgICAgICAgICAgYWVzKHggPSBkYXRlLCANCiAgICAgICAgICAgICAgICB5ID0gY3VtX2JlbiksIA0KICAgICAgICAgICAgY29sb3VyID0gImdyZXkiLA0KICAgICAgICAgICAgc2l6ZSA9IDIsIA0KICAgICAgICAgICAgYWxwaGEgPSAuNCkgKyANCiAgZ2VvbV92bGluZShjb2xvdXIgPSAicmVkIiwgDQogICAgICAgICAgICAgbHR5ID0gMiwNCiAgICAgICAgICAgICB4aW50ZXJjZXB0ID0gYXMubnVtZXJpYyhhcy5EYXRlKCIyMDIyLTA2LTAxIikpLCANCiAgICAgICAgICAgICBhbHBoYSA9IC41KSArDQogIGdlb21fdmxpbmUoY29sb3VyID0gInJlZCIsIA0KICAgICAgICAgICAgIGx0eSA9IDIsIA0KICAgICAgICAgICAgIHhpbnRlcmNlcHQgPSBhcy5udW1lcmljKGFzLkRhdGUoIjIwMjItMDMtMDEiKSksIA0KICAgICAgICAgICAgIGFscGhhID0gLjUpICsNCiAgZ2VvbV9zdGVwKHNpemUgPSAwLjcpICsgDQogIHNjYWxlX3hfZGF0ZShkYXRlX2JyZWFrcyA9ICIxIG1vbnRoIiwgDQogICAgICAgICAgICAgICBkYXRlX2xhYmVscyA9ICIlYiIpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArDQogIGZhY2V0X3dyYXAofiBmY3RfcmV2KGZjdF9yZW9yZGVyKGltcGxlbWVudGluZ19wYXJ0bmVyLCBjdW1fYmVuLCBtYXgpKSwgDQogICAgICAgICAgICAgc2NhbGVzID0gImZyZWVfeSIpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gNSwgYW5nbGUgPSA2MCwgaGp1c3QgPSAxLCB2anVzdCA9IDEpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gNSksDQogICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgsIGZhY2UgPSAiYm9sZCIpLA0KICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiIzIxMjEyMSIpLA0KICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMSkpICsgIyBzZWUgaWYgdGhpcyB3b3JrcyB3aGVuIHlvdSBrbml0LCB0aGVuIGRvIGl0IGZvciB0aGUgb3RoZXIgcGxvdHMgDQogIGxhYnMoeCA9ICJNb250aCIsIA0KICAgICAgIHkgPSAiQ3VtdWxhdGl2ZSBiZW5lZmljaWFyaWVzIiwgDQogICAgICAgdGl0bGUgPSAiTW9udGhseSBwcm9ncmVzcyBvZiB0b3AgMTIgaW1wbGVtZW50aW5nIHBhcnRuZXJzLCBhcyBvZiAzMSBKdWx5IDIwMjIiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJGaWd1cmVzIHNob3cgY3VtdWxhdGl2ZSB1bmlxdWUgYmVuZWZpY2lhcmllczsgcHJldmlvdXMgeWVhcidzIHByb2dyZXNzIGluIGdyZXkiKSANCg0KIyBnZ3NhdmUoInBhcnRuZXJfZmFjZXRfbGluZS5wbmciLCBkcGkgPSAzMDAsIGhlaWdodCA9IDUsIHdpZHRoID0gOCwgdW5pdHMgPSAiaW4iKSAgDQpgYGANCg0KPGJyPg0KDQpUaGUgdGFibGUgYmVsb3cgbGlzdHMgdGhlIHRvcCAxNSBwYXJ0bmVycyBieSBudW1iZXIgb2YgYmVuZWZpY2lhcmllcyByZWFjaGVkIGluIDIwMjIuDQoNCjxicj4NCg0KYGBge3J9DQpmc2MgJT4lDQogIGdyb3VwX2J5KGxvY2F0aW9uLCBhZG1pbjNfcGNvZGUpICU+JSANCiAgc2xpY2Uod2hpY2gubWF4KGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIGdyb3VwX2J5KGltcGxlbWVudGluZ19wYXJ0bmVyKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpLCANCiAgICAgICAgICAgIHN0YXRlcyA9IG5fZGlzdGluY3QoYWRtaW4xX3Bjb2RlKSwgDQogICAgICAgICAgICB0b3duc2hpcHMgPSBuX2Rpc3RpbmN0KGFkbWluM19wY29kZSkpJT4lDQogIGFycmFuZ2UoZGVzYyhiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBoZWFkKDE1KSAlPiUgDQogIGZsZXh0YWJsZSgpICU+JSANCiAgc2V0X2NhcHRpb24oIlRvcCBpbXBsZW1lbnRpbmcgcGFydG5lcnMgYnkgYmVuZWZpY2lhcmllcyByZWFjaGVkLCBhcyBvZiAzMS0wNy0yMDIyIikgJT4lDQogIHRoZW1lX3plYnJhKCkgJT4lIA0KICBzZXRfdGFibGVfcHJvcGVydGllcyhsYXlvdXQgPSAiYXV0b2ZpdCIpDQoNCmBgYA0KDQo8YnI+PGJyPg0KDQojIyMgNC4zIERvbm9ycw0KDQpUaGUgdGFibGUgYmVsb3cgc3VtbWFyaXNlcyB0aGUgcmVhY2ggYW5kIHNjb3BlIChpbiB0ZXJtcyBvZiBnZW9ncmFwaGljIGV4dGVudCBhbmQgbnVtYmVyIG9mIG9yZ2FuaXNhdGlvbnMgc3VwcG9ydGVkKSBvZiBkb25vcnMgd2hvIHN1cHBvcnQgYXQgbGVhc3QgdHdvIHJlcG9ydGluZyBvcmdhbmlzYXRpb25zLg0KDQo8YnI+DQoNCmBgYHtyfQ0KZnNjICU+JSANCiAgZ3JvdXBfYnkoZG9ub3IpICU+JSANCiAgc3VtbWFyaXNlKHJlcG9ydF9vcmdzID0gbl9kaXN0aW5jdChyZXBvcnRpbmdfb3JnYW5pemF0aW9uKSwgDQogICAgICAgICAgICBpbXBsZW1lbnRpbmdfb3JncyA9IG5fZGlzdGluY3QoaW1wbGVtZW50aW5nX3BhcnRuZXIpLCANCiAgICAgICAgICAgIHN0YXRlcyA9IG5fZGlzdGluY3QoYWRtaW4xX3Bjb2RlKSwgDQogICAgICAgICAgICB0b3duc2hpcHMgPSBuX2Rpc3RpbmN0KGFkbWluM19wY29kZSkpICU+JSANCiAgZmlsdGVyKCFpcy5uYShkb25vcikgJiByZXBvcnRfb3JncyA+IDEpICU+JSANCiAgYXJyYW5nZShkZXNjKHJlcG9ydF9vcmdzKSkgJT4lDQogIGhlYWQoMTUpICU+JSANCiAgZmxleHRhYmxlKCkgJT4lIA0KICBzZXRfY2FwdGlvbigiT3JnYW5pc2F0aW9ucyBzdXBwb3J0ZWQgYW5kIGdlb2dyYXBoaWMgcmVhY2ggYnkgZG9ub3IiKSAlPiUgDQogIHRoZW1lX3plYnJhKCkgJT4lIA0KICBmb290bm90ZShwYXJ0ID0gImhlYWRlciIsIA0KICAgICAgICAgICBpID0gMSwgaiA9IDEsIA0KICAgICAgICAgICB2YWx1ZSA9IGFzX3BhcmFncmFwaCgiT25seSBzaG93aW5nIGRvbm9ycyBzdXBwb3J0aW5nIG1vcmUgdGhhbiBvbmUgcmVwb3J0aW5nIHBhcnRuZXIiKSkNCg0KYGBgDQoNCjxicj4NCg0KU2FnYWluZywgU2hhbiAoRWFzdCksIFRhbmludGhhcnlpIGFuZCBNYWd3YXkgaGF2ZSB0aGUgZmV3ZXN0IG51bWJlciBvZiBkb25vcnMgcHJlc2VudC4NCg0KPGJyPg0KDQpgYGB7ciB0YWJsZS1kb25vci1zdGF0ZXN9DQpmc2MgJT4lIA0KICBncm91cF9ieShzdGF0ZSkgJT4lIA0KICBzdW1tYXJpc2UoZG9ub3JzID0gbl9kaXN0aW5jdChkb25vciksIA0KICAgICAgICAgICAgaW1wbGVtZW50aW5nX3BhcnRuZXJzID0gbl9kaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lcikpICU+JSANCiAgYXJyYW5nZShkZXNjKGRvbm9ycykpICU+JSANCiAgZmxleHRhYmxlKCkgJT4lIA0KICBzZXRfY2FwdGlvbigiTnVtYmVyIG9mIGRvbm9ycyBieSBzdGF0ZSIpICU+JSANCiAgc2V0X3RhYmxlX3Byb3BlcnRpZXMobGF5b3V0ID0gImF1dG9maXQiKSAlPiUgDQogIHRoZW1lX3plYnJhKCkNCg0KYGBgDQoNCjxicj4NCg0KSG93ZXZlciwgYXMgc2hvd24gYnkgdGhlIHRhYmxlIGJlbG93LCBldmVuIHRob3VnaCB0aGUgbWFqb3JpdHkgb2YgcGFydG5lcnMgcmVwb3J0ZWQgdGhlaXIgZG9ub3JzLCB0aGUgb21pc3Npb24gb2YgZGF0YSBmcm9tIHRocmVlIGtleSBwYXJ0bmVycyBoYXMgcmVzdWx0ZWQgaW4gdGhlIHZhc3QgbWFqb3JpdHkgb2YgcmVwb3J0ZWQgYmVuZWZpY2lhcmllcyBub3QgYmVpbmcgYXNzb2NpYXRlZCB3aXRoIGFueSBkb25vci4NCg0KPGJyPg0KDQpgYGB7ciB0YWJsZS1kb25vcnMtYmVuZWZpY2lhcmllc30NCmZzYyAlPiUgDQogIGdyb3VwX2J5KGRvbm9yKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKG5ld19iZW5lZmljaWFyaWVzKSkgJT4lIA0KICBtdXRhdGUoZG9ub3IgPSBpZmVsc2UoaXMubmEoZG9ub3IpLCAiTm8gZG9ub3Igc3BlY2lmaWVkIiwgZG9ub3IpLCANCiAgICAgICAgIGRvbm9yID0gaWZlbHNlKGJlbmVmaWNpYXJpZXMgPCAxMDAwLCAiT3RoZXIgZG9ub3JzIiwgZG9ub3IpKSAlPiUgDQogIGdyb3VwX2J5KGRvbm9yKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIG11dGF0ZShgJV9iZW5lZmljaWFyaWVzYCA9IHJvdW5kKGJlbmVmaWNpYXJpZXMgLyBzdW0oYmVuZWZpY2lhcmllcykgKiAxMDAsIGRpZ2l0cyA9IDIpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhgJV9iZW5lZmljaWFyaWVzYCkpICU+JSANCiAgaGVhZCgxNSkgJT4lIA0KICBmbGV4dGFibGUoKSAlPiUgDQogIHNldF9jYXB0aW9uKCJUb3AgZG9ub3JzIGJ5IGJlbmVmaWNpYXJpZXMgcmVhY2hlZCIpICU+JSANCiAgdGhlbWVfemVicmEoKSAlPiUgDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0IikgJT4lIA0KICBmb290bm90ZShwYXJ0ID0gImhlYWRlciIsIA0KICAgICAgICAgICBpID0gMSwgaiA9IDEsIA0KICAgICAgICAgICB2YWx1ZSA9IGFzX3BhcmFncmFwaCgiRG9ub3JzIHN0YXJ0aW5nIHdpdGggJ29yZ194eHh4JyBhcmUgcGFydG5lcnMgdXNpbmcgdGhlaXIgb3duIG9yZ2FuaXNhdGlvbmFsIGZ1bmRzIikpDQogDQpgYGANCg0KDQo8YnI+PGJyPjxicj4NCg0KIyMgNS4gQmVuZWZpY2lhcmllcw0KDQpgciByb3VuZCgoZmlsdGVyKGZzYywgYmVuZWZpY2lhcnlfdHlwZSA9PSAiSG9zdC9sb2NhbCBDb21tdW5pdHkiICYganVseSA9PSAianVseSIpICU+JSB7c3VtKC4kbmV3X2JlbmVmaWNpYXJpZXMpfSkgLyAoZmlsdGVyKGZzYywganVseSA9PSAianVseSIpICU+JSAge3N1bSguJG5ld19iZW5lZmljaWFyaWVzKX0pICogMTAwLCBkaWdpdHMgPSAyKWAlIG9mIGFsbCBiZW5lZmljaWFyaWVzIGluIEp1bHkgMjAyMiB3ZXJlIGZyb20gaG9zdCBvciBsb2NhbCBjb21tdW5pdGllcy4gDQoNCjxicj48YnI+DQoNCg0KYGBge3J9DQpmc2MgJT4lIA0KICBmaWx0ZXIoanVseSA9PSAianVseSIpICU+JSANCiAgZ3JvdXBfYnkoYmVuZWZpY2lhcnlfdHlwZSkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShuZXdfYmVuZWZpY2lhcmllcykpICU+JQ0KICBzZWxlY3QoYmVuZWZpY2lhcnlfdHlwZSwgYmVuZWZpY2lhcmllcykgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBiZW5lZmljaWFyaWVzLA0KICAgICAgICAgICAgIHkgPSBmY3RfcmVvcmRlcihiZW5lZmljaWFyeV90eXBlLCBiZW5lZmljaWFyaWVzKSwgDQogICAgICAgICAgICAgZmlsbCA9IGJlbmVmaWNpYXJ5X3R5cGUsIA0KICAgICAgICAgICAgIGdyb3VwID0gYmVuZWZpY2lhcnlfdHlwZSkpICsgDQogIGdlb21fY29sKCkgKyANCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGNvbW1hKGJlbmVmaWNpYXJpZXMpKSwgDQogICAgICAgICAgICBoanVzdCA9ICJpbndhcmQiKSArIA0KICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsNCiAgbGFicyh5ID0gIiIsIHggPSAiQmVuZWZpY2lhcmllcyIsIA0KICAgICAgIHRpdGxlID0gIkJlbmVmaWNhcmllcyByZWFjaGVkIGJ5IGJlbmVmaWNpYXJ5IHR5cGUiKSArIA0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpDQpgYGANCjxicj48YnI+DQoNCiMjIyA1LjEgQmVuZWZpY2lhcnkgdHlwZXMNCg0KSW4gSnVseSAyMDIyLCBgciByb3VuZChmaWx0ZXIoZnNjLCBiZW5lZmljaWFyeV90eXBlID09ICJIb3N0L2xvY2FsIENvbW11bml0eSIgJiBqdWx5ID09ICJqdWx5IikgJT4lICB7c3VtKC4kbmV3X2JlbmVmaWNpYXJpZXMpfSAvIChmaWx0ZXIoZnNjLCBqdWx5ID09ICJqdWx5IikgJT4lICB7c3VtKC4kbmV3X2JlbmVmaWNpYXJpZXMpfSkgKiAxMDAsIGRpZ2l0cyA9IDIpYCUgb2YgYmVuZWZpY2lhcmllcyB3ZXJlIGZyb20gaG9zdCBvciBsb2NhbCBjb21tdW5pdGllcywgaW4gY29tcGFyaXNvbiB0byBgciByb3VuZChmaWx0ZXIoZnNjLCBiZW5lZmljaWFyeV90eXBlID09ICJIb3N0L2xvY2FsIENvbW11bml0eSIpICU+JSAge3N1bSguJG5ld19iZW5lZmljaWFyaWVzKX0gLyBzdW0oZnNjJG5ld19iZW5lZmljaWFyaWVzKSAqIDEwMCwgZGlnaXRzID0gMilgJSBmb3IgdGhlIHdob2xlIHllYXIuIGByIHJvdW5kKGZpbHRlcihmc2MsIGJlbmVmaWNpYXJ5X3R5cGUgPT0gIkludGVybmFsbHkgRGlzcGxhY2VkIiAmIGp1bHkgPT0gImp1bHkiKSAlPiUgIHtzdW0oLiRuZXdfYmVuZWZpY2lhcmllcyl9IC8gZmlsdGVyKGZzYywganVseSA9PSAianVseSIpICU+JSAge3N1bSguJG5ld19iZW5lZmljaWFyaWVzKX0gKiAxMDAsIGRpZ2l0cyA9IDIpYCUgb2YgYmVuZWZpY2lhcmllcyBpbiBKdWx5IDIwMjIgd2VyZSBJRFBzLCBjb21wYXJlZCB0byBgciByb3VuZChmaWx0ZXIoZnNjLCBiZW5lZmljaWFyeV90eXBlID09ICJJbnRlcm5hbGx5IERpc3BsYWNlZCIpICU+JSAge3N1bSguJG5ld19iZW5lZmljaWFyaWVzKX0gLyBzdW0oZnNjJG5ld19iZW5lZmljaWFyaWVzKSAqIDEwMCwgZGlnaXRzID0gMilgJSBmb3IgdGhlIHdob2xlIHllYXIuIA0KDQo8YnI+DQoNCmBgYHtyfQ0KZnNjICU+JSANCiAgZ3JvdXBfYnkoYmVuZWZpY2lhcnlfdHlwZSwganVseSkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShuZXdfYmVuZWZpY2lhcmllcyksIA0KICAgICAgICAgICAgLmdyb3VwcyA9ICJkcm9wIikgJT4lIA0KICBtdXRhdGUoYmVuZWZpY2lhcnlfdHlwZSA9IGZjdF9yZW9yZGVyKGJlbmVmaWNpYXJ5X3R5cGUsIGJlbmVmaWNpYXJpZXMpLA0KICAgICAgICAganVseSA9IHJlY29kZShqdWx5LA0KICAgICAgICAgICAgICAgICAgICAgICAibm8iID0gImphbl90b19qdW4iLCANCiAgICAgICAgICAgICAgICAgICAgICAieWVzIiA9ICJqdWx5IiApKSAlPiUgDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBqdWx5LCANCiAgICAgICAgICAgICAgdmFsdWVzX2Zyb20gPSBiZW5lZmljaWFyaWVzLCANCiAgICAgICAgICAgICAgdmFsdWVzX2ZpbGwgPSAwKSAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IGphbl90b19qdW4gKyBqdWx5LCANCiAgICAgICAgIHBjID0gcm91bmQodG90YWwgLyBzdW0odG90YWwpICogMTAwLCANCiAgICAgICAgICAgICAgICAgICAgZGlnaXRzID0gMiksIA0KICAgICAgICAgcGNfanVseSA9IHJvdW5kKGp1bHkgLyBzdW0oanVseSkgKiAxMDAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWdpdHMgPSAyKSkgJT4lIA0KICBmaWx0ZXIodG90YWwgIT0gMCkgJT4lIA0KICBhcnJhbmdlKGRlc2MocGMpKSAlPiUgDQogIHNlbGVjdChiZW5lZmljaWFyeV90eXBlLCANCiAgICAgICAgIGphbl90b19qdW4sIGp1bHksIA0KICAgICAgICAgYCVfb2ZfanVseWAgPSBwY19qdWx5LCANCiAgICAgICAgIHRvdGFsLCANCiAgICAgICAgIGAlX29mX3RvdGFsYCA9IHBjKSAlPiUgDQogIGFkb3JuX3RvdGFscygicm93IikgJT4lIA0KICBmbGV4dGFibGUoKSAlPiUgDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKHdpZHRoID0gLjg1KSAlPiUgDQogIHNldF9jYXB0aW9uKGNhcHRpb24gPSAiUGVyc29ucyByZWFjaGVkIGJ5IGJlbmVmaWNpYXJ5IHR5cGUsIGFzIG9mIDMxIEp1bHkgMjAyMiIpICU+JSANCiAgdGhlbWVfemVicmEoKQ0KICANCg0KYGBgDQoNCjxicj48YnI+PGJyPg0KDQoNCiMjIDYuIENvbXBhcmlzb24gd2l0aCB0YXJnZXRzDQoNCiMjIyA2LjEgUmVhY2hlZCB2cyB0YXJnZXQgYnkgdG93bnNoaXANCg0KVGhlIHNwZWNpZmljcyBvZiBlYWNoIHRvd25zaGlwIGNhbiBiZSByZXZpZXdlZCB3aXRoIHRoZSBpbnRlcmFjdGl2ZSBwbG90IGJlbG93LiBFYWNoIHBvaW50IGlzIGEgdG93bnNoaXAsIHdpdGggdGhlIHNpemUgaW5kaWNhdGluZyB0aGUgbnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMuIFRoZSB4LWF4aXMgaW5kaWNhdGVzIHRoZSB0YXJnZXQgcG9wdWxhdGlvbiBieSB0b3duc2hpcCBhbmQgdGhlIHktYXhpcyBzaG93cyB0aGUgbnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCwgYXMgb2YgMzEgSnVseSAyMDIyLg0KDQpUaGUgcmVkIGxpbmUgZG93biB0aGUgbWlkZGxlIHJlcHJlc2VudHMgcmVhY2hpbmcgMTAwJSBvZiB0aGUgdGFyZ2V0LiBUb3duc2hpcHMgYWJvdmUgdGhpcyBsaW5lIGhhdmUgcmVhY2hlZCBtb3JlIGJlbmVmaWNpYXJpZXMgdGhhbiB0aGVpciB0YXJnZXQgYW5kIHRvd25zaGlwcyBiZWxvdyB0aGUgbGluZSBoYXZlIG5vdCBtZXQgdGhlaXIgdGFyZ2V0IHlldC4gVGhlIGZ1cnRoZXIgYXdheSBhIHRvd25zaGlwIGlzIGZyb20gdGhlIHJlZCBsaW5lLCB0aGUgZnVydGhlciBhYm92ZSBvciBiZWxvdyBpdHMgdGFyZ2V0IGl0IGlzLiBNb3VzZSBvdmVyIGVhY2ggb2YgdGhlIHRvd25zaGlwcyB0byBzZWUgbW9yZSBkZXRhaWxzLg0KDQpUaGUgMTMgdG93bnNoaXBzIGFsb25nIHRoZSBleHRyZW1lIGxlZnQgc2lkZSBvZiB0aGUgcGxvdCBoYXZlIGJlbmVmaWNpYXJpZXMgYnV0IGRvIG5vdCBoYXZlIHRhcmdldHMgKHRoZWlyIHRhcmdldHMgaGF2ZSBqdXN0IGJlZW4gY29kZWQgYXMgMSBzbyB0aGF0IHRoZXkgc2hvdyB1cCBvbiB0aGUgcGxvdCkuIDE5OCB0b3duc2hpcHMgd2l0aCB0YXJnZXRzIGhhdmUgbm90IGJlZW4gcmVhY2hlZC4NCg0KYGBge3IgZXZhbCA9ICBGQUxTRX0NCjMzMCAtIChmc2MgJT4lIGRpc3RpbmN0KGFkbWluM19wY29kZSkgJT4lIG5yb3coKSkNCg0KDQpgYGANCg0KDQo8YnI+DQoNCmBgYHtyIHBsb3RseS10c3AtY29tcGFyaXNvbi1yZWFjaGVkLXRhcmdldH0NCg0KYmVuX3RhcmdldCA8LSBmc2MgJT4lIA0KICBncm91cF9ieShhZG1pbjNfcGNvZGUgPSBhZG1pbjNfcGNvZGVfb2xkKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKG5ld19iZW5lZmljaWFyaWVzKSwNCiAgICAgICAgICAgIHBhcnRuZXJzID0gbl9kaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lcikpICU+JSANCiAgbGVmdF9qb2luKHBpbiwgYnkgPSBjKCJhZG1pbjNfcGNvZGUiKSkgJT4lIA0KICBtdXRhdGUocmVhY2hlZF9wYyA9IGJlbmVmaWNpYXJpZXMgLyBmc190YXJnZXRlZCwNCiAgICAgICAgIHJlYWNoZWRfcGMgPSBpZmVsc2UoaXMuaW5maW5pdGUocmVhY2hlZF9wYyksIDEsIHJlYWNoZWRfcGMpLA0KICAgICAgICAgZnNfdGFyZ2V0ZWQgPSBpZmVsc2UoZnNfdGFyZ2V0ZWQgPT0gMCAmIGJlbmVmaWNpYXJpZXMgPiAwLCAxLCBmc190YXJnZXRlZCksDQogICAgICAgICBmc190YXJnZXRlZCA9IHJvdW5kKGZzX3RhcmdldGVkLCBkaWdpdHMgPSAwKSkgJT4lIA0KICBhcnJhbmdlKGRlc2MocmVhY2hlZF9wYykpICU+JSANCiAgbGVmdF9qb2luKGZzYyAlPiUgICAgICAgICAgIA0KICAgICAgICAgICAgICBmaWx0ZXIoanVseSA9PSAianVseSIpICU+JQ0KICAgICAgICAgICAgICBncm91cF9ieShhZG1pbjNfcGNvZGUgPSBhZG1pbjNfcGNvZGVfb2xkKSAlPiUNCiAgICAgICAgICAgICAgc3VtbWFyaXNlKA0KICAgICAgICAgICAgICAgIGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpLA0KICAgICAgICAgICAgICAgIHBhcnRuZXJzID0gbl9kaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lcikNCiAgICAgICAgICAgICAgKSAlPiUNCiAgICAgICAgICAgICAgbXV0YXRlKGp1bHkgPSAxKSAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChqdWx5LCBhZG1pbjNfcGNvZGUpLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIG11dGF0ZShqdWx5ID0gaWZlbHNlKGp1bHkgPT0gMSwgImp1bHkiLCAiamFuX3RvX2p1biIpKSAlPiUgDQogIHJlcGxhY2VfbmEobGlzdChqdWx5ID0gImphbl90b19qdW4iKSkgJT4lIA0KICBzZWxlY3Qoc3RhdGUsIHRvd25zaGlwLCANCiAgICAgICAgIGZzX3BpbiwgZnNfdGFyZ2V0ZWQsIA0KICAgICAgICAgYmVuZWZpY2lhcmllcywgcmVhY2hlZF9wYywgDQogICAgICAgICBwYXJ0bmVycywgDQogICAgICAgICBqdWx5KSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gZnNfdGFyZ2V0ZWQsIHkgPSBiZW5lZmljaWFyaWVzLCBjb2xvdXIgPSBqdWx5LCANCiAgICAgICAgICAgICB0ZXh0ID0gcGFzdGUwKHRvd25zaGlwLCAiLCIsICJcbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwgIiwiLCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgImJlbmVmaWNpYXJpZXM6ICIsIGNvbW1hKGJlbmVmaWNpYXJpZXMsIGFjY3VyYWN5ID0gMSksICJcbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0OiAiLCBjb21tYShmc190YXJnZXRlZCwgYWNjdXJhY3kgPSAxKSwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICIlIG9mIHRhcmdldDogIiwgcGVyY2VudChyZWFjaGVkX3BjLCBhY2N1cmFjeSA9IDIpLCAiXG4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJ0bmVyczogIiwgcGFydG5lcnMpKSkgKyANCiAgZ2VvbV9hYmxpbmUoaW50ZXJjZXB0ID0gMCwgc2xvcGUgPSAxLCBsdHkgPSAyLCBjb2xvdXIgPSAicmVkIikgKyANCiAgZ2VvbV9hYmxpbmUoaW50ZXJjZXB0ID0gLjUsIHNsb3BlID0gMSwgbHR5ID0gMiwgY29sb3VyID0gImdyZXkiLCBzaXplID0gLjQpICsgDQogIGdlb21fYWJsaW5lKGludGVyY2VwdCA9IC0uNSwgc2xvcGUgPSAxLCBsdHkgPSAyLCBjb2xvdXIgPSAiZ3JleSIsIHNpemUgPSAuNCkgKyANCiAgZ2VvbV9wb2ludChhZXMoc2l6ZSA9IGJlbmVmaWNpYXJpZXMpLCBhbHBoYSA9IDAuOCkgKw0KICBzY2FsZV9zaXplX2NvbnRpbnVvdXMoZ3VpZGUgPSAibm9uZSIpICsgDQogIHNjYWxlX3hfY29udGludW91cyh0cmFucyA9ICJsb2cxMCIsIGxhYmVscyA9IGNvbW1hKSArIA0KICBzY2FsZV95X2NvbnRpbnVvdXModHJhbnMgPSAibG9nMTAiLCBsYWJlbHMgPSBjb21tYSkgKw0KICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoIiNBRjdBQzUiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjRjFDNDBGIikpICsgDQogIGxhYnMoeCA9ICJUYXJnZXRlZCBwb3B1bGF0aW9uIiwgeSA9ICJCZW5lZmljaWFyaWVzIiwgDQogICAgICAgdGl0bGUgPSAiQmVuZWZpY2lhcmllcyByZWFjaGVkIHZzIHRhcmdldGVkIHBvcHVsYXRpb24gYnkgdG93bnNoaXAsIGFzIDMxIEp1bHkgMjAyMiIsDQogICAgICAgc3VidGl0bGUgPSAiVGhlIHJlZCBsaW5lIGlzIDEwMCUgb2YgdGFyZ2V0IiwgDQogICAgICAgY29sb3VyID0gIiIpICsgDQogIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNykpDQoNCmdncGxvdGx5KGJlbl90YXJnZXQsIHRvb2x0aXAgPSBjKCJ0ZXh0IiksIHdpZHRoID0gODIwLCBoZWlnaHQgPSA1MDApICU+JSANCiAgY29uZmlnKGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpICU+JSANCiAgbGF5b3V0KHRpdGxlID0gbGlzdCh0ZXh0ID0gDQogICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZTAoDQogICAgICAgICAgICAgICAgICAgICAgICAgICJCZW5lZmljaWFyaWVzIHZzIHRhcmdldCBieSB0b3duc2hpcCwgYXMgb2YgMzEgSnVseSAyMDIyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAiPHN1cD4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIHJlZCBsaW5lIGlzIDEwMCUgb2YgdGFyZ2V0OyBzaXplIHNob3dzIG51bWJlciBvZiBiZW5lZmljaWFyaWVzOyB5ZWxsb3cgdG93bnNoaXBzIHdlcmUgcmVhY2hlZCBpbiBKdWx5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIjwvc3VwPiINCiAgICAgICAgICAgICAgICAgICAgICAgICkpLA0KICAgICAgICAgbGVnZW5kID0gbGlzdChmb250ID0gbGlzdChzaXplID0gNykpKQ0KDQpgYGANCg0KPGJyPg0KDQpJbiBtb3N0IG9mIHRoZSB0b3duc2hpcHMgd2hlcmUgdGhlIGZvb2Qgc2VjdXJpdHkgY2x1c3RlciBpcyBwcmVzZW50LCB0aGUgbnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCBpcyB1bmRlciB0aGUgY2x1c3RlciB0YXJnZXQuIFRvd25zaGlwcyB3aGljaCBoYXZlIGJlZW4gaGVhdmlseSBvdmVyc3Vic2NyaWJlZCBoYXZlIGJlZW4gbGlzdGVkIGluIHRoZSBbc2Vjb25kIHF1YXJ0ZXIgNVdzIHJlcG9ydF0oaHR0cHM6Ly9mb29kLXNlY3VyaXR5LWNsdXN0ZXItbXlhbm1hci5naXRodWIuaW8vZnNjXzV3c19zZWNvbmRfcXVhcnRlcl8yMDIyLykuIA0KDQoNCjxicj48YnI+DQoNCiMjIyA2LjIgTWFwIG9mIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCBpbiBRMSAmIFEyIDIwMjIgdnMgdGFyZ2V0DQoNCmBgYHtyIG1hcHMtYmVuLXRhcmdldCwgZmlnLmhlaWdodD0xNH0NCmZzYyAlPiUgDQogIGZpbHRlcihqdWx5ID09ICJqdWx5IikgJT4lIA0KICBncm91cF9ieShhZG1pbjNfcGNvZGUgPSBhZG1pbjNfcGNvZGVfb2xkKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIHJpZ2h0X2pvaW4ocGNvZGUzX3NoYXBlLCBieSA9IGMoImFkbWluM19wY29kZSIpKSAlPiUgDQogIHN0X2FzX3NmKCkgJT4lIA0KICBnZ3Bsb3QoKSArDQogIGdlb21fc2YoYWVzKGZpbGwgPSBiZW5lZmljaWFyaWVzKSwgc2l6ZSA9IDAuMSkgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhkaXJlY3Rpb24gPSAtMSwgdHJhbnMgPSAibG9nMTAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygxMDAsIDEwMDAsIDEwMDAwLCAxMDAwMDAsIDUwMDAwMCksDQogICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGNvbW1hLCANCiAgICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JheTkwIiwgDQogICAgICAgICAgICAgICAgICAgICAgIGJlZ2luID0gLjMpICsgDQogIHRoZW1lX3ZvaWQoKSArDQogIHRoZW1lKGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksDQogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLA0KICAgICAgICBsZWdlbmQua2V5LnNpemUgPSB1bml0KDAuNywgJ2NtJyksIA0KICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIsIGNvbG91ciA9ICJ3aGl0ZSIpKSArDQogIGxhYnModGl0bGUgPSAiQmVuZWZpY2lhcmllcyBpbiBKdWx5IDIwMjIsIGJ5IHRvd25zaGlwIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJ0b3duc2hpcHMgaW4gZ3JleSBkbyBub3QgaGF2ZSBhbnkgcGFydG5lcnMgcHJlc2VudCIsIA0KICAgICAgIGZpbGwgPSAiQmVuZWZpY2lhcmllcyIpICsNCiAgDQpmc2MgJT4lIA0KICBncm91cF9ieShhZG1pbjNfcGNvZGUgPSBhZG1pbjNfcGNvZGVfb2xkKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIHJpZ2h0X2pvaW4ocGNvZGUzX3NoYXBlLCBieSA9IGMoImFkbWluM19wY29kZSIpKSAlPiUgDQogIHN0X2FzX3NmKCkgJT4lIA0KICBnZ3Bsb3QoKSArDQogIGdlb21fc2YoYWVzKGZpbGwgPSBiZW5lZmljaWFyaWVzKSwgc2l6ZSA9IDAuMSkgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhkaXJlY3Rpb24gPSAtMSwgdHJhbnMgPSAibG9nMTAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygxMDAsIDEwMDAsIDEwMDAwLCAxMDAwMDAsIDUwMDAwMCksDQogICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGNvbW1hLCANCiAgICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JheTkwIikgKyANCiAgdGhlbWVfdm9pZCgpICsNCiAgdGhlbWUobGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwNCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksDQogICAgICAgIGxlZ2VuZC5rZXkuc2l6ZSA9IHVuaXQoMC43LCAnY20nKSwgDQogICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiwgY29sb3VyID0gIndoaXRlIikpICsNCiAgbGFicyh0aXRsZSA9ICJCZW5lZmljaWFyaWVzIFRvdGFsIDIwMjIgYXMgb2YgMzEgSnVseSAyMDIyLCBieSB0b3duc2hpcCIsDQogICAgICAgc3VidGl0bGUgPSAidG93bnNoaXBzIGluIGdyZXkgZG8gbm90IGhhdmUgYW55IHBhcnRuZXJzIHByZXNlbnQiLCANCiAgICAgICBmaWxsID0gIkJlbmVmaWNpYXJpZXMiKSArDQpwaW4gJT4lIA0KICByaWdodF9qb2luKHBjb2RlM19zaGFwZSwgYnkgPSAiYWRtaW4zX3Bjb2RlIikgJT4lIA0KICBzdF9hc19zZigpICU+JSAgDQogIGdncGxvdCgpICsgDQogIGdlb21fc2YoYWVzKGZpbGwgPSBmc190YXJnZXRlZCksIHNpemUgPSAuMSkgKyANCiAgc2NhbGVfZmlsbF92aXJpZGlzX2MoZGlyZWN0aW9uID0gLTEsIHRyYW5zID0gImxvZzEwIiwgIA0KICAgICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKDEwMCwgMTAwMCwgMTAwMDAsIDEwMDAwMCwgNTAwMDAwKSwNCiAgICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gcmFuZ2UoNTcsIDgwMTc2MCksIA0KICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjb21tYSwgDQogICAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyYXk5MCIpICsgDQogIHRoZW1lX3ZvaWQoKSArIA0KICB0aGVtZShsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLA0KICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLA0KICAgICAgICAgIGxlZ2VuZC5rZXkuc2l6ZSA9IHVuaXQoMC43LCAnY20nKSwgDQogICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiwgY29sb3VyID0gIndoaXRlIikpICsNCiAgICBsYWJzKHRpdGxlID0gIlRhcmdldCBieSB0b3duc2hpcCIsDQogICAgICAgICBzdWJ0aXRsZSA9ICJ0b3duc2hpcHMgaW4gZ3JleSBkbyBub3QgZm9vZCBzZWN1cml0eSB0YXJnZXRzIiwgDQogICAgICAgICBmaWxsID0gInRhcmdldCIpICsgDQogIA0KcGluICU+JSANCiAgcmlnaHRfam9pbihwY29kZTNfc2hhcGUsIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSAgDQogIHN0X2FzX3NmKCkgJT4lIA0KICBnZ3Bsb3QoKSArIA0KICBnZW9tX3NmKGFlcyhmaWxsID0gZnNfcGluKSwgc2l6ZSA9IC4xKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhkaXJlY3Rpb24gPSAtMSwgdHJhbnMgPSAibG9nMTAiLCAgDQogICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGMoMTAwLCAxMDAwLCAxMDAwMCwgMTAwMDAwLCA1MDAwMDApLA0KICAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSByYW5nZSg1NywgODAxNzYwKSwgDQogICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGNvbW1hLCANCiAgICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JheTkwIikgKyANCiAgdGhlbWVfdm9pZCgpICsgDQogIHRoZW1lKGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksDQogICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksDQogICAgICAgICAgbGVnZW5kLmtleS5zaXplID0gdW5pdCgwLjcsICdjbScpLCANCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiLCBjb2xvdXIgPSAid2hpdGUiKSkgKw0KICAgIGxhYnModGl0bGUgPSAiUGVvcGxlIGluIE5lZWQgYnkgdG93bnNoaXAiLA0KICAgICAgICAgc3VidGl0bGUgPSAidG93bnNoaXBzIGluIGdyZXkgZG8gbm90IGZvb2Qgc2VjdXJpdHkgdGFyZ2V0cyIsIA0KICAgICAgICAgZmlsbCA9ICJQSU4iKQ0KICANCg0KIyBnZ3NhdmUoInRhcmdldF9ieV90c3AucG5nIiwgZHBpID0gMzAwLCBoZWlnaHQgPSAxOCwgd2lkdGggPSAxMSwgdW5pdHMgPSAiaW4iKQ0KDQoNCg0KYGBgDQoNCjxicj48YnI+PGJyPg0KDQojIyMgNi4zIEludGVyYWN0aXZlIHJlZmVyZW5jZSB0YWJsZQ0KDQpJbiB0aGUgaW50ZXJhY3RpdmUgdGFibGUgYmVsb3csIGlzIGEgbGlzdCBvZiB0b3duc2hpcHMgc29ydGVkIGJ5IHRoZSBnYXAgYmV0d2VlbiB0aGUgdGFyZ2V0ZWQgcG9wdWxhdGlvbiBhbmQgYmVuZWZpY2lhcmllcyByZWFjaGVkIGluIDIwMjIuIEFueSBvZiB0aGUgY29sdW1ucyBjYW4gYmUgc29ydGVkOyB0aGUgc2VhcmNoIGJhcnMgYWJvdmUgZWFjaCBjb2x1bW4gY2FuIGFsc28gYmUgdXNlZCB0byBmaWx0ZXIgZW50cmllcy4NCg0KPGJyPg0KDQpgYGB7cn0NCmZzYyAlPiUgDQogIGdyb3VwX2J5KGFkbWluM19wY29kZV9vbGQpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpLA0KICAgICAgICAgICAganVseV9iZW4gPSBzdW0obmV3X2JlbmVmaWNpYXJpZXNbanVseSA9PSAianVseSJdKSwgDQogICAgICAgICAgICBwYXJ0bmVycyA9IG5fZGlzdGluY3QoaW1wbGVtZW50aW5nX3BhcnRuZXIpKSAlPiUgDQogIHJpZ2h0X2pvaW4ocGluLCBieSA9IGMoImFkbWluM19wY29kZV9vbGQiID0gImFkbWluM19wY29kZSIpKSAlPiUgDQogIHJlcGxhY2VfbmEobGlzdChiZW5lZmljaWFyaWVzID0gMCwgDQogICAgICAgICAgICAgICAgICBqdWx5X2JlbmVmaWNpYXJpZXMgPSAwKSkgJT4lDQogIG11dGF0ZShyZWFjaGVkX3BjID0gYmVuZWZpY2lhcmllcyAvIGZzX3RhcmdldGVkLA0KICAgICAgICAgcmVhY2hlZF9wYyA9IGlmZWxzZShpcy5pbmZpbml0ZShyZWFjaGVkX3BjKSwgMSwgcmVhY2hlZF9wYyksDQogICAgICAgICByZWFjaGVkX3BjID0gcm91bmQocmVhY2hlZF9wYyAqIDEwMCwgZGlnaXRzID0gMiksIA0KICAgICAgICAgZnNfdGFyZ2V0ZWQgPSByb3VuZChmc190YXJnZXRlZCwgZGlnaXRzID0gMCksIA0KICAgICAgICAgZ2FwID0gZnNfdGFyZ2V0ZWQgLSBiZW5lZmljaWFyaWVzKSAlPiUgDQogIGFycmFuZ2UoZ2FwKSAlPiUgDQogIHNlbGVjdChzdGF0ZSwgdG93bnNoaXAsIHRhcmdldCA9IGZzX3RhcmdldGVkLCBiZW5lZmljaWFyaWVzLA0KICAgICAgICAganVseV9iZW4sIA0KICAgICAgICAgZ2FwLCBgJV9yZWFjaGVkYCA9IHJlYWNoZWRfcGMsIHBhcnRuZXJzKSAlPiUgDQogIGRhdGF0YWJsZShvcHRpb25zID0gbGlzdChwYWdlTGVuZ3RoID0gMTUsIHNjcm9sbFggPSBUUlVFKSwgDQogICAgICAgICAgICBmaWx0ZXIgPSBsaXN0KHBvc2l0aW9uID0gInRvcCIsIGNsZWFyID0gRkFMU0UpLA0KICAgICAgICAgICAgY2FwdGlvbiA9IGh0bWx0b29sczo6dGFncyRjYXB0aW9uKHN0eWxlID0gJ2NhcHRpb24tc2lkZTogdG9wOyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjpibGFjazsgZm9udC1zaXplOjEyMCUgOycsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVmZXJlbmNlIHRhYmxlIC0tIHRvd25zaGlwcyIpKSAlPiUgDQogIGZvcm1hdFJvdW5kKGMoInRhcmdldCIsICJiZW5lZmljaWFyaWVzIiwgImdhcCIpLCBkaWdpdHMgPSAwKSAlPiUgDQogIGZvcm1hdFN0eWxlKDAsIHRhcmdldCA9ICJyb3ciLCBsaW5lSGVpZ2h0ID0gIjgwJSIsIGZvbnRTaXplID0gIjgwJSIpDQoNCg0KDQpgYGANCg0KDQoNCg0K