Acronyms
CBT Cash-based Transfers
CCCM Camp Management and Camp Coordination
CSO Civil Society Organisation
CWG Cash Working Group
FAO Food and Agriculture Organisation
FSC Food Security Cluster
HNO Humanitarian Needs Overview
HRP Humanitarian Response Plan
IDP Internally Displaced Person
IERP Interim Emergency Response Plan
MEB Minimum Expenditure Basket
NFI Non-food Items
NNGO National Non-governmental Organisation
OCHA UN Office for the Coordination of Humanitarian Affairs
PIN People in Need
WFP World Food Programme


Introduction

This report is an overview of the initial observations and analysis performed on the Food Security Cluster 5Ws data for 2021; the issues identified and analysis have been broken into large groups corresponding with the first 4 chapters of the FSC 2021 5Ws matrix – geographical coverage, activities and modalities, partners and beneficiaries. This report ends with a brief section on next steps and an interactive reference table and interactive reference maps.

The FSC has endeavoured to provide actionable information and believe that releasing this report is a necessary part of jump-starting the process of resolving the more pressing concerns identified. Further analysis is merited in several areas; and this will be undertaken once consultations with partners have been completed. Unless otherwise specified, beneficiary figures in this report are unique beneficiaries, as opposed to beneficiary frequencies.



a. Summary of key findings

  • The 2021 response was skewed towards very few areas – Yangon and Rakhine form 78% of the beneficiaries reached, with 24% of all beneficiaries originate from Hlaingtharya township alone. The top 10 townships account for 76% of all beneficiaries reached.

  • Six of the eight Food Security activities (monthly food baskets, support for income generation, cash for work/food for assets, livestock kits, crop and vegetable kits and fishery kits) experienced large ramp ups in beneficiaries reached after the addition of the 2021 HRP addendum; but the caseloads for the provision of cash-based transfers and technical training were largely established prior to 2021 and only saw incremental increases in beneficiaries reached throughout the year.

  • 61% of beneficiary frequencies received support through the in-kind delivery modality; 25% of beneficiary frequencies were reached by cash transfers. Of beneficiaries who received cash transfers, 84% of them were reached through direct cash payments.

  • The most common transfer values – in terms of beneficiaries reached – are between USD 60 and 70 per month per household, it should also be noted that a not insignificant number of households (about 8%) were reached by cash transfer interventions valued at USD 100 per household or more. The highest average cash transfers were from the provision of livestock kits and the lowest averages from Cash for work/food for assets activities.

  • Around 60% of beneficiary households have received 50% or more of the Minimum Expenditure Basket (MEB) for food for the months they were covered. However, about 10% of all beneficiary households for monthly cash-based transfers received under USD 20 per month (less than 10% of the MEB) and 23% of households received between USD 20 and USD 40 (22% of the MEB).

  • There are a total of 71 FSC partners, 62 of whom reported achievements through the 5Ws. 27 partners classified themselves as reporting organisations, though 23 of these were also implementing partners.

  • Only 13 implementing partners have a presence in more than 5 townships, and only 8 have a presence in more than 10. 78% of partners are present in less than 5 townships. 34 implementing partners have reached less than 10,000 beneficiaries throughout 2021 and the median number of beneficiaries reached in this period by implementing partners is 6,118.

  • Age and sex-disaggregated beneficiary figures are one of the most key pieces of missing data in the 5W dataset. Values have been largely backfilled from census data and do not provide an accurate representation of the population reached.

  • 82.68% of beneficiaries are from the host/local community, 9.02% are stateless persons from Rakhine and 8.24% are IDPs. Returnees are the rarest type of beneficiary reached, forming only 0.07% of all beneficiaries reached.

  • 49% of beneficiaries of monthly activities experienced gaps or delays in monthly programming, with the most common delay being 3 months. Gaps in monthly programming were experienced in 39 townships, with the majority originating from Kachin, Ayeyarwady and Rakhine.

  • Food Security Cluster partners are not well-positioned to cover the 2022 population in need. Partners are largely concentrated in Kachin, Rakhine and Yangon, with only one partner present in Shan (East) and two in Tanintharyi. Overall, 58% of townships, containing 46% of the 2022 PIN, do not have any partners present.



1. Geographical coverage

1.1 Comparing beneficiaries reached and 2021 PIN by state and region

A total of 3,260,968 unique beneficiaries have been reached across the country, of which, 2,785,524 pertained to HRP and IERP activities and townships and 475,444 were non-HRP. Overall, 100.62% of the targeted 2,768,349 persons in the HRP/IERP were reached.




1.2 Table of beneficiaries and PIN by state and region

Beneficiaries reached (desc.) by state/region
state HRP_ben IERP_ben non_HRP_ben total_ben %_of_total_ben
Yangon 0 1,828,932 182,643 2,011,575 61.69
Rakhine 530,202 0 0 530,202 16.26
Mandalay 0 25,037 118,489 143,526 4.40
Ayeyarwady 0 66,432 33,049 99,481 3.05
Magway 0 7,645 89,122 96,767 2.97
Kachin 89,818 0 0 89,818 2.75
Shan (North) 53,733 4,954 14,416 73,103 2.24
Kayin 13,503 47,338 7,267 68,108 2.09
Mon 0 41,383 6,798 48,181 1.48
Sagaing 0 27,992 3,993 31,985 0.98
Kayah 0 16,457 1,289 17,746 0.54
Chin 9,726 7,279 0 17,005 0.52
Shan (South) 0 5,750 9,761 15,511 0.48
Bago (East) 4,357 0 8,617 12,974 0.40
Tanintharyi 0 4,476 0 4,476 0.14
Shan (East) 0 510 0 510 0.02
All beneficiaries have been included in this table, regardless of their inclusion in the HRP/IERP


The response is fairly skewed at the state/region level. Yangon and Rakhine form 78% of the beneficiaries reached. Beneficiaries from Rakhine were mostly associated with the HRP, whilst beneficiaries from Yangon were mostly associated with the IERP.

Rakhine remains a strategic priority for donors, year after year, as needs are still high and there is a particular interest in the Rohingya and other stateless persons. In addition, the number of persons living in camps remains high (140,525 persons according to the Shelter/NFI/CCCM Cluster, as of 16 February 2022).

When the IERP was established, under the leadership of OCHA, it was decided that a peri-urban reponse (principally in Yangon and Mandalay) would be at the core of this HRP addedndum. As a result, townships in Yangon massively “absorbed” this humanitarian assistance.



1.3 Township-level distribution of beneficiaries

Just as the response is heavily weighted towards Yangon and Rakhine at the state and region level, the same is also true at the township level. These 10 townships below are where 76% of all FSC beneficiaries are located:

Top 10 townships by beneficiaries reached (desc)
state township HRP_ben IERP_ben non_HRP_ben total_ben %_of_total_ben
Yangon Hlaingtharya 0 594,836 177,822 772,658 23.69
Other 141 townships 282,037 305,963 178,733 766,733 23.51
Yangon Shwepyithar 0 379,774 776 380,550 11.67
Yangon Dagon Myothit (Seikkan) 0 276,430 0 276,430 8.48
Yangon Dala 0 271,760 0 271,760 8.33
Yangon North Okkalapa 0 255,380 0 255,380 7.83
Rakhine Sittwe 149,885 0 0 149,885 4.60
Rakhine Buthidaung 147,985 0 0 147,985 4.54
Rakhine Maungdaw 121,432 0 0 121,432 3.72
Mandalay Nyaung-U 0 0 71,547 71,547 2.19
Mandalay Myingyan 0 42 46,566 46,608 1.43
All beneficiaries have been included in ‘total_ben’, regardless of their inclusion in the HRP/IERP


151 townships overall have been reached by food security activities in 2021, including non-HRP activities. This is 42.42% the 330 townships in the country. 140 townships have been reached by HRP/IERP activities.

The 2021 HRP was developed using a unit-based costing methodology, based on a formal assessment conducted by FAO/WFP. Targeting was based on the response capacity of FSC partners and costing was based on the average cost of implementation provided by mainly UN agencies and Cluster leads. The 2021 IERP followed a programme-based methodology consisting of scaling the response based on partner-submitted projects, based on orientation and guidance provided by the sectors/clusters. Submitted projects reflected partners’ response capacities.

Even though the IERP was validated by humanitarian partners, it was never enforced by the de-facto authorities. This limited the scope of work and the abilities of humanitarian actors to conduct in-depth vulnerability and needs assessments. It was then decided to treat township-level targets as the PIN in areas where the PIN had not been calculated. Finally, IERP humanitarian assistance also reached non-peri-urban townships for which no targets had been set.

To momentarily narrow down the focus to the 55 townships with specific HRP or IERP targets, there is substantial variance in the percentage of the target that has been reached. Hlaingtharya’s beneficiary figures are 378% of its established target, whereas Hpapun in Kayin and Kyethi in Shan had been targeted since the initial HRP and have not been reached by any FSC activities; additionally, Dagon Myothit (North) and Insein in Yangon and Chanayethazan in Mandalay were targeted in the IERP and also have not been reached.

Of these 55 townships, there were 28 townships where partners reached more than 120% of their target, 3 where they reached between 100% and 119% of their target; 4 townships where they reached between 80% and 100% of their target; and 15 townships where they reached less than 80% of their target.



The histogram above groups townships based on the percent of their target reached. The percentage reached is on the x-axis and the number of townships is on the y-axis. From a programme management perspective, it would be desirable to see the majority of townships within the yellow box (between 80% and 120% of the target reached), which would indicate the judicious deployment of resources. However, we see that both overreach and under-reaching are very common, with the largest numbers of townships clustered around 0% and 200% or more of the target reached.

Townships with low levels of achievement question FSC partners’ capacities while high levels of overreach suggest that:

  • Assumption 1: the HNO/HRP did not really inform about the real situation in those townships. Indeed, inputs mainly came from UN agencies and Cluster leads.

  • Assumption 2: the context may have changed during the year as the post-coup crisis progressed.

  • Assumption 3: FSC partners have limited capacities to adapt their programming (lack of flexibility and responsiveness).



1.4 Locations

Partners have responded in a total of 2,494 locations across the country, with the vast majority of locations only having only one partner operating in them; the maximum number of partners in any location is 4. Of the 16,041 rows reported in the 5Ws, only 211 did not report a specific location.

Locations are classified into three groups – camps, industrial zones and villages/towns/wards:

Summary of location types
location_type locations townships beneficiaries pc_of_ben avg_ben
village_ward_town 2,083 125 2,546,522 88.45 1,223
camp 435 42 324,606 11.27 746
industrial_zone 5 2 7,870 0.27 1,574
381,970 beneficiaries were reported in the 211 rows without specific locations


The vast majority of locations are served by only one partner. Below are a series of histograms showing the variation in the number of beneficiaries by location, split by number of partners in each location. Locations with one partner present have a large peak around 100 beneficiaries per locations; and a slight majority of locations with two partners have more than 1,000 beneficiaries.



In general, the more partners operating in a given location, the higher the average number of beneficiaries; however, it should be noted that these multi-partner locations are comparatively rare. The locations with four partners are Nam Hlaing in Bhamo, where it is suspected that the high number of partners is due to beneficiaries from this village participating in a range of activities and trainings held in the township seat, and Momauk Baptist Church, which is a camp location.

Average beneficiary frequencies in locations with one, two, three and four partners
number_of_partners locations avg_beneficiaries
one 2,429 389
two 206 3,973
three 30 5,787
four 2 13,154


When group by number of distinct FSC activities by location, it is observed that a majority of locations had only one FSC activity being implemented there. The spike in number of townships with 3 activities per location were mostly villages and towns in Ayeyarwady and Magway.



As expected, the higher number of FSC activities in a given location, the higher the number of beneficiary frequencies reached. The tow locations with 5 activities being implemented in them are a camp in Pauktaw and a village in Maungdaw. Once data from other Clusters is obtained, multi-sector coverage and interactions between activities should be explored.

Average beneficiary frequencies in locations with one, two, three, four and five activities
number_of_activities locations avg_beneficiary_frequencies
one 1,879 272
two 368 552
three 459 2,178
four 22 2,972
five 2 41,626




2. Activities and modalities

2.1 Monthly progress by activity



Six of the eight Food Security activities (monthly food baskets, support for income generation, cash for work/food for assets, livestock kits, crop and vegetable kits and fishery kits) experienced large ramp ups in beneficiaries reached after the addition of the 2021 IERP.

The plot above shows the FSC’s achievements across the eight 5W activities. The majority of the caseload for monthly cash-based transfers was established in early 2021 (with the number of beneficiaries only increasing very incrementally across the course of the year). This highlights two things:

  • Many projects contributing to this activity repeat year after year and had just been inserted into the HRP.

  • The operational constraints for the implementation of IERP assistance have pushed FSC partners to resort to more in-kind delivery as opposed to cash-based transfers (CBT), especially in peri-urban areas (Yangon and Mandalay). Cash availability after the coup and “instructions” from the de-facto authorities have limited the use of CBT: 99.7% of IERP beneficiaries in these two regions were reached through the in-kind modality.

The provision of technical training follows the same pattern (with its caseload being largely established in early 2021) as the IERP did not include this type of activity as it only includes lifesaving activities.

However, progress over time was also subject to the availability of funds and was also linked to seasonal calendars (i.e. agriculture). These two reasons limit the capacity of the FSC to reach more vulnerable persons. 2.8 million people received food assistance whilst only 500,000 received support for agriculture and livelihood activities.

It is also difficult to assess the impact of access on the progress of activities over time as many partners use flexible funding or because projects had been modified with donor approval.



2.2 Delivery modalities

Cash and in-kind distributions were each the main delivery modality in three activities. The provision of services and support being predominant in two. The in-kind modality has the highest reach (in terms of beneficiaries), given the especially large beneficiary numbers originating from the provision of monthly food baskets. Several misclassifications e.g. small portions of monthly cash transfers have been coded as “in-kind” and some in-kind food baskets were coded as “cash” and “hybrid”.

For more clarity, it will be worthwhile to better differentiate “support fo income generating activities” and the “provision of technical training” as these are, in many cases, provided in the frame of the same intervention.



61% of beneficiary frequencies received support through the in-kind service delivery. Beneficiary frequencies are used here as there were several instances of modalities changing partway through an intervention over the course of 2021. 25% of beneficiary frequencies were reached through cash transfers. However, these overall averages belie how very major differences in the types of delivery modalities employed during the HRP and the IERP.

With reference to the plot below, HRP beneficiaries were reached with a fairly even split between cash and in-kind modalities. However, under the IERP, the in-kind modality was, by far, the most common delivery mechanism used. This might not be in line with beneficiaries’ preferences on delivery mechanisms and may be a reflection of how delivery modalities were impacted by the dynamics of the conflict and the various contextual and administrative constraints.



Regarding the table above, there is a strong argument to remove the option “other” from the 5W column frequency (referring to frequency of transfer/delivery). What exactly it connotes is unclear, as partners might elect this option for activities that occur both more and less frequently than every month. There is also the possibility that partners are just electing “other” instead of leaving the column blank.


Beneficiary frequencies by delivery modalities and frequency of distribution
delivery_modality First Monthly One-off Other NA Total %Total
In-kind 303,595 1,850,712 509,892 2,773,854 111,839 5,549,892 61.36
Cash 894 1,923,133 176,464 40,274 117,525 2,258,290 24.97
Service delivery/support 773,212 128,852 4,901 767 907,732 10.04
Hybrid (In-kind & Cash) 295,312 2,938 10,810 309,060 3.42
Voucher 2,652 16,519 19,171 0.21
Total 304,489 4,842,369 820,798 2,846,358 230,131 9,044,145 100.00
Beneficiary frequencies reported without a delivery modality specified have been excluded


The “First” category does not really have much relation to the “Monthly” category, i.e. an increase in beneficiaries reported as “First” do not correspond to an increase in “Monthly” beneficiaries in the following months, meaning that these beneficiaries should fall under the “One-off” category. For non-monthly routine activities (agriculture, livelihoods), there is no relation “First” and the “Monthly” categories.

The column months_of_food_ration_distributed, but this column is largely blank and non-NA values have also not been filled well, meaning that a key piece of data – activity durations – has not been effectively captured. However, a workaround – requiring considerable effort, yields the table below, showing the average duration (in months) of the various activities classified as “Monthly” under the frequency column:

Average duration (in months) of monthly activities
activity avg_duration_months
Provide monthly cash-based transfers 7.42
Provide crops & vegetables kits 6.00
Provide support for income generation 5.99
Provide technical training 4.75
Provide monthly food baskets 4.27
Cash for Work / Food for Assets 2.13
Only ‘monthly’ activities included



2.3 Monetary values of intervention packages per household



The most common transfer values – in terms of beneficiaries reached – are between USD 60 and 70, it should also be noted that a not insignificant number of households (about 8%) were reached by cash transfer interventions valued at USD 100 per household or more (usually livelihoods interventions). It should also be noted that 35% of the households who received transfers values at below USD 40/month were the beneficiaries of the “hybrid” delivery modality, and the value of the in-kind goods they received have not been included in this sum as FSC partners have not provided the monetary values of in-kind activities. Please note that these monetary values were calculated only from unique beneficiary households and that these are not the cumulative sums per household.

Cash transfer, hybrid and voucher values per household, by cash delivery mechanism (USD)
cash_delivery_mechanism beneficiaries pc_of_ben households pc_of_hhd
Direct cash payment 262,432 87.22 57,002 85.59
E-voucher 7,296 2.42 3,448 5.18
E-transfer 12,013 3.99 2,394 3.59
Mobile money 8,935 2.97 1,830 2.75
Money Transfer Agent 8,755 2.91 1,448 2.17
Other 1,393 0.46 432 0.65
Paper voucher 48 0.02 48 0.07
Only households which were reached by cash, hybrid or voucher modalities are included


By far the most common cash delivery mechanism was direct cash payments – 85.59% of households were reached through this mechanism. Transfers made through Money transfer agents had the highest average transfer amount.

This next section highlights household package values by activity type:

Average value (USD) of household package values per activity
activity hhd_frequencies total_value_usd avg_transfer_value
Provide livestock kits 900 103,950 115.50
Provide support for income generation 14,785 1,566,514 105.95
Provide crops & vegetables kits 3,770 222,471 59.01
Provide monthly cash-based transfers 404,567 21,344,843 52.76
Provide fishery kits 200 8,174 40.87
Cash for Work / Food for Assets 28,582 964,382 33.74
Provide monthly food baskets 74,825 1,067,703 14.27
Only households which were reached by cash, hybrid or voucher modalities are included; extreme values filtered out


Overall, the highest average cash transfers were from the provision of livestock kits and the lowest averages from Cash for work/food for assets activities (after filtering out food baskets reported as cash). Please also note that for the table above, all per-household values above USD 1,000 per transfer have been filtered out as they are likely errors as they only pertain to cash for work / food for assets and monthly cash-based transfers.

These extreme values have not been filtered out for the table below of summary statistics for the different package values per activity. Of note, the standard deviations for cash for work/food for assets and income-generating activities are very high in comparison to the mean: both of these have extreme outliers in terms of package values.

Summary statistics of monetary values by activity; contains only data from activities using cash, hybrid or voucher modalities
activity households mean median sd aad
Provide livestock kits 900 115.50 115.50 0.00 0.00
Provide crops & vegetables kits 3,770 79.62 57.75 74.73 14.01
Provide support for income generation 9,249 79.52 21.00 162.22 10.38
Cash for Work / Food for Assets 14,024 79.22 40.17 109.78 41.91
Provide monthly cash-based transfers 43,142 51.13 59.06 27.70 21.91
Provide fishery kits 100 40.32 40.32 0.00
Provide monthly food baskets 4,213 20.35 10.75 19.65 12.82
SD (standard deviation), AAD (average absolute deviation)


But average package values are only part of the picture and significant variation in transfer values exists within each activity. Clear majorities of the households who benefited form cash transfers received values of between USD 60-70, while those who benefited from crop and vegetable kits received values between USD 50-60. This suggests that these activities could relatively standardised.



In this section, the FSC has tried to work around several data entry errors in the 5W reporting – the per household values of cash transfers have been recalculated using the number of households reached and the total value (in USD) of the cash transfers provided. Going forward, it is necessary to review and confirm these errors with partners and clean the 5W dataset as many of them have recorded cash transfer values of around USD 10.50 per household as opposed to our recalculated value which averages out at USD 63; it is suspected that the per beneficiary value may have been entered as opposed to the value per household.

These recalculated values have been used in the plot below, which summarises the per household per month value of the top 5 implementing (by beneficiaries reached) partners by activity, excluding livestock and fishery kits, which, as mentioned, do not have as much variation as the other activities:



The table below compares the different bins for cash-transfer values to the minimum expenditure basket for food established by the Cash Working Group (CWG) – they have set a floor of MMK 190,555 (or USD 114.55) per household per month:

Monthly cash-based transfer values by percentage of MEB received
usd_hhd_bin avg_pc_of_meb avg_usd_month households pc_of_hhd
<$10 6.11 7.00 542 1.26
>=$10_<$20 9.17 10.50 3,776 8.75
>=$20_<$30 18.33 21.00 6,376 14.78
>=$30_<$40 33.77 38.68 3,477 8.06
>=$40_<$50 36.69 42.03 5,062 11.73
>=$50_<$60 48.12 55.12 724 1.68
>=$60_<$70 55.00 63.00 19,849 46.01
>=$70_<$80 61.11 70.00 2,286 5.30
>=$80_<$90 73.33 84.00 16 0.04
>=$90_<$100 81.48 93.33 99 0.23
>=$100 91.66 105.00 935 2.17
Only households reached through monthly cash-based transfers are included


Overall, 60.17% of beneficiary households of cash-based transfers have received 50% or more of the MEB for the months they were covered.

It is important to keep in mind that humanitarian assistance aims to cover acute needs and that full/half rations are not necessarily intended to cover the full MEB and are instead focused on providing, totally or partially, 2,100 kcal/day per person each month. However, it is beneficial for the FSC to collect information about the percentage of the MEB that cash transfers and food basket distributions are intended to achieve.




3. Partners

The total number of FSC partners is 71, with the following breakdown:

FSC partners by type
type count
UN (including OCHA) 3
INGO 25
NNGO, CSO and Private sector 41
Research institutes 2
Total FSC partners 71


To follow-up on the food security situation in Myanmar and to provide valuable data and analysis to inform partners’ food security strategies and programming, the FSC is diversifying its network of partners. Even though not all of them are reporting achievements in the 5Ws.

A total of 62 FSC partners classified themselves as implementing partners within the 5Ws. They are fairly evenly split themselves between HRP indicators, with 36 contributing towards food and cash assistance and 39 contributing towards agriculture and other livelihood support. 34 partners have reached less than 10,000 unique beneficiaries and the median unique beneficiaries reached by partners is 6,118. Below are the top 10 partners by HRP indicator.

Top 10 implementing partners by beneficiaries reached, by HRP indicator
Partners HRP indicator1
  1. Number of people who received food and/or cash assistance
Partners HRP indicator2
  1. Number of people who received agriculture and other livelihood support
MRCS 640,223 CESVI Foundation 196,869
Open Data Myanmar (ODM) 400,933 Center for Social Integrity (CSI) 84,427
Zigway 223,478 Helen Keller International 57,287
Hlaingthayar Development Network 204,275 Action for Green Earth 29,425
Urban Strength (US) 201,732 Action Contre la Faim 23,128
World Vision Myanmar 180,741 People for People 18,273
WFP 110,235 World Vision Myanmar 18,040
Hlaingthayar Youth Network 96,145 Myanmar Heart Development Organization 11,170
Myanmar Heart Development Organization 70,664 Da-Nu National Affairs organization (DNAO) 9,266
Karuna Mission Social Solidarity 70,014 WFP 8,061
Figures reflect beneficiaries reached through direct implementation



3.1 Distribution of partners by beneficiaries and geographic reach

Whilst there is quite a bit of variation in the number of beneficiaries reached, FSC partners’ geographic footprints are quite limited. Only 8 partners have a presence in more than 10 townships, and only 13 are present in more than 5 townships. 78% of FSC partners (clustered along the bottom of the chart) are present in 5 or less townships. This distribution of partners is an impediment to a countrywide response and it is imperative to understand how:

  • To incentivise partners to expand their footprints

  • the FSC can identify new partners to reach vulnerable persons in areas recently affected by conflict

  • To encourage donors to support expansion of Food Security activities in areas recently affected by conflict (with sufficient support costs)



In terms of activities, 37 partners (60% of partners reporting in 5Ws) are implementing only one type of activity. Only one partner (World Vision Myanmar) is responding across 6 activities. This indicates that the food security support provided to beneficiaries is far from comprehensive and does not help beneficiaries achieve a sustainable and clear positive food security status.

Number of implementing partners by number of distinct activities being implemented
number_of_activities partners beneficiaries pc_of_beneficiaries
1 37 1,446,837 44.37
2 8 922,876 28.30
3 8 193,649 5.94
4 5 306,312 9.39
5 3 192,548 5.90
6 1 198,746 6.09



3.2 Monthly progress by partner



The plot above shows the top 20 partners by number of beneficiaries reached in 2021, with the red line indicating June 2021, when the IERP was approved and published. Overall, the IERP had a very large effect on the number of beneficiaries reached. Most partners enacted a significant ramp up and reached the majority of beneficiaries after it was published. Exceptions to this include organisations such as CESVI, Helen Keller International, Save the Children and Myanmar Heart Development Organisation, who established most of their caseload prior to July 2021.

As a note, it was difficult to determine which actions implemented were linked to funds secured after the publication of the IERP. The next chapter will explore the effect the IERP had on persons reached by beneficiary type. Progress is also subject to the availability of funds and are also linked to seasonal calendars (e.g. agriculture).



3.3 Types of implementing partners

Average reach by implementing partner type
implementing_partner_type avg_beneficiaries avg_townships avg_states
INGO 40,857 7.58 2.63
NNGO 60,029 3.03 1.21
other 42,642 1.00 1.00
UN 118,296 32.00 8.00
Figures are averages reached by direct implementation


NNGOs, on average, tended to reach more beneficiaries than INGOs, though INGOs tended to have a much wider geographic reach than NNGOs, perhaps due to them having more sub-offices. There is only one agency mentioned under the “UN” category – WFP. The “other” category refers to two private limited companies which also implemented food security activities.



3.4 Reporting organisations

Once the instances where the reporting organisation and the implementing partner were the same organisation were filtered out, all the remaining implementing partners correspond to just 11 reporting organisations:

Number of implementing partners by reporting organisation
reporting_organization implementing_partners
WFP 25
FAO 6
Finn Church Aid 4
Save the Children 4
Cordaid 2
Mercy Corps 2
Trocaire 2
AVSI 1
Danish Refugee Council 1
Helvetas 1
Oxfam 1


This report has used implementing_partners for most of the analysis as, by their nature, reporting organisations do not necessarily have a field presence. As a side note, FAO has not been classified as an implementing partner. No direct implementation was reported by them.



3.5 Donors

69% of the rows had the donor column filled. However, this only represents activities reaching 23% of all beneficiaries. Below is a table of the 10 donors (after organisations using their own resources) whose funding has reached the most beneficiaries and the number of townships their funding has been used in:

Top 10 donors by number of beneficiaries reached with their funding
donor beneficiaries pc_of_ben townships
Organizational own funds 191,006 5.86 36
UNDP 118,113 3.62 2
humanitarian Assitance and resilience Programme 87,502 2.68 7
AICS 63,986 1.96 5
MHF 61,056 1.87 11
King Philanthropies 57,287 1.76 7
ECHO 26,789 0.82 3
FCDO 23,282 0.71 3
LIFT 18,958 0.58 9
European Union (EU) 13,882 0.43 4
HELVETAS 13,851 0.42 6
77% of all beneficiaries (2,513,026 persons) were reported with the donor column left blank


Additionally, numerous errors have also been observed, including cases where multiple donors have been combined into one row as well as numerous instances where UNDP, WFP, FAO and UN WOMEN were classified as donors as opposed to reporting organisations. Helvetas should also probably have reported under “organisations using their own funds”.




4. Beneficiaries

4.1 Beneficiary disaggregation

Currently, in the 5Ws, the vast majority of beneficiary diasaggregations have been backfilled from census data and do not, consequently, provide an accurate picture of the population that have been reached by Food Security interventions. It is not possible to determine how far reality diverges from what has been reported so far – meaning that it cannot be determined if there has been any bias in beneficiary selection and targeting. It is imperative to begin collecting disaggregated beneficiary data from partners.

Most FSC partners only report the age and sex of the specific person receiving the assistance (not necessarily the head of household). The FSC and donors expect complete reporting of gender and age compositions of beneficiary households.

It is possible that partners are collecting this data. Disaggregated beneficiary data is commonly needed for internal and external reporting. The FSC will work with its partners to strengthen their data collection system to ensure that reported data meets international standards.

It is estimated that 56.06% of beneficiaries reported in the 5Ws have been “disaggregated” by backfilling values from the census. This has been calculated by comparing the proportions of age and sex disaggregations to the national values set out in the 2021 population projections – values within 5% of the national proportions have been considered as backfilled from the census.

The plot below shows the differences between the breakdown of beneficiaries by disaggregation group when only considering values that have not been backfilled from the census against all values reported in the 5W dataset. This corresponds to 43.94% of reported beneficiaries. It can be observed that adult females are actually the largest group of beneficiaries when looking at “actual” values. Additionally, the proportions of the beneficiary population who are elderly are far lower than what has been reflected in the majority of data reported in the 5Ws.



This was confirmed by examining the distributions of beneficiary disaggregations by implementing partner. From the plot below, it is observed that the majority of disaggregated values were very close to the mean for the entire group. To explain: if partner A reported that 40% of the beneficiaries of an activity were adult females, this percentage was then compared to the mean percentage of beneficiaries formed by adult females for all the other activities reported by that partner. This measures whether or not the same proportions were just copied and pasted throughout the 5W beneficiary disaggregation columns – it is extremely unlikely that these percentages would be similar across activities as implementing partners worked in an average of 50.03 locations. This level of variability is much lower than what exists in the general population.




4.2 Types of beneficiaries

Overall, 82.68% of beneficiaries are from the host/local community, 9.02% are stateless persons from Rakhine and 8.24% are IDPs. Returnees are the rarest type of beneficiary reached, forming only 0.07% of all beneficiaries reached.

Breakdown of beneficiary types by response plan
beneficiary_type hrp ierp non_hrp total_beneficiaries pc_of_ben
Host/local Community 198,787 2,028,976 468,247 2,696,010 82.68
Internally Displaced 207,026 54,419 7,197 268,642 8.24
Rakhine stateless 293,992 293,992 9.02
Returnees 1,534 790 2,324 0.07


The states and regions in which the FSC is working the most with IDPs are Chin, Kachin, Sagaing and Shan (North) and Kayah:

Percentage breakdown of beneficiary types by state/region
state Host/local Community Internally Displaced Returnees Rakhine stateless beneficiaries
Ayeyarwady 100.00 99,481
Bago (East) 66.42 33.31 0.27 12,974
Chin 7.35 92.65 17,005
Kachin 7.68 90.65 1.67 89,818
Kayah 46.88 53.12 17,746
Kayin 67.37 32.63 68,108
Magway 99.03 0.97 96,767
Mandalay 100.00 143,526
Mon 92.50 5.88 1.62 48,181
Rakhine 34.39 10.16 55.45 530,202
Sagaing 25.29 74.71 31,985
Shan (East) 100.00 510
Shan (North) 26.44 73.56 73,103
Shan (South) 100.00 15,511
Tanintharyi 95.64 4.13 0.22 4,476
Yangon 100.00 2,011,575
Total 82.68 8.24 0.07 9.02
Each row in the table shows the percentage of each beneficiary type within each state/region


Compared to only the 2021 HRP targets (as the IERP does not have breakdowns of the target by beneficiary type), beenficiary type targets have been mostly exceeded, neither the targets for returnees/resettled in Kachin or Shan (North) nor targets for IDPs in Rakhine have been met. Interestingly, for Rakhine, the targets for the host/local population have been greatly exceeded and various assumptions can be formulated regarding this:

  • There was better integration of the host population into relief programming
  • There was sufficient availability of funds to cover the food needs of IDPs
  • The relative stability of the Rakhine state context discourages donors from supporting emergency relief activities for the stateless population there
  • Funds from development donors are also available in Rakhine state

In Bago (East), Chin, Kayin and particularly Shan (North), the targets for IDPs have been greatly exceeded, in comparison to the 2021 HRP targets.

Percentage of 2021 HRP target reached by beneficiary type
state host_local% idp% returnees% rakhine_stateless% total%
Bago (East) 171.99 173.38
Chin 0.00 200.74 156.95
Kachin 88.67 110.36 32.88 104.30
Kayin 168.08 196.98
Rakhine 409.86 32.71 105.75 108.83
Shan (North) 135.56 751.31 0.00 400.17
Shan (South) 0.00 0.00
Only HRP/IERP beneficiaries have ben included


Unfortunately, the FSC monitoring system does not allow for the categorisation of FSC beneficiaries according to their food security status (moderately or severely food insecure). This limitation does not allow the FSC to determine whether the most vulnerable households were reached by food security assistance. The FSC will strive to bridge this gap in 2022 by:

  • Enquiring about FSC partners’ beneficiary selection criteria and food security status assessments
  • Developing a common food security data collection system
  • Exploring new options for food security assessments (satellite photos, outsourcing assessments to external partners, third-party monioring, etc.)



4.3 Monthly progress by beneficiary type



A significant increase in the numbers of persons in the host/local community reached after June 2021 has been noted. Almost all host/local community beneficiaries were reached after the publication of the HRP addendum. Conversely, the progress amongst stateless persons in Rakhine slowed substantially after the publication of the addendum. The IERP response mainly focused on peri-urban areas in Yangon and Mandalay: these beneficiaries represented almost 2.1 million out of the 2.8 million persons reached in 2021.

The context in Rakhine state has remained stable since the coup, with no major increase in conflict events. Consequently, food security assistance in Rakhine has followed the original food security programming, as laid out in the 2021 HRP. Regarding IDPs (8% of the caseload) and Returnees (0.07% of the caseload), it is difficult to measure the impact of the IERP on reaching these vulnerable groups.

In September 2021, during the preparation of the Humanitarian Needs Overview, OCHA calculated the number of IDPs in Myanmar at 548,070 persons. For 2022, this population has been classified as severely food insecure. This means that the FSC must strive to reach this vulnerable group. In 2021, only 49% of IDPs were reached.

Beneficiaries from the host/local community formed 28% of the beneficiaries under the HRP, but 97% of IERP beneficiaries. IDPs formed 29.5% of HRP beneficiaries, but only 3% of IERP beneficiaries. Stateless persons in Rakhine were only supported under the HRP as the IERP did not target Rakhine state.


Beneficiaries reached by type, by response plan
beneficiary_type HRP IERP non_HRP %_of_HRP %_of_IERP %_of_nonHRP
Host/local Community 198,787 2,028,976 468,247 28.34 97.35 98.49
Rakhine stateless 293,992 41.92
Internally Displaced 207,026 54,419 7,197 29.52 2.61 1.51
Returnees 1,534 790 0.22 0.04



4.4 Gaps in monthly programming

Number of beneficiaries and locations by duration of gaps in implementation
gap_months locations townships beneficiaries pc_of_ben
0 282 35 457,448 51.48
1 49 21 72,929 8.21
2 123 22 64,222 7.23
3 406 12 236,978 26.67
4 8 5 8,485 0.95
5 9 5 28,195 3.17
8 1 1 20,393 2.29
Only beneficiaries of monthly activities that recurred at least once are included


48.5% of beneficiaries of monthly activities experienced gaps or delays in monthly programming, with the most common delay being 3 months. The 8-month delay was the provision of monthly food baskets in Buthidaung, where distributions only occurred in February and November 2021. The 5-month delays were all from locations in Rakhine and Kachin. Overall, gaps in monthly programming were experienced in 39 townships, with the majority originating from Kachin, Ayeyarwady and Rakhine.

Getting approvals for interventions and travel authorisations have significantly impeded the provision of assistance to vulnerable persons in Myanmar.

There are 274 entries coded as being implemented on a monthly basis that have not recurred – that is, they have only been implemented once according to what has been reported in the 5Ws. The FSC needs to check with partners if these are merely the first instances of these activities, or if there have been issues with access, security or funding or if they are errors in data entry .



4.5 Potential for post-distribution monitoring

The table below shows activities which have been implemented for 6 months or more, the number of locations they were implemented in and the number of unique beneficiaries reached by activities meeting these criteria. The possibility of joint monitoring – or at least the joint review and analysis of monitoring data – should be explored, in consultation with these partners. The rationale being that 6 months of implementation should be a long enough period of time to make impact monitoring feasible. Additionally, joint monitoring will be further facilitated by the similarity of these activities, almost all of which are recurrent cash transfers or distributions of food baskets.

Number of beneficiaries, by activity, who have received at least 6 months of recurrent food security support
activity partners locations beneficiaries
Provide monthly cash-based transfers 7 233 195,942
Provide monthly food baskets 7 44 147,819
Provide technical training 2 413 57,887
Provide crops & vegetables kits 1 406 57,287
Provide support for income generation 1 407 57,287
Cash for Work / Food for Assets 1 1 245
Only includes beneficiaries (not unique but maximum by location by activity) who have received more than 6 months of support


These are the partners who have implemented monthly food baskets and monthly cash-based transfers for more than 6 months:

Partners who have implemented cash transfers and food baskets for at least 6 months
implementing_partners Provide monthly cash-based transfers Provide monthly food baskets
Karuna Mission Social Solidarity 53,244 85
Myanmar Heart Development Organization 30,185 57,638
People for People 23,982
Plan International 37,657
Save the Children 144
WFP 39,192 42,002
World Vision Myanmar 11,538 19,559
Action for Green Earth 18,755
People Hope Community Development (PHCD) 8,872
Together for Sustainable Development 908
Only includes beneficiaries (not unique but maximum by location by activity) who have received more than 6 months of support




5. Coordination challenges and localisation

5.1 Coordination challenges

The FSC coordination architecture, along with those of the other clusters, has been designed to support the deployment of humanitarian assistance in a limited number of states and regions. Throughout 2021, in spite of the expansion of conflict after the coup, humanitarian action remained largely limited to hubs centred around Rakhine (Central and northern Rakhine), Kachin and northern Shan, whilst humanitarian needs emerged in central, north-western and south-eastern Myanmar.

The current sub-national coordination architecture is an impediment to the deployment of humanitarian assistance in areas newly affected by conflict. Coordination in these areas is necessary to closely monitor the deterioration of the humanitarian situation and coordinate appropriate responses with short notice. Coordination in these areas newly affected by conflict is also necessary to identify new partnerships, especially with NNGOs and CSOs.



5.2 Localisation

The lack of ownership of coordination structures and processes by NNGOs and CSOs is a serious challenge at the national level. Many local partners prefer to coordinate only at the sub-national level. The two main limitations are:

  • English is the main language during FSC national meetings
  • Local partners tend to prefer maintaining a low profile

It is important for the FSC to better integrate local partners into its coordination mechanisms and structures as they are the last-mile service providers in this humanitarian response.

Despite the FSC providing an interepreter in its national coordination meetings, the participation of national partners remains limited. The FSC will consider the translation of key documents into Myanmar and other local languages.

The FSC is also exploring the appointment of a national partner, at national level, who will be the focal point for NNGOs and CSOs. This will allow for more direct communication with local partners to:

  • better monitor the situation on the ground
  • build local partners’ ownership of national FSC coordination processes and structures




6. Perspective for 2022

6.1 Positioning for 2022

The PIN for 2022 is much more evenly spread across the country than it was in 2021: with reference to the plot below, Magway and Mandalay have some of the lowest proportions of vulnerable persons in relation to the total state population, meaning that careful beneficiary selection, tight vulnerability criteria and the analysis of food security status will necessary to avoid excessive inclusion errors.

However, the PIN and severity status has been estimated based on data collected in August and September through a WFP/FAO assessment. As the situation in the field remains volatile, it is necessary for FSC partners to collect evidence of any changes that may affect the food security of affected persons.



The average percentage of a state’s PIN that is included in the target is 22.18%. Though there are some very notable exceptions at both the superior and inferior ends of the scale:



Food Security Cluster partners are not well-positioned to cover the 2022 population in need and targets. Partners are largely concentrated in Kachin, Rakhine and Yangon, with only one partner present in Shan (East) and two in Tanintharyi.

Overall, 57% of townships, containing 48% of the 2022 target, do not have any partners present. This lack of nationwide coverage will be one of the most important constraints that the FSC will face in meeting the 2022 needs of vulnerable, food insecure persons, including IDPs. Resolving this will necessitate both increasing partner coverage, finding new partners for the cluster as well as securing sufficient funding.

This mismatch between existing partner footprints and the PIN for 2022 highlights the need for more dedicated field-level coordination. This will be necessary to reach out to new partners and encourage existing partners to expand their operations. Strengthened inter-cluster coordination will also be key to ensure that the needs of persons in need are being met in a comprehensive manner. Fore reference, please also find below maps comparing the number of beneficiaries reached in 2021 and FSC targets for 2022.



6.2 Next steps

  1. Communicate to partners that Yangon has been heavily supported by humanitarian assistance in comparison to the rest of the country, with this coverage being particularly heavy in Hlaingtharya, Shwepyithar, Dagon Myothit (Seikkan), Dala and North Okkalapa townships.

  2. Develop, with FSC partners, standardised packages for the various types of food security assistance. Support the review of food baskets for the compliance with the standard of 2,100 kcal/person/day.

  3. Perform additional analysis to understand if beneficiaries in close proximity to each other have received widely divergent package values or not.

  4. Identify, with FSC partners, why cash transfer values vary even the same activity implemented by the same partner.

  5. Review areas which have only received smaller supplementary transfers. Transfers covering a low percentage of the MEB cannot be considered to have met food security needs unless they were provided along with sufficient in-kind support or in coordination with other partners to cover the gap.

  6. Advocate for the expansion of partners’ geographic footprints to reach the remaining 179 townships which have yet to benefit from any FSC activities. Even though food security needs remain high in “traditional” HRP areas, food security assistance in the “newly” affected areas are an urgent need. FSC has started flagging this situation to the the FSC lead agencies, FSC partners, OCHA and donors.

  7. Collect 5W data from other clusters so that multi-sector coverage may be reviewed. Clean and process conflict data so that it may be cross-referenced with partners’ coverage. Share raw data with other Clusters to improve coordination.

  8. Work with partners to determine their current capacities to submit age and sex-disaggregated beneficiary data at a household level. Develop a workplan to ensure that they can meet reporting requirements.

  9. Solicit monitoring reports from partners, explore the possibility of joint monitoring and determine the extent to which the food security status (moderately and severely food insecure) of beneficiaries can be identified.

  10. Revise the 5W template – in consultation with partners – in order to address the data collection issues identified.

  11. Develop the FSC’s coordination capacities at sub-national level.

  12. Develop local partners’ (NNGOs, CSOs) ownership of FSC coordination mechanisms and structures and provide key FSC documents in Burmese and other local languages.




7. Reference table – townships

The reference table below may be sorted and filtered by any of the columns.




8. Interactive reference maps

Click here to load maps. This might take some time as the files are quite large.

LS0tDQp0aXRsZTogIkluaXRpYWwgb2JzZXJ2YXRpb25zIG9uIHRoZSAyMDIxIE15YW5tYXIgRm9vZCBTZWN1cml0eSBDbHVzdGVyIDVXcyINCmF1dGhvcjogIk15YW5tYXIgRm9vZCBTZWN1cml0eSBDbHVzdGVyIg0KZGF0ZTogIjA0LzAyLzIwMjIiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgdGhlbWU6IHJlYWRhYmxlDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogbm8NCiAgICBjb2xsYXBzZWQ6IG5vDQphbHdheXNfYWxsb3dfaHRtbDogeWVzDQotLS0NCg0KYGBge2NzcywgZWNobz1GQUxTRX0NCg0KI1RPQzo6YmVmb3JlIHsNCiAgY29udGVudDogIiI7DQogIGRpc3BsYXk6IGJsb2NrOw0KICBoZWlnaHQ6IDcwcHg7DQogIG1hcmdpbjogMmVtIDIwcHggNDBweCAyMHB4Ow0KICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIk15YW5tYXJfY2x1c3Rlcl9ibHVlLnBuZyIpOw0KICBiYWNrZ3JvdW5kLXNpemU6IGNvbnRhaW47DQogIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXI7DQogIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7DQp9DQpgYGANCg0KYGBgez1odG1sfQ0KPHN0eWxlPg0KICAgIGJvZHkgLm1haW4tY29udGFpbmVyIHsNCiAgICAgICAgbWF4LXdpZHRoOiAxMjgwcHg7DQogICAgfQ0KPC9zdHlsZT4NCmBgYA0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UsIGZpZy53aWR0aD05LCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmc9RkFMU0UpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShsdWJyaWRhdGUpDQpsaWJyYXJ5KHN0cmluZ2kpDQpsaWJyYXJ5KHBhbmRlcikNCmxpYnJhcnkoamFuaXRvcikNCmxpYnJhcnkoZnV6enlqb2luKQ0KbGlicmFyeShzY2FsZXMpDQpsaWJyYXJ5KG1hZ3JpdHRyKQ0KbGlicmFyeShzZikNCmxpYnJhcnkoczIpDQpsaWJyYXJ5KGJvb2tkb3duKQ0KbGlicmFyeShkYXRhLnRhYmxlKQ0KbGlicmFyeShnZ3NmbGFiZWwpDQpsaWJyYXJ5KHBhdGNod29yaykNCmxpYnJhcnkocGxvdGx5KQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KbGlicmFyeShEVCkNCmxpYnJhcnkodmlyaWRpcykNCmxpYnJhcnkodGlueXRleCkNCg0KDQp0aGVtZV9zZXQodGhlbWVfbGlnaHQoKSkNCg0KIyBkaXNhYmxpbmcgc2NpZW50aWZpYyBub3RhdGlvbg0Kb3B0aW9ucyhzY2lwZW4gPSAxMDApDQoNCiMgcGFuZGVyIHRhYmxlcyBhbGwgaW4gb25lIHJvdw0KcGFuZGVyT3B0aW9ucygndGFibGUuc3BsaXQudGFibGUnLCBJbmYpDQoNCiMgcGFuZGVyIHRob3VzYW5kcyBzZXBhcmF0b3INCnBhbmRlck9wdGlvbnMoImJpZy5tYXJrIiwgIiwiKQ0KDQojIHJlcGxhY2UgDQpvcHRzIDwtIG9wdGlvbnMoa25pdHIua2FibGUuTkEgPSAiIikNCg0KYCVvdXQlYCA8LSBOZWdhdGUoYCVpbiVgKQ0KDQojIGZ1bmN0aW9uIGZvciB0cmFuc3Bvc2luZyBkZg0KdHJhbnNwb3NlX2RmIDwtIGZ1bmN0aW9uKGRmKSB7DQogIHRfZGYgPC0gZGF0YS50YWJsZTo6dHJhbnNwb3NlKGRmKQ0KICBjb2xuYW1lcyh0X2RmKSA8LSByb3duYW1lcyhkZikNCiAgcm93bmFtZXModF9kZikgPC0gY29sbmFtZXMoZGYpDQogIHRfZGYgPC0gdF9kZiAlPiUNCiAgICB0aWJibGU6OnJvd25hbWVzX3RvX2NvbHVtbiguZGF0YSA9IC4pICU+JQ0KICAgIHRpYmJsZTo6YXNfdGliYmxlKC4pDQogIHJldHVybih0X2RmKQ0KfQ0KDQojIGZ1bmN0aW9uIGJlbmVmaWNpYXJ5IHN1bW1hcmllcw0Kc3VtX2JlbiA8LSBmdW5jdGlvbihkZiwgY29sdW1uX3Zhcil7DQogIA0KICBjb2x1bW5fdmFyIDwtIGVucXVvKGNvbHVtbl92YXIpDQogIA0KICBkZiAlPiUNCiAgICBncm91cF9ieSghIWNvbHVtbl92YXIpICU+JSAjIG11c3QgYWRkIGJhbmctYmFuZw0KICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogICAgYXJyYW5nZShkZXNjKGJlbmVmaWNpYXJpZXMpKQ0KICAgIA0KfQ0KDQojIGZ1bmN0aW9uIGJlbmVmaWNpYXJ5IHN1bW1hcmllcywgMiBncm91cGVkIHZhcmlhYmxlcw0Kc3VtX2JlbjIgPC0gZnVuY3Rpb24oZGYsIGNvbHVtbl92YXIxLCBjb2x1bW5fdmFyMil7DQogIA0KICBjb2x1bW5fdmFyMSA8LSBlbnF1byhjb2x1bW5fdmFyMSkNCiAgY29sdW1uX3ZhcjIgPC0gZW5xdW8oY29sdW1uX3ZhcjIpDQogIA0KICBkZiAlPiUNCiAgICBncm91cF9ieSghIWNvbHVtbl92YXIxLCAhIWNvbHVtbl92YXIyKSAlPiUgIyBtdXN0IGFkZCBiYW5nLWJhbmcNCiAgICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSkgJT4lIA0KICAgIGFycmFuZ2UoZGVzYyhiZW5lZmljaWFyaWVzKSkNCiAgICANCn0NCg0KcmV2bG9nX3RyYW5zIDwtIGZ1bmN0aW9uKGJhc2UgPSBleHAoMSkpew0KICAgICMjIERlZmluZSB0aGUgZGVzaXJlZCB0cmFuc2Zvcm1hdGlvbi4NCiAgICB0cmFucyA8LSBmdW5jdGlvbih4KXsNCiAgICAgICAgICAgICAgICAgLWxvZyh4LCBiYXNlKQ0KICAgICAgICAgICAgICAgIH0NCiAgICAjIyBEZWZpbmUgdGhlIHJldmVyc2Ugb2YgdGhlIGRlc2lyZWQgdHJhbnNmb3JtYXRpb24NCiAgICBpbnYgPC0gZnVuY3Rpb24oeCl7DQogICAgICAgICAgICAgICAgIGJhc2VeKC14KQ0KICAgICAgICAgICAgICAgIH0NCiAgICAjIyBDcmVhdGVzIHRoZSB0cmFuc2Zvcm1hdGlvbg0KICAgIHRyYW5zX25ldyhwYXN0ZSgicmV2bG9nLSIsIGJhc2UsIHNlcCA9ICIiKSwNCiAgICAgICAgICAgICAgdHJhbnMsICMjIFRoZSB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbiAoY2FuIGJlIGRlZmluZWQgdXNpbmcgYW5vbnltb3VzIGZ1bmN0aW9ucykNCiAgICAgICAgICAgICAgaW52LCAgIyMgVGhlIHJldmVyc2Ugb2YgdGhlIHRyYW5zZm9ybWF0aW9uDQogICAgICAgICAgICAgIGxvZ19icmVha3MoYmFzZSA9IGJhc2UpLCAjIyBkZWZhdWx0IHdheSB0byBkZWZpbmUgdGhlIHNjYWxlIGJyZWFrcw0KICAgICAgICAgICAgICBkb21haW4gPSBjKDFlLTEwMCwgSW5mKSAjIyBUaGUgZG9tYWluIG92ZXIgd2hpY2ggdGhlIHRyYW5zZm9ybWF0aW9uIGlzIHZhbHVlZA0KICAgICAgICAgICAgICkNCiAgICB9DQoNCiMgcmVhZGluZyBpbiB0b3duc2hpcHMgZnJvbSBnZW9hZG1pbnMgDQp0b3duc2hpcHMgPC0gcmVhZF9leGNlbCgiRlNDIDVXIDIwMjEgLSBHRU9BRE1JTlNfZmluYWwgMTkueGxzeCIsDQogICAgICAgICAgIHNoZWV0ID0gIkdFT0FETUlOUyIpICU+JSANCiAgY2xlYW5fbmFtZXMoKSAlPiUgDQogIHNlbGVjdChhZG1pbjFwY29kZV80OmFkbWluM3Bjb2RlKSAlPiUgDQogIHJlbmFtZShhZG1pbjFfcGNvZGUgPSBhZG1pbjFwY29kZV80LA0KICAgICAgICAgYWRtaW4zX3Bjb2RlID0gYWRtaW4zcGNvZGUsDQogICAgICAgICBzdGF0ZV9uYW1lICAgPSBzdGF0ZV81LA0KICAgICAgICAgdG93bnNoaXBfbmFtZSAgPSBjb3VudHkpICU+JSANCiAgcmVtb3ZlX2VtcHR5KCkgJT4lDQogIG11dGF0ZShhZG1pbjNfcGNvZGUgPSBpZmVsc2Uoc3RhdGVfbmFtZSA9PSAiTWFnd2F5IiAmIHRvd25zaGlwX25hbWUgPT0gIk1pbmhsYSIsICJNTVIwMDkwMTMiLCBhZG1pbjNfcGNvZGUpLA0KICAgICAgICAgYWRtaW4zX3Bjb2RlID0gaWZlbHNlKHN0YXRlX25hbWUgPT0gIllhbmdvbiIgJiB0b3duc2hpcF9uYW1lID09ICJIdGFudGFiaW4iLCAiTU1SMDEzMDA2IiwgYWRtaW4zX3Bjb2RlKSkNCg0KIyBsb2NhdGlvbnMgZGF0YXNldCANCmxvY2F0aW9ucyA8LSBiaW5kX3Jvd3MoDQogIA0KICByZWFkX2V4Y2VsKCJGU0MgNVcgMjAyMSAtIEdFT0FETUlOU19maW5hbCAxOS54bHN4IiwgIyBwYXlhbXMgDQogICAgICAgICAgICAgc2hlZXQgPSAiR0VPQURNSU5TIikgJT4lIA0KICAgIGNsZWFuX25hbWVzKCkgJT4lIA0KICAgIHNlbGVjdChzdGF0ZV9uYW1lOnBheWFtX2NvZGUpICU+JSANCiAgICByZW5hbWUoYWRtaW4xX3Bjb2RlID0gc3RhdGVfY29kZV8xMiwNCiAgICAgICAgICAgdG93bnNoaXBfbmFtZSA9IGNvdW50eV9uYW1lLCANCiAgICAgICAgICAgYWRtaW4zX3Bjb2RlID0gY291bnR5X2NvZGUsDQogICAgICAgICAgIGxvY2F0aW9uID0gcGF5YW1fbmFtZSkgJT4lDQogICAgcmVtb3ZlX2VtcHR5KCkgJT4lIA0KICAgIG11dGF0ZShsb2NhdGlvbl90eXBlID0gcGFzdGUwKCJwYXlhbSIpKSwNCiAgDQogIHJlYWRfZXhjZWwoIkZTQyA1VyAyMDIxIC0gR0VPQURNSU5TX2ZpbmFsIDE5Lnhsc3giLCAjIGNhbXBzDQogICAgICAgICAgICAgc2hlZXQgPSAiR0VPQURNSU5TIikgJT4lIA0KICAgIGNsZWFuX25hbWVzKCkgJT4lIA0KICAgIHNlbGVjdChjb3VudHlfbmFtZTE6cF9jb2RlX2NhbXApICU+JSANCiAgICByZW5hbWUodG93bnNoaXBfbmFtZSA9IGNvdW50eV9uYW1lMSwNCiAgICAgICAgICAgYWRtaW4zX3Bjb2RlID0gc3RhdGVfY29kZV8yMywNCiAgICAgICAgICAgbG9jYXRpb24gPSBjYW1wcywgDQogICAgICAgICAgIGNhbXBfcGNvZGUgPSBwX2NvZGVfY2FtcCkgJT4lIA0KICAgIHJlbW92ZV9lbXB0eSgpICU+JSANCiAgICBtdXRhdGUobG9jYXRpb25fdHlwZSA9IHBhc3RlMCgiY2FtcCIpKSAlPiUgDQogICAgbGVmdF9qb2luKHRvd25zaGlwcyAlPiUgc2VsZWN0KHN0YXRlX25hbWUsIGFkbWluMV9wY29kZSwgYWRtaW4zX3Bjb2RlKSwgDQogICAgICAgICAgICAgIGJ5ID0gYygiYWRtaW4zX3Bjb2RlIikpICU+JSANCiAgICByZWxvY2F0ZShhZG1pbjFfcGNvZGUpICU+JSANCiAgICByZWxvY2F0ZShzdGF0ZV9uYW1lKSwNCiAgDQogIHJlYWRfZXhjZWwoIkZTQyA1VyAyMDIxIC0gR0VPQURNSU5TX2ZpbmFsIDE5Lnhsc3giLCAjIGluZHVzdHJpYWwgem9uZXMNCiAgICAgICAgICAgICBzaGVldCA9ICJHRU9BRE1JTlMiKSAlPiUgDQogICAgY2xlYW5fbmFtZXMoKSAlPiUNCiAgICBzZWxlY3Qoc3RhdGVfMjg6aW5kdXN0cmlhbF96b25lcykgJT4lIA0KICAgIHJlbmFtZShzdGF0ZV9uYW1lID0gc3RhdGVfMjgsIA0KICAgICAgICAgICBhZG1pbjFfcGNvZGUgPSBhZG1pbjFwY29kZV8yOSwNCiAgICAgICAgICAgbG9jYXRpb24gPSBpbmR1c3RyaWFsX3pvbmVzKSAlPiUNCiAgICByZW1vdmVfZW1wdHkoKSAlPiUgDQogICAgcmVnZXhfbGVmdF9qb2luKHRvd25zaGlwcyAlPiUgc2VsZWN0KHRvd25zaGlwX25hbWUsIGFkbWluM19wY29kZSksDQogICAgICAgICAgICAgICAgICAgIGJ5ID0gYygibG9jYXRpb24iID0gInRvd25zaGlwX25hbWUiKSkgJT4lIA0KICAgICMgcmVwbGFjaW5nIHRoZSBOQXMgd2l0aCAwcyBzbyB0aGUgZmlsdGVyIGRvZXNuJ3QgZHJvcCB0aGVtIA0KICAgIHJlcGxhY2VfbmEobGlzdCh0b3duc2hpcF9uYW1lID0gMCwgYWRtaW4zX3Bjb2RlID0gMCwgYWRtaW4xX3Bjb2RlID0gMCkpICU+JQ0KICAgIGZpbHRlcihhZG1pbjNfcGNvZGUgIT0gIk1NUjAxMzA0MCIpICU+JSAjIHJlbW92aW5nIGFsbCB0aGUgbWF0Y2hlcyBiZXR3ZWVuIEhsYWluZ3RoYXJ5YSBhbmQgSGxhaW5nDQogICAgZmlsdGVyKGFkbWluM19wY29kZSAhPSAiTU1SMDExMDA2IikgJT4lICMgcmVtb3ZpbmcgYWxsIHRoZSBtYXRjaGVzIGJldHdlZW4gWWVuYW5neWF1bmcgYW5kIFllDQogICAgbXV0YXRlKGxvY2F0aW9uX3R5cGUgPSBwYXN0ZTAoImluZHVzdHJpYWxfem9uZSIpKQ0KICANCiklPiUNCiAgbXV0YXRlKGxvY2F0aW9uX2NvZGUgPSBjYXNlX3doZW4obG9jYXRpb25fdHlwZSA9PSAiY2FtcCIgfiBjYW1wX3Bjb2RlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbl90eXBlID09ICJwYXlhbSIgfiBwYXlhbV9jb2RlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbl90eXBlID09ICJpbmR1c3RyaWFsX3pvbmUiIH4gTkFfY2hhcmFjdGVyXykpICU+JQ0KICBtdXRhdGUobG9jYXRpb25zX2Z1enp5ID0gc3RyX3JlcGxhY2VfYWxsKGxvY2F0aW9uLCAiW1s6cHVuY3Q6XV0iLCAiIiksDQogICAgICAgICBsb2NhdGlvbnNfZnV6enkgPSB0b2xvd2VyKGxvY2F0aW9uc19mdXp6eSksDQogICAgICAgICBsb2NhdGlvbiA9IHRvbG93ZXIobG9jYXRpb24pKQ0KDQojIHJlYWRpbmcgaW4gcGluIGFuZCB0YXJnZXRzDQpwaW4gPC0gcmVhZF9leGNlbCgiUElOIGNhbGN1bGF0aW9uIEZvb2QgU2VjdXJpdHkgQ2x1c3Rlcl9Ub3duc2hpcCBCcmVha2Rvd24ueGxzeCIsDQogICAgICAgICAgIHNoZWV0ID0gIkZvb2QgU2VjIFBpTiB3aXRoIElEUHMiLCANCiAgICAgICAgICAgc2tpcCA9IDIpICU+JSANCiAgY2xlYW5fbmFtZXMoKSAlPiUgDQogIHNlbGVjdCgtYyh4MTcsIHgxOCwgeDE5KSkgJT4lIA0KICBzbGljZSgxOjM0NikgJT4lIA0KICBmaWxsKHJlZ2lvbikgJT4lIA0KICByZW5hbWUoc3RhdGUgPSByZWdpb24sDQogICAgICAgICBpZHBzID0gaWRfcHMsIA0KICAgICAgICAgcG9wX21pbnVzX2lkcHMgPSBwb3B1bGF0aW9uX21pbnVzX2lkX3BzLCANCiAgICAgICAgIHBpbl8yMDIyID0gdnVsbmVyYWJsZV9mb29kX2luc2VjdXJlX3Blb3BsZV9pZF9wcykgJT4lICANCiAgZmlsdGVyKHRvd25zaGlwICE9ICJUb3RhbCIpICU+JSAgDQogIG11dGF0ZV9hdCh2YXJzKHBvcF9taW51c19pZHBzOm1vZGVyYXRlbHlfc2V2ZXJlbHkpLCB+IGFzLm51bWVyaWMoLikpICU+JSANCiAgbXV0YXRlKHN0YXRlID0gcmVjb2RlKHN0YXRlLCAiU2hhbiBFYXN0IiA9ICJTaGFuIChFYXN0KSIsDQogICAgICAgICAgICAgICAgICAgICAgICAiU2hhbiBOb3J0aCIgPSAiU2hhbiAoTm9ydGgpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICJBeWV5YXdhZHkiID0gIkF5ZXlhcndhZHkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIlNoYW4gKChzb3V0aCkpIiA9ICJTaGFuIChTb3V0aCkiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICJOYXlweWl0YXciID0gIk5heSBQeWkgVGF3IikpICU+JSANCiAgbGVmdF9qb2luKHRvd25zaGlwcywgYnkgPSBjKCJ0b3duc2hpcCIgPSAidG93bnNoaXBfbmFtZSIsICJzdGF0ZSIgPSAic3RhdGVfbmFtZSIpKSAlPiUgDQogIHJlbG9jYXRlKGFkbWluM19wY29kZSkgJT4lIHJlbG9jYXRlKGFkbWluMV9wY29kZSkgJT4lIA0KICBtdXRhdGUocGNfdnVsID0gcGluXzIwMjIgLyB0b3RhbF9wb3AsDQogICAgICAgICBwaW5fMjAyMiA9IHJvdW5kKHBpbl8yMDIyLCBkaWdpdHMgPSAwKSkgJT4lIA0KICBsZWZ0X2pvaW4ocmVhZF9leGNlbCgiRlNDIFBJTiBhbmQgVGFyZ2V0IF9jb21iaW5lIEhSUCBhbmQgSUVSUCAyMDIxLnhsc3giKSAlPiUNCiAgICAgICAgICAgICAgY2xlYW5fbmFtZXMoKSAlPiUNCiAgICAgICAgICAgICAgc2VsZWN0KGFkbWluM19wY29kZSA9IHRzcF9wY29kZSwgcGluXzIwMjEgPSBwaW4sIHRhcmdldF8yMDIxID0gdGFyZ2V0KSwgYnkgPSAiYWRtaW4zX3Bjb2RlIikgJT4lIA0KICBsZWZ0X2pvaW4ocmVhZF9leGNlbCgiZnNfdGFyZ2V0c18yMDIxLnhsc3giKSAlPiUNCiAgICAgICAgICAgICAgY2xlYW5fbmFtZXMoKSAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdCh0b3duc2hpcCA9IHgxLA0KICAgICAgICAgICAgICAgICAgICAgaHJwX3RhcmdldF9pZHBzXzIwMjEgPSBpbnRlcm5hbGx5X2Rpc3BsYWNlZF9wZXJzb25zXzEyLA0KICAgICAgICAgICAgICAgICAgICAgaHJwX3RhcmdldF9yZXR1cm5lZXNfMjAyMSA9IGlkcF9yZXR1cm5lZXNfcmVzZXR0bGVkX2xvY2FsbHlfaW50ZWdyYXRlZF8xMywNCiAgICAgICAgICAgICAgICAgICAgIGhycF90YXJnZXRfc3RhdGVsZXNzX3Jha2hpbmVfMjAyMSA9IG5vbl9kaXNwbGFjZWRfc3RhdGVsZXNzX3Blb3BsZV9pbl9yYWtoaW5lXzE0LA0KICAgICAgICAgICAgICAgICAgICAgaHJwX3RhcmdldF9vdGhlcl92dWxuZXJhYmxlXzIwMjEgPSBvdGhlcl92dWxuZXJhYmxlX2NyaXNpc19hZmZlY3RlZF9wZW9wbGVfMTUsDQogICAgICAgICAgICAgICAgICAgICBocnBfdGFyZ2V0X3RvdGFsID0gdG90YWxfMTYpICU+JQ0KICAgICAgICAgICAgICBsZWZ0X2pvaW4odG93bnNoaXBzICU+JSAgc2VsZWN0KHRvd25zaGlwX25hbWUsIGFkbWluM19wY29kZSksIGJ5ID0gYygidG93bnNoaXAiID0gInRvd25zaGlwX25hbWUiKSkgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoLXRvd25zaGlwKSwNCiAgICAgICAgICAgIGJ5ID0gImFkbWluM19wY29kZSIpICU+JQ0KICByZXBsYWNlKGlzLm5hKC4pLCAwKSAlPiUgDQogIGxlZnRfam9pbihyZWFkX2V4Y2VsKCJGU0MgUElOIGFuZCBUYXJnZXQgX2NvbWJpbmUgSFJQIGFuZCBJRVJQIDIwMjEueGxzeCIpICU+JQ0KICAgICAgICAgICAgICBjbGVhbl9uYW1lcygpICU+JQ0KICAgICAgICAgICAgICBzZWxlY3QoYWRtaW4zX3Bjb2RlID0gdHNwX3Bjb2RlLCBocnBfdmVyc2lvbiksIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSAgDQogIG11dGF0ZShocnBfdmVyc2lvbiA9IHJlY29kZShocnBfdmVyc2lvbiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIUlAgMjAyMSIgPSAiaHJwIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIUlAgQWRkZW5kdW0iID0gImllcnAiKSkgJT4lIA0KICBtdXRhdGUoYWRtaW4zX3Bjb2RlID0gaWZlbHNlKGFkbWluM19wY29kZSA9PSAiTU1SMDA3MDE0IiAmIHN0YXRlID09ICJZYW5nb24iLCAiTU1SMDEzMDA2IiwgYWRtaW4zX3Bjb2RlKSwNCiAgICAgICAgIGFkbWluM19wY29kZSA9IGlmZWxzZShzdGF0ZSA9PSAiTWFnd2F5IiAmIHRvd25zaGlwID09ICJNaW5obGEiLCAiTU1SMDA5MDEzIiwgYWRtaW4zX3Bjb2RlKSkgJT4lICANCiAgcmVuYW1lKHRhcmdldF8yMDIyID0gdGFyZ2V0KSAlPiUgDQogICMgWWFuZ29uIHNvbWVob3cgaGFzIGFsbCB0aGVpciB0YXJnZXQgYW5kIHBpbiByZXZlcnNlZD8gDQogIG11dGF0ZShwaW5fbmV3ID0gaWZlbHNlKHN0YXRlID09ICJZYW5nb24iLCB0YXJnZXRfMjAyMiwgcGluXzIwMjIpLCAgDQogICAgICAgICAgICAgICB0YXJnZXRfbmV3ID0gaWZlbHNlKHN0YXRlID09ICJZYW5nb24iLCBwaW5fMjAyMiwgdGFyZ2V0XzIwMjIpKQ0KDQojIHRoaXMgZXhpc3RzIGZvciB0aGUgSFJQIC8gbm9uLUhSUCBjb2x1bW4gDQpocnAyMDIxX2FkbTNfbGlzdCA8LSBwaW4gJT4lIGZpbHRlcihocnBfdmVyc2lvbiA9PSAiaHJwIikgJT4lIHB1bGwoYWRtaW4zX3Bjb2RlKQ0KDQojIHJlYWRpbmcgaW4gNXdzDQpmc2MgPC0gcmVhZF9leGNlbCgNCiAgIkZTQyA1VyAyMDIxIC0gR0VPQURNSU5TX2ZpbmFsIDE5X0phbiB0byBEZWMgMjAyMSBJTSBDb21iaW5lZF9EcmFmdF8yODAxMjAyMi54bHN4IiwNCiAgICAgICAgICAgICAgICAgIHNoZWV0ID0gIkZTQyA1VyBBY3Rpdml0ZXMiLA0KICAgICAgICAgICAgICAgICAgc2tpcCA9IDUpICU+JSANCiAgamFuaXRvcjo6Y2xlYW5fbmFtZXMoKSAlPiUgDQogIHNlbGVjdChtb250aF9vZl9pbXBsZW1lbnRhdGlvbjpocnBfdmVyc2lvbikgJT4lIA0KICByZW5hbWVfYWxsKH5zdHJfcmVwbGFjZV9hbGwoLiwgIl5udW1iZXJfb2ZfIiwgIiIpKSAlPiUNCiAgcmVuYW1lX2FsbCh+c3RyX3JlcGxhY2VfYWxsKC4sICJebnVtYmVyXyIsICIiKSkgJT4lIA0KICByZW5hbWUoYWRtaW41X3Bjb2RlID0gYWRtaW4zX3Bjb2RlLCANCiAgICAgICAgIGFkbWluM19wY29kZSA9IGFkbWluMl9wY29kZSwNCiAgICAgICAgIGJlbmVmaWNpYXJpZXMgPSByZWFjaGVkX2JlbmVmaWNpYXJpZXMsDQogICAgICAgICBob3VzZWhvbGRzID0gcmVhY2hlZF9ob3VzZWhvbGRzLA0KICAgICAgICAgYmVuZWZpY2lhcnlfdHlwZSA9IGJlbmVmaWNpYXJpZXNfdHlwZSkgJT4lIA0KICBtdXRhdGUoaW5kdXN0cmlhbF96b25lcyA9IHJlcGxhY2UoaW5kdXN0cmlhbF96b25lcywgaW5kdXN0cmlhbF96b25lcyA9PSAiTm8iLCBOQSksDQogICAgICAgICBmcmVxdWVuY3kgPSByZXBsYWNlKGZyZXF1ZW5jeSwgZnJlcXVlbmN5ID09ICJOL0EiLCBOQSkpICU+JSANCiAgbXV0YXRlKGxvY2F0aW9uID0gY2FzZV93aGVuKGNhbXAgIT0gIk5BIiB+IGNhbXAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmR1c3RyaWFsX3pvbmVzICE9ICJOQSIgfiBpbmR1c3RyaWFsX3pvbmVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlsbGFnZV93YXJkX3Rvd24gIT0gIk5BIiB+IHZpbGxhZ2Vfd2FyZF90b3duKSkgJT4lIA0KICBtdXRhdGUobG9jYXRpb25fdHlwZSA9IGNhc2Vfd2hlbihjYW1wICE9ICJOQSIgfiAiY2FtcCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmR1c3RyaWFsX3pvbmVzICE9ICJOQSIgfiAiaW5kdXN0cmlhbF96b25lIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpbGxhZ2Vfd2FyZF90b3duICE9ICJOQSIgfiAidmlsbGFnZV93YXJkX3Rvd24iKSwNCiAgICAgICAgIGxvY2F0aW9uc19mdXp6eSA9IHN0cl9yZXBsYWNlX2FsbChsb2NhdGlvbiwgIltbOnB1bmN0Ol1dIiwgIiAiKSwNCiAgICAgICAgIGxvY2F0aW9uc19mdXp6eSA9IHRvbG93ZXIobG9jYXRpb25zX2Z1enp5KSwNCiAgICAgICAgIGxvY2F0aW9uID0gdG9sb3dlcihsb2NhdGlvbikpICU+JQ0KICBtdXRhdGUodG90YWxfdmFsdWVfbW1rID0gdmFsdWVfcGVyX2hvdXNlaG9sZCAqIGhvdXNlaG9sZHMsDQogICAgICAgICBkYXRlICAgICAgICAgICAgPSBteShtb250aF9vZl9pbXBsZW1lbnRhdGlvbiksDQogICAgICAgICB1X2JlbiAgICAgICAgICAgPSBpZmVsc2UodW5pcXVlX2JlbmVmaWNpYXJpZXMgPT0gIlllcyIsIGJlbmVmaWNpYXJpZXMsIDApKSAlPiUgDQogIG11dGF0ZShzdGF0ZSA9IGFzLmNoYXJhY3RlcihmY3RfcmVjb2RlKHN0YXRlLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiS2FjaGluIiA9ICJrYWNoaW4iKSksDQogICAgICAgICBmcmVxdWVuY3kgPSByZWNvZGUoZnJlcXVlbmN5LCAibW9udGhseSIgPSAiTW9udGhseSIpLA0KICAgICAgICAgdG93bnNoaXAgPSByZWNvZGUodG93bnNoaXAsICJreWF1a21lIiA9ICJLeWF1a21lIikpICU+JSANCiAgbXV0YXRlKG5ld192YWx1ZV9oaGQgPSB0b3RhbF92YWx1ZV91c2QgLyBob3VzZWhvbGRzLA0KICAgICAgICAgbmV3X3ZhbHVlX3BlcnNvbiA9IHRvdGFsX3ZhbHVlX3VzZCAvIGJlbmVmaWNpYXJpZXMsDQogICAgICAgICB1c2RfaGhkX2JpbiA9IA0KICAgICAgICAgICBjYXNlX3doZW4obmV3X3ZhbHVlX2hoZCA8IDEwIH4gIjwkMTAiLA0KICAgICAgICAgICAgICAgICAgICAgbmV3X3ZhbHVlX2hoZCA+PSAxMCAmIG5ld192YWx1ZV9oaGQgPCAyMCB+ICI+PSQxMF88JDIwIiwNCiAgICAgICAgICAgICAgICAgICAgIG5ld192YWx1ZV9oaGQgPj0gMjAgJiBuZXdfdmFsdWVfaGhkIDwgMzAgfiAiPj0kMjBfPCQzMCIsDQogICAgICAgICAgICAgICAgICAgICBuZXdfdmFsdWVfaGhkID49IDMwICYgbmV3X3ZhbHVlX2hoZCA8IDQwIH4gIj49JDMwXzwkNDAiLA0KICAgICAgICAgICAgICAgICAgICAgbmV3X3ZhbHVlX2hoZCA+PSA0MCAmIG5ld192YWx1ZV9oaGQgPCA1MCB+ICI+PSQ0MF88JDUwIiwNCiAgICAgICAgICAgICAgICAgICAgIG5ld192YWx1ZV9oaGQgPj0gNTAgJiBuZXdfdmFsdWVfaGhkIDwgNjAgfiAiPj0kNTBfPCQ2MCIsDQogICAgICAgICAgICAgICAgICAgICBuZXdfdmFsdWVfaGhkID49IDYwICYgbmV3X3ZhbHVlX2hoZCA8IDcwIH4gIj49JDYwXzwkNzAiLA0KICAgICAgICAgICAgICAgICAgICAgbmV3X3ZhbHVlX2hoZCA+PSA3MCAmIG5ld192YWx1ZV9oaGQgPCA4MCB+ICI+PSQ3MF88JDgwIiwNCiAgICAgICAgICAgICAgICAgICAgIG5ld192YWx1ZV9oaGQgPj0gODAgJiBuZXdfdmFsdWVfaGhkIDwgOTAgfiAiPj0kODBfPCQ5MCIsDQogICAgICAgICAgICAgICAgICAgICBuZXdfdmFsdWVfaGhkID49IDkwICYgbmV3X3ZhbHVlX2hoZCA8IDEwMCB+ICI+PSQ5MF88JDEwMCIsDQogICAgICAgICAgICAgICAgICAgICBuZXdfdmFsdWVfaGhkID49IDEwMCB+ICI+PSQxMDAiLA0KICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IE5BX2NoYXJhY3Rlcl8pLA0KICAgICAgICAgdXNkX2hoZF9iaW4gPSBmY3RfcmVsZXZlbCh1c2RfaGhkX2JpbiwgYygiPCQxMCIsICI+PSQxMF88JDIwIiwgIj49JDIwXzwkMzAiLCAiPj0kMzBfPCQ0MCIsICI+PSQ0MF88JDUwIiwiPj0kNTBfPCQ2MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPj0kNjBfPCQ3MCIsICI+PSQ3MF88JDgwIiwgIj49JDgwXzwkOTAiLCI+PSQ5MF88JDEwMCIsIj49JDEwMCIpKSkgJT4lIA0KICBtdXRhdGUoaHJwX2luZGljYXRvciA9DQogICAgICAgICAgcmVjb2RlKGhycF9pbmRpY2F0b3IsDQogICAgICAgICAgIk51bWJlciBvZiBwZW9wbGUgd2hvIHJlY2VpdmVkIGZvb2QgYW5kL29yIGNhc2ggYXNzaXN0YW5jZSIgPSANCiAgICAgICAgICAgICIxLk51bWJlciBvZiBwZW9wbGUgd2hvIHJlY2VpdmVkIGZvb2QgYW5kL29yIGNhc2ggYXNzaXN0YW5jZSIsDQogICAgICAgICAgIk51bWJlciBvZiBwZW9wbGUgd2hvIHJlY2VpdmVkIGFncmljdWx0dXJlIGFuZCBvdGhlciBsaXZlbGlob29kIHN1cHBvcnQsIGNvbnRyaWJ1dGluZyB0byBob3VzZWhvbGQgZm9vZCBzZWN1cml0eSIgPQ0KICAgICAgICAgICAgIjIuTnVtYmVyIG9mIHBlb3BsZSB3aG8gcmVjZWl2ZWQgYWdyaWN1bHR1cmUgYW5kIG90aGVyIGxpdmVsaWhvb2Qgc3VwcG9ydCIpKSAlPiUgDQogIG11dGF0ZShiZW5lZmljaWFyeV90eXBlID0gc3RyX3RyaW0oYmVuZWZpY2lhcnlfdHlwZSkpICU+JSANCiAgbXV0YXRlKGJlbmVmaWNpYXJ5X3R5cGUgPSBhcy5jaGFyYWN0ZXIoZmN0X3JlY29kZShiZW5lZmljaWFyeV90eXBlLCANCiAgICAgICAgICAgICAgICJSYWtoaW5lIHN0YXRlbGVzcyIgPSAiTm9uLWRpc3BsYWNlZCBzdGF0ZWxlc3MgcGVvcGxlIGluIFJha2hpbmUiKSkpICU+JSANCiAgbXV0YXRlKGFjdGl2aXR5ID0gcmVjb2RlKGFjdGl2aXR5LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIlByb3ZpZGUgbW9udGhseSBmb29kIGJhc2tldHMgdGhyb3VnaCBpbi1raW5kIGFzc2lzdGFuY2UgdG8gYWN1dGVseSBmb29kIGluc2VjdXJlIHBvcHVsYXRpb24gaW4gcnVyYWwgYXJlYXMiID0gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByb3ZpZGUgbW9udGhseSBmb29kIGJhc2tldHMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJvdmlkZSB0ZWNobmljYWwgdHJhaW5pbmcgKGFncmljdWx0dXJlLCBsaXZlc3RvY2sgYnJlZWRpbmcsIGxpdmVsaWhvb2QpIiA9ICJQcm92aWRlIHRlY2huaWNhbCB0cmFpbmluZyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICJQcm92aWRlIHN1cHBvcnQgZm9yIEluY29tZSBHZW5lcmF0aW5nIEFjdGl2aXRpZXMiID0gIlByb3ZpZGUgc3VwcG9ydCBmb3IgaW5jb21lIGdlbmVyYXRpb24iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJvdmlkZSBtb250aGx5IGNhc2gtYmFzZWQgdHJhbnNmZXJzIHRvIGFjdXRlbHkgZm9vZCBpbnNlY3VyZSBwb3B1bGF0aW9uIGluIHJ1cmFsIGFyZWFzIiA9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByb3ZpZGUgbW9udGhseSBjYXNoLWJhc2VkIHRyYW5zZmVycyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICJDYXNoIGZvciBXb3JrIC8gRm9vZCBmb3IgQXNzZXRzIGFjdGl2aXRpZXMiID0gIkNhc2ggZm9yIFdvcmsgLyBGb29kIGZvciBBc3NldHMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJvdmlkZSBmaXNoZXJ5IGtpdHMgKGluLWtpbmQgLyBDQlQpIiA9ICJQcm92aWRlIGZpc2hlcnkga2l0cyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICJQcm92aWRlIGNyb3BzICYgdmVnZXRhYmxlcyBraXRzIChpbi1raW5kIC8gQ0JUKSIgPSAiUHJvdmlkZSBjcm9wcyAmIHZlZ2V0YWJsZXMga2l0cyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICJQcm92aWRlIGxpdmVzdG9jayBraXRzIChpbi1raW5kIC8gQ0JUKSIgPSAiUHJvdmlkZSBsaXZlc3RvY2sga2l0cyIpKSAlPiUgDQogIG11dGF0ZShpbXBsZW1lbnRpbmdfcGFydG5lcnMgPSByZWNvZGUoaW1wbGVtZW50aW5nX3BhcnRuZXJzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2F2ZSB0aGUgY2hpbGRyZW4iID0gIlNhdmUgdGhlIENoaWxkcmVuIikpICU+JSANCiAgbXV0YXRlKGltcGxlbWVudGluZ19wYXJ0bmVyX3R5cGUgPSANCiAgICAgICAgICAgaWZlbHNlKGltcGxlbWVudGluZ19wYXJ0bmVycyAlaW4lIGMoIkthdyBMYWggRm91bmRhdGlvbiIsICJIYWtoYSBCYXB0aXN0IEFzc29jaWF0aW9uIChIQkEpIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBcmthbiBSZXNlYXJjaCBhbmQgV2F0Y2giLCAiSGxhaW5nIERldmVsb3BtZW50IE5ldHdvcmsiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1hbmdyb3ZlIFNlcnZpY2UgTmV0d29yayAoTVNOKSIsICJLeWFsIFNpbiBNYXkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3dhbiBTYXVuZyBTaGluIiwgIlNlaW4gTGVpIEF5ZXlhciIpLCAiTk5HTyIsIGltcGxlbWVudGluZ19wYXJ0bmVyX3R5cGUpLA0KICAgICAgICAgaW1wbGVtZW50aW5nX3BhcnRuZXJfdHlwZSA9IA0KICAgICAgICAgICBpZmVsc2UoaW1wbGVtZW50aW5nX3BhcnRuZXJzICVpbiUgYygiU2luZ2xlIFRvdWNoIFBvaW50IENvbXBhbnkgTGltaXRlZCAoU1RQKSIsICJOZW8gUHJvc3BlY3QgQ29tcGFueSBMaW1pdGVkIiksIA0KICAgICAgICAgICAgICAgICAgIm90aGVyIiwgaW1wbGVtZW50aW5nX3BhcnRuZXJfdHlwZSksDQogICAgICAgICBpbXBsZW1lbnRpbmdfcGFydG5lcl90eXBlID0gaWZlbHNlKGltcGxlbWVudGluZ19wYXJ0bmVycyA9PSAiSGVsZW4gS2VsbGVyIEludGVybmF0aW9uYWwiLCAiSU5HTyIsIGltcGxlbWVudGluZ19wYXJ0bmVyX3R5cGUpKSAlPiUgIA0KICBtdXRhdGUoaHJwX2llcnAgPSBjYXNlX3doZW4oYWRtaW4zX3Bjb2RlICVpbiUgaHJwMjAyMV9hZG0zX2xpc3QgfiAiaHJwIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZSA+ICIyMDIxLTA1LTAxIiB+ICJpZXJwIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+ICJub25faHJwIikpICU+JSANCiAgbXV0YXRlKGNvdmlkXzE5X3Jlc3BvbnNlID0gcmVjb2RlKGNvdmlkXzE5X3Jlc3BvbnNlLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyIgPSAibm8iLCAiWWVzIiA9ICJ5ZXMiKSwNCiAgICAgICAgICAgICAgIGNvdmlkXzE5X3Jlc3BvbnNlID0gcmVwbGFjZV9uYShjb3ZpZF8xOV9yZXNwb25zZSwgIm5vIikpDQoNCiMgYmVuIGRhdGFzZXQgLS0gdGlkeSBmb3JtYXQgNVdzIGZvciBiZW5lZmljaWFyaWVzIA0KYmVuIDwtIGZzYyAlPiUgDQogIGZpbHRlcih1bmlxdWVfYmVuZWZpY2lhcmllcyA9PSAiWWVzIikgJT4lICANCiAgc2VsZWN0KGRhdGUsDQogICAgICAgICBpbXBsZW1lbnRpbmdfcGFydG5lcnMsIGltcGxlbWVudGluZ19wYXJ0bmVyX3R5cGUsDQogICAgICAgICBzdGF0ZSwgdG93bnNoaXAsIHZpbGxhZ2Vfd2FyZF90b3duLCBsb2NhdGlvbiwgbG9jYXRpb25fdHlwZSwgYWRtaW4xX3Bjb2RlLCBhZG1pbjNfcGNvZGUsDQogICAgICAgICBhY3Rpdml0eSwgYWN0aXZpdHlfc3RhdHVzLCBocnBfaW5kaWNhdG9yLCBiZW5lZmljaWFyeV90eXBlLCANCiAgICAgICAgIGNoaWxkX21hbGUsIGNoaWxkX2ZlbWFsZSwgYWR1bHRfbWFsZSwgYWR1bHRfZmVtYWxlLCBlbGRlcmx5X21hbGUsIGVsZGVybHlfZmVtYWxlKSAlPiUgDQogIHBpdm90X2xvbmdlcihjb2xzID0gY2hpbGRfbWFsZTplbGRlcmx5X2ZlbWFsZSwgDQogICAgICAgICAgICAgICBuYW1lc190byA9ICJkaXNhZ2dyZWdhdGlvbiIsIHZhbHVlc190byA9ICJiZW5lZmljaWFyaWVzIiwgdmFsdWVzX2Ryb3BfbmEgPSBUUlVFKQ0KDQojIHNoYXBlZmlsZXMNCnBjb2RlM19zaGFwZSA8LSBzdF9yZWFkKCIuL21tcl9wb2xibmRhX2FkbTNfbWltdV8yNTBrL21tcl9wb2xibmRhX2FkbTNfbWltdV8yNTBrLnNocCIsIHF1aWV0ID0gVFJVRSkgJT4lIA0KIHJlbmFtZShzdGF0ZSA9IFNULCANCiAgICAgICAgYWRtaW4xX3Bjb2RlID0gU1RfUENPREUsDQogICAgICAgIHRvd25zaGlwID0gVFMsDQogICAgICAgIGFkbWluM19wY29kZSA9IFRTX1BDT0RFKSAlPiUgDQogbXV0YXRlKGFkbWluM19wY29kZSA9IGlmZWxzZShzdHJfZGV0ZWN0KHRvd25zaGlwLCAiSGxhaW5ndGhhcnlhIiksICJNTVIwMTMwMDgiLCBhZG1pbjNfcGNvZGUpKQ0KDQojIHBjb2RlM19zaGFwZSA8LSBzdF9yZWFkKCIuL2FkbWluMyBib3VuZGFyeSBvbGQgdmVyc2lvbi9hZG1pbjMgYm91bmRhcnkgb2xkIHZlcnNpb24uc2hwIiwgcXVpZXQgPSBUUlVFKSAlPiUgDQojICAgcmVuYW1lKHN0YXRlID0gU1QsIA0KIyAgICAgICAgICAgYWRtaW4xX3Bjb2RlID0gU1RfUENPREUsDQojICAgICAgICAgICB0b3duc2hpcCA9IFRTLA0KIyAgICAgICAgICAgYWRtaW4zX3Bjb2RlID0gVFNfUENPREUpIA0KDQojIGZvciByZWxldmVsbGluZyAtLSB0aGlzIGlzIGluIG9yZGVyIG9mIGJlbmVmaWNpYXJpZXMNCnNyX29yZCA8LSBjKCJZYW5nb24iLCAiUmFraGluZSIsICJNYW5kYWxheSIsICJBeWV5YXJ3YWR5IiwgIk1hZ3dheSIsICJLYWNoaW4iLCAiU2hhbiAoTm9ydGgpIiwgIktheWluIiwNCiAiTW9uIiwgIlNhZ2FpbmciLCAiS2F5YWgiLCAiQ2hpbiIsICJTaGFuIChTb3V0aCkiLCAiQmFnbyAoRWFzdCkiLCAiVGFuaW50aGFyeWkiLCAiU2hhbiAoRWFzdCkiKQ0KDQojIGZvciBwcmludGluZyB0aGUgdGFyZ2V0cyBvZiB0aGUgcGluIA0KdGFyZ2V0X2Jlbl8yMDIxIDwtIHBpbiAlPiUgIA0KICBzZWxlY3QoYWRtaW4zX3Bjb2RlLCBzdGF0ZSwgdG93bnNoaXAsIHRhcmdldF8yMDIxKSAlPiUgDQogIGZpbHRlcih0YXJnZXRfMjAyMSA+IDApICU+JSANCiAgbGVmdF9qb2luKGJlbiAlPiUgDQogICAgICAgICAgICAgIGdyb3VwX2J5KGFkbWluM19wY29kZSkgJT4lIA0KICAgICAgICAgICAgICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSksIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgbXV0YXRlKHBjX3JlYWNoZWQgPSBiZW5lZmljaWFyaWVzIC8gdGFyZ2V0XzIwMjEgKiAxMDApICU+JSAgDQogIHJlcGxhY2UoaXMubmEoLiksIDApIA0KDQojIHNob3dzIGNvbG91cnMgYW5kIGhlY3ggY29kZXMgaW4gcGFsZXR0ZQ0KIyBzaG93X2NvbChodWVfcGFsKCkoNikpDQpgYGANCg0KYGBge3IgdGFibGUtYWNyb255bXN9DQp0cmliYmxlKA0KICB+YWNyb255bSwgfm5hbWUsIA0KICAiQ0JUIiwgIkNhc2gtYmFzZWQgVHJhbnNmZXJzIiwNCiAgIkNDQ00iLCAiQ2FtcCBNYW5hZ2VtZW50IGFuZCBDYW1wIENvb3JkaW5hdGlvbiIsDQogICJDU08iLCAiQ2l2aWwgU29jaWV0eSBPcmdhbmlzYXRpb24iLCANCiAgIkNXRyIsICJDYXNoIFdvcmtpbmcgR3JvdXAiLA0KICAiRkFPIiwgIkZvb2QgYW5kIEFncmljdWx0dXJlIE9yZ2FuaXNhdGlvbiIsDQogICJGU0MiLCAiRm9vZCBTZWN1cml0eSBDbHVzdGVyIiwNCiAgIkhOTyIsICJIdW1hbml0YXJpYW4gTmVlZHMgT3ZlcnZpZXciLA0KICAiSFJQIiwgIkh1bWFuaXRhcmlhbiBSZXNwb25zZSBQbGFuIiwNCiAgIklEUCIsICJJbnRlcm5hbGx5IERpc3BsYWNlZCBQZXJzb24iLA0KICAiSUVSUCIsICJJbnRlcmltIEVtZXJnZW5jeSBSZXNwb25zZSBQbGFuIiwNCiAgIk1FQiIsICJNaW5pbXVtIEV4cGVuZGl0dXJlIEJhc2tldCIsDQogICJORkkiLCAiTm9uLWZvb2QgSXRlbXMiLA0KICAiTk5HTyIsICJOYXRpb25hbCBOb24tZ292ZXJubWVudGFsIE9yZ2FuaXNhdGlvbiIsIA0KICAiT0NIQSIsICJVTiBPZmZpY2UgZm9yIHRoZSBDb29yZGluYXRpb24gb2YgSHVtYW5pdGFyaWFuIEFmZmFpcnMiLCANCiAgIlBJTiIsICJQZW9wbGUgaW4gTmVlZCIsDQogICJXRlAiLCAiV29ybGQgRm9vZCBQcm9ncmFtbWUiDQopICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICIqKkFjcm9ueW1zKioiLCBjb2wubmFtZXMgPSBOVUxMKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMihwb3NpdGlvbiA9ICJsZWZ0IiwgZnVsbF93aWR0aCA9IEZBTFNFKQ0KYGBgDQo8YnI+DQoNCiMjIEludHJvZHVjdGlvbg0KDQpUaGlzIHJlcG9ydCBpcyBhbiBvdmVydmlldyBvZiB0aGUgaW5pdGlhbCBvYnNlcnZhdGlvbnMgYW5kIGFuYWx5c2lzIHBlcmZvcm1lZCBvbiB0aGUgRm9vZCBTZWN1cml0eSBDbHVzdGVyIDVXcyBkYXRhIGZvciAyMDIxOyB0aGUgaXNzdWVzIGlkZW50aWZpZWQgYW5kIGFuYWx5c2lzIGhhdmUgYmVlbiBicm9rZW4gaW50byBsYXJnZSBncm91cHMgY29ycmVzcG9uZGluZyB3aXRoIHRoZSBmaXJzdCA0IGNoYXB0ZXJzIG9mIHRoZSBGU0MgMjAyMSA1V3MgbWF0cml4IC0tIGdlb2dyYXBoaWNhbCBjb3ZlcmFnZSwgYWN0aXZpdGllcyBhbmQgbW9kYWxpdGllcywgcGFydG5lcnMgYW5kIGJlbmVmaWNpYXJpZXMuIFRoaXMgcmVwb3J0IGVuZHMgd2l0aCBhIGJyaWVmIHNlY3Rpb24gb24gbmV4dCBzdGVwcyBhbmQgYW4gaW50ZXJhY3RpdmUgcmVmZXJlbmNlIHRhYmxlIGFuZCBpbnRlcmFjdGl2ZSByZWZlcmVuY2UgbWFwcy4NCg0KVGhlIEZTQyBoYXMgZW5kZWF2b3VyZWQgdG8gcHJvdmlkZSBhY3Rpb25hYmxlIGluZm9ybWF0aW9uIGFuZCBiZWxpZXZlIHRoYXQgcmVsZWFzaW5nIHRoaXMgcmVwb3J0IGlzIGEgbmVjZXNzYXJ5IHBhcnQgb2YganVtcC1zdGFydGluZyB0aGUgcHJvY2VzcyBvZiByZXNvbHZpbmcgdGhlIG1vcmUgcHJlc3NpbmcgY29uY2VybnMgaWRlbnRpZmllZC4gRnVydGhlciBhbmFseXNpcyBpcyBtZXJpdGVkIGluIHNldmVyYWwgYXJlYXM7IGFuZCB0aGlzIHdpbGwgYmUgdW5kZXJ0YWtlbiBvbmNlIGNvbnN1bHRhdGlvbnMgd2l0aCBwYXJ0bmVycyBoYXZlIGJlZW4gY29tcGxldGVkLiBVbmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZCwgYmVuZWZpY2lhcnkgZmlndXJlcyBpbiB0aGlzIHJlcG9ydCBhcmUgdW5pcXVlIGJlbmVmaWNpYXJpZXMsIGFzIG9wcG9zZWQgdG8gYmVuZWZpY2lhcnkgZnJlcXVlbmNpZXMuDQoNCg0KPGJyPjxicj4NCg0KIyMjIGEuIFN1bW1hcnkgb2Yga2V5IGZpbmRpbmdzDQoNCiogVGhlIDIwMjEgcmVzcG9uc2Ugd2FzICoqc2tld2VkIHRvd2FyZHMgdmVyeSBmZXcgYXJlYXMqKiAtLSBZYW5nb24gYW5kIFJha2hpbmUgZm9ybSA3OCUgb2YgdGhlIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCwgd2l0aCAyNCUgb2YgYWxsIGJlbmVmaWNpYXJpZXMgb3JpZ2luYXRlIGZyb20gSGxhaW5ndGhhcnlhIHRvd25zaGlwIGFsb25lLiBUaGUgdG9wIDEwIHRvd25zaGlwcyBhY2NvdW50IGZvciA3NiUgb2YgYWxsIGJlbmVmaWNpYXJpZXMgcmVhY2hlZC4gDQoNCiogU2l4IG9mIHRoZSBlaWdodCBGb29kIFNlY3VyaXR5IGFjdGl2aXRpZXMgKG1vbnRobHkgZm9vZCBiYXNrZXRzLCBzdXBwb3J0IGZvciBpbmNvbWUgZ2VuZXJhdGlvbiwgY2FzaCBmb3Igd29yay9mb29kIGZvciBhc3NldHMsIGxpdmVzdG9jayBraXRzLCBjcm9wIGFuZCB2ZWdldGFibGUga2l0cyBhbmQgZmlzaGVyeSBraXRzKSBleHBlcmllbmNlZCAqKmxhcmdlIHJhbXAgdXBzKiogaW4gYmVuZWZpY2lhcmllcyByZWFjaGVkIGFmdGVyIHRoZSBhZGRpdGlvbiBvZiB0aGUgMjAyMSBIUlAgYWRkZW5kdW07IGJ1dCB0aGUgY2FzZWxvYWRzIGZvciB0aGUgcHJvdmlzaW9uIG9mIGNhc2gtYmFzZWQgdHJhbnNmZXJzIGFuZCB0ZWNobmljYWwgdHJhaW5pbmcgd2VyZSBsYXJnZWx5IGVzdGFibGlzaGVkIHByaW9yIHRvIDIwMjEgYW5kIG9ubHkgc2F3IGluY3JlbWVudGFsIGluY3JlYXNlcyBpbiBiZW5lZmljaWFyaWVzIHJlYWNoZWQgdGhyb3VnaG91dCB0aGUgeWVhci4gDQoNCiogKio2MSUqKiBvZiBiZW5lZmljaWFyeSBmcmVxdWVuY2llcyByZWNlaXZlZCBzdXBwb3J0IHRocm91Z2ggdGhlIGluLWtpbmQgZGVsaXZlcnkgbW9kYWxpdHk7ICoqMjUlKiogb2YgYmVuZWZpY2lhcnkgZnJlcXVlbmNpZXMgd2VyZSByZWFjaGVkIGJ5IGNhc2ggdHJhbnNmZXJzLiBPZiBiZW5lZmljaWFyaWVzIHdobyByZWNlaXZlZCBjYXNoIHRyYW5zZmVycywgODQlIG9mIHRoZW0gd2VyZSByZWFjaGVkIHRocm91Z2ggZGlyZWN0IGNhc2ggcGF5bWVudHMuIA0KDQoqIFRoZSBtb3N0IGNvbW1vbiB0cmFuc2ZlciB2YWx1ZXMgLS0gaW4gdGVybXMgb2YgYmVuZWZpY2lhcmllcyByZWFjaGVkIC0tIGFyZSAqKmJldHdlZW4gVVNEIDYwIGFuZCA3MCoqIHBlciBtb250aCBwZXIgaG91c2Vob2xkLCBpdCBzaG91bGQgYWxzbyBiZSBub3RlZCB0aGF0IGEgbm90IGluc2lnbmlmaWNhbnQgbnVtYmVyIG9mIGhvdXNlaG9sZHMgKGFib3V0IDglKSB3ZXJlIHJlYWNoZWQgYnkgY2FzaCB0cmFuc2ZlciBpbnRlcnZlbnRpb25zIHZhbHVlZCBhdCBVU0QgMTAwIHBlciBob3VzZWhvbGQgb3IgbW9yZS4gVGhlIGhpZ2hlc3QgYXZlcmFnZSBjYXNoIHRyYW5zZmVycyB3ZXJlIGZyb20gdGhlIHByb3Zpc2lvbiBvZiBsaXZlc3RvY2sga2l0cyBhbmQgdGhlIGxvd2VzdCBhdmVyYWdlcyBmcm9tIENhc2ggZm9yIHdvcmsvZm9vZCBmb3IgYXNzZXRzIGFjdGl2aXRpZXMuDQoNCiogQXJvdW5kIDYwJSBvZiBiZW5lZmljaWFyeSBob3VzZWhvbGRzIGhhdmUgcmVjZWl2ZWQgNTAlIG9yIG1vcmUgb2YgdGhlICoqTWluaW11bSBFeHBlbmRpdHVyZSBCYXNrZXQgKE1FQikqKiBmb3IgZm9vZCBmb3IgdGhlIG1vbnRocyB0aGV5IHdlcmUgY292ZXJlZC4gSG93ZXZlciwgYWJvdXQgMTAlIG9mIGFsbCBiZW5lZmljaWFyeSBob3VzZWhvbGRzIGZvciBtb250aGx5IGNhc2gtYmFzZWQgdHJhbnNmZXJzIHJlY2VpdmVkIHVuZGVyIFVTRCAyMCBwZXIgbW9udGggKGxlc3MgdGhhbiAxMCUgb2YgdGhlIE1FQikgYW5kIDIzJSBvZiBob3VzZWhvbGRzIHJlY2VpdmVkIGJldHdlZW4gVVNEIDIwIGFuZCBVU0QgNDAgKDIyJSBvZiB0aGUgTUVCKS4gDQoNCiogVGhlcmUgYXJlIGEgdG90YWwgb2YgNzEgRlNDIHBhcnRuZXJzLCAqKjYyIG9mIHdob20gcmVwb3J0ZWQgYWNoaWV2ZW1lbnRzIHRocm91Z2ggdGhlIDVXcyoqLiAyNyBwYXJ0bmVycyBjbGFzc2lmaWVkIHRoZW1zZWx2ZXMgYXMgcmVwb3J0aW5nIG9yZ2FuaXNhdGlvbnMsIHRob3VnaCAyMyBvZiB0aGVzZSB3ZXJlIGFsc28gaW1wbGVtZW50aW5nIHBhcnRuZXJzLiANCg0KKiAqKk9ubHkgMTMgaW1wbGVtZW50aW5nIHBhcnRuZXJzIGhhdmUgYSBwcmVzZW5jZSBpbiBtb3JlIHRoYW4gNSB0b3duc2hpcHMqKiwgYW5kIG9ubHkgOCBoYXZlIGEgcHJlc2VuY2UgaW4gbW9yZSB0aGFuIDEwLiA3OCUgb2YgcGFydG5lcnMgYXJlIHByZXNlbnQgaW4gbGVzcyB0aGFuIDUgdG93bnNoaXBzLiAzNCBpbXBsZW1lbnRpbmcgcGFydG5lcnMgaGF2ZSByZWFjaGVkIGxlc3MgdGhhbiAxMCwwMDAgYmVuZWZpY2lhcmllcyB0aHJvdWdob3V0IDIwMjEgYW5kIHRoZSBtZWRpYW4gbnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCBpbiB0aGlzIHBlcmlvZCBieSBpbXBsZW1lbnRpbmcgcGFydG5lcnMgaXMgNiwxMTguDQoNCiogKipBZ2UgYW5kIHNleC1kaXNhZ2dyZWdhdGVkIGJlbmVmaWNpYXJ5IGZpZ3VyZXMqKiBhcmUgb25lIG9mIHRoZSBtb3N0IGtleSBwaWVjZXMgb2YgbWlzc2luZyBkYXRhIGluIHRoZSA1VyBkYXRhc2V0LiBWYWx1ZXMgaGF2ZSBiZWVuIGxhcmdlbHkgYmFja2ZpbGxlZCBmcm9tIGNlbnN1cyBkYXRhIGFuZCBkbyBub3QgcHJvdmlkZSBhbiBhY2N1cmF0ZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgcG9wdWxhdGlvbiByZWFjaGVkLiANCg0KKiAqKjgyLjY4JSBvZiBiZW5lZmljaWFyaWVzIGFyZSBmcm9tIHRoZSBob3N0L2xvY2FsIGNvbW11bml0eSoqLCA5LjAyJSBhcmUgc3RhdGVsZXNzIHBlcnNvbnMgZnJvbSBSYWtoaW5lIGFuZCA4LjI0JSBhcmUgSURQcy4gUmV0dXJuZWVzIGFyZSB0aGUgcmFyZXN0IHR5cGUgb2YgYmVuZWZpY2lhcnkgcmVhY2hlZCwgZm9ybWluZyBvbmx5IDAuMDclIG9mIGFsbCBiZW5lZmljaWFyaWVzIHJlYWNoZWQuDQoNCiogNDklIG9mIGJlbmVmaWNpYXJpZXMgb2YgbW9udGhseSBhY3Rpdml0aWVzIGV4cGVyaWVuY2VkICoqZ2FwcyBvciBkZWxheXMgaW4gbW9udGhseSBwcm9ncmFtbWluZyoqLCB3aXRoIHRoZSBtb3N0IGNvbW1vbiBkZWxheSBiZWluZyAzIG1vbnRocy4gR2FwcyBpbiBtb250aGx5IHByb2dyYW1taW5nIHdlcmUgZXhwZXJpZW5jZWQgaW4gMzkgdG93bnNoaXBzLCB3aXRoIHRoZSBtYWpvcml0eSBvcmlnaW5hdGluZyBmcm9tIEthY2hpbiwgQXlleWFyd2FkeSBhbmQgUmFraGluZS4NCg0KKiBGb29kIFNlY3VyaXR5IENsdXN0ZXIgcGFydG5lcnMgYXJlICoqbm90IHdlbGwtcG9zaXRpb25lZCB0byBjb3ZlciB0aGUgMjAyMiBwb3B1bGF0aW9uIGluIG5lZWQqKi4gUGFydG5lcnMgYXJlIGxhcmdlbHkgY29uY2VudHJhdGVkIGluIEthY2hpbiwgUmFraGluZSBhbmQgWWFuZ29uLCB3aXRoIG9ubHkgb25lIHBhcnRuZXIgcHJlc2VudCBpbiBTaGFuIChFYXN0KSBhbmQgdHdvIGluIFRhbmludGhhcnlpLiBPdmVyYWxsLCA1OCUgb2YgdG93bnNoaXBzLCBjb250YWluaW5nIDQ2JSBvZiB0aGUgMjAyMiBQSU4sIGRvIG5vdCBoYXZlIGFueSBwYXJ0bmVycyBwcmVzZW50Lg0KDQo8YnI+PGJyPg0KDQojIyMgYi4gQWNoaWV2ZW1lbnRzIHJlbGF0ZWQgdG8gdGhlIEhSUCBhbmQgSUVSUA0KDQpgYGB7ciBkZi1ocnAtdmVyc2lvbi10YWJ9DQpocnBfdmVyc2lvbl90YWIgPC0gZnNjICU+JSANCiAgZ3JvdXBfYnkoaHJwX2llcnApICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0odV9iZW4sIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICB0b3duc2hpcHMgPSBuX2Rpc3RpbmN0KGFkbWluM19wY29kZSksDQogICAgICAgICAgICBpbXBsZW1lbnRpbmdfcGFydG5lcnMgPSBuX2Rpc3RpbmN0KGltcGxlbWVudGluZ19wYXJ0bmVycykpICU+JSANCiAgcmVuYW1lKGhycF92ZXJzaW9uID0gaHJwX2llcnApICU+JQ0KICBsZWZ0X2pvaW4ocGluICU+JSANCiAgICAgICAgICAgICAgZmlsdGVyKCFpcy5uYShocnBfdmVyc2lvbikpICU+JSANCiAgICAgICAgICAgICAgZ3JvdXBfYnkoaHJwX3ZlcnNpb24pICU+JSANCiAgICAgICAgICAgICAgc3VtbWFyaXNlKHRhcmdldF8yMDIxID0gcm91bmQoc3VtKHRhcmdldF8yMDIxLCBuYS5ybSA9IFRSVUUpKSksIGJ5ID0gImhycF92ZXJzaW9uIikgJT4lIA0KICBtdXRhdGUocGNfb2ZfYmVuID0gcm91bmQoYmVuZWZpY2lhcmllcyAvIHN1bShiZW5lZmljaWFyaWVzKSAqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAgcmVsb2NhdGUoYmVuZWZpY2lhcmllcywgLmFmdGVyID0gaW1wbGVtZW50aW5nX3BhcnRuZXJzKSAlPiUgDQogIHJlbG9jYXRlKHBjX29mX2JlbiwgLmFmdGVyID0gYmVuZWZpY2lhcmllcykNCmBgYA0KDQpUaG91Z2ggdGhpcyBkb2N1bWVudCBpcyBub3QgaW50ZW5kZWQgdG8gcmVwb3J0IG9uIG9yIGZvY3VzIG9uIHNvbGVseSBIUlAtcmVsYXRlZCBhY3Rpdml0aWVzIGFzIGl0IGlzIGltcG9ydGFudCB0byBhbmFseXNlIHRoZSBlbnRpcmV0eSBvZiBhbGwgRm9vZCBTZWN1cml0eSBhY3Rpdml0aWVzIHJlcG9ydGVkIGluIDIwMjEuIFRoaXMgcHJlbGltaW5hcnkgc2VjdGlvbiBjb250YWlucyBhIGJyaWVmIHN1bW1hcnkgb2YgSHVtYW5pdGFyaWFuIFJlc3BvbnNlIFBsYW4gKEhSUCkgYW5kIEhSUCBhZGRlbmR1bS1yZWxhdGVkIGFjaGlldmVtZW50cy4gSW4gMjAyMSwgYHIgZmlsdGVyKGhycF92ZXJzaW9uX3RhYiwgaHJwX3ZlcnNpb24gPT0gImhycCIpICU+JSBwdWxsKHBjX29mX2JlbilgJSBvZiByZWFjaGVkIGJlbmVmaWNpYXJpZXMgd2VyZSByZWxhdGVkIHRvIHRoZSBvcmlnaW5hbCBIUlAgYW5kIGByIGZpbHRlcihocnBfdmVyc2lvbl90YWIsIGhycF92ZXJzaW9uID09ICJpZXJwIikgJT4lIHB1bGwocGNfb2ZfYmVuKWAlIHdlcmUgcmVsYXRlZCB0byB0aGUgSFJQIGFkZGVuZHVtIChJRVJQKToNCg0KYGBge3IgaHJwLXZlcnNpb24tdGFibGV9DQojIHRvbyBtdWNoIG1hbnVhbCBjYWxjdWxhdGlvbiBpbiB0aGlzIHRhYmxlIC0tIEkga25vdyB5b3UgZG9uJ3QgaGF2ZSB0aW1lIG5vdywgYnV0IHlvdSBuZWVkIHRvIGZpeCB0aGlzIGF0IHNvbWUgcG9pbnQNCmhycF92ZXJzaW9uX3RhYiAlPiUgIA0KICByYmluZChmc2MgJT4lICANCiAgICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bSh1X2JlbiwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgdG93bnNoaXBzID0gbl9kaXN0aW5jdChhZG1pbjNfcGNvZGUpLA0KICAgICAgICAgICAgICBpbXBsZW1lbnRpbmdfcGFydG5lcnMgPSBuX2Rpc3RpbmN0KGltcGxlbWVudGluZ19wYXJ0bmVycykpICU+JSANCiAgICAgIG11dGF0ZShocnBfdmVyc2lvbiA9IGlmZWxzZShpcy5udW1lcmljKGJlbmVmaWNpYXJpZXMpLCAidG90YWwiLCAiIiksDQogICAgICAgICAgICAgcGNfb2ZfYmVuID0gaWZlbHNlKGlzLm51bWVyaWMoYmVuZWZpY2lhcmllcyksIDEwMC4wMCwgMCksIA0KICAgICAgICAgICAgIHRhcmdldF8yMDIxID0gNjAxMjM1ICsgMjE2NzExNCkpICU+JSANCiAgbXV0YXRlKHBjX29mX3RhcmdldCA9IGlmZWxzZShocnBfdmVyc2lvbiA9PSAidG90YWwiLCByb3VuZCgoYmVuZWZpY2lhcmllcyAtIDQ3NTQ0NCkgLyB0YXJnZXRfMjAyMSAqIDEwMCwgZGlnaXRzID0gMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91bmQoYmVuZWZpY2lhcmllcyAvIHRhcmdldF8yMDIxICogMTAwLCBkaWdpdHMgPSAyKSkpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJCZW5lZmljaWFyaWVzLCB0b3duc2hpcHMgYW5kIGltcGxlbWVudGluZyBwYXJ0bmVycyBieSBIUlAsIEhSUCBhZGRlbmR1bSBhbmQgbm9uLUhSUCBhY3Rpdml0aWVzIiwNCiAgICAgICAgZm9ybWF0LmFyZ3MgPSBsaXN0KGJpZy5tYXJrID0gIiwiKSkgJT4lIA0KICBrYWJsZV9jbGFzc2ljXzIoInN0cmlwZWQiKSAlPiUgIA0KICBmb290bm90ZSgiJ3BjX29mX3RhcmdldCcgb25seSB0YWtlcyBpbnRvIGFjY291bnQgdGhlIDIsNzg1LDUyNCBIUlAgYW5kIElFUlAgYmVuZWZpY2lhcmllcyIsDQogICAgICAgICAgIGdlbmVyYWxfdGl0bGUgPSAiIikNCiMgcGFuZGVyKGNhcHRpb24gPSAiQmVuZWZpY2lhcmllcywgdG93bnNoaXBzIGFuZCBpbXBsZW1lbnRpbmcgcGFydG5lcnMgYnkgSFJQLCBIUlAgYWRkZW5kdW0gYW5kIG5vbi1IUlAgYWN0aXZpdGllcyIpDQoNCmBgYA0KDQoNCjxicj4NCg0KDQpgYGB7ciBkZi1ocnAtYWN0fQ0KaHJwX2FjdCA8LSBmc2MgJT4lICANCiAgZmlsdGVyKHVuaXF1ZV9iZW5lZmljaWFyaWVzID09ICJZZXMiICYgaHJwX2llcnAgIT0gIm5vbl9ocnAiKSAlPiUgDQogIHN1bV9iZW4oYWN0aXZpdHkpICU+JSANCiAgbXV0YXRlKHBjX29mX2JlbiA9IHJvdW5kKGJlbmVmaWNpYXJpZXMgLyBzdW0oYmVuZWZpY2lhcmllcykgKiAxMDAsIGRpZ2l0cyA9IDIpKQ0KYGBgDQoNCg0KVGhlIHByb3Zpc2lvbiBvZiBtb250aGx5IGZvb2QgYmFza2V0cyB3YXMgdGhlIHNpbmdsZSBsYXJnZXN0IGFjdGl2aXR5LCBmb3JtaW5nIGByIGZpbHRlcihocnBfYWN0LCBhY3Rpdml0eSA9PSAiUHJvdmlkZSBtb250aGx5IGZvb2QgYmFza2V0cyIpICU+JSBwdWxsKHBjX29mX2JlbilgJSBvZiBhbGwgcmVhY2hlZCBiZW5lZmljaWFyaWVzLiBUaGlzIHdhcyBmb2xsb3dlZCBieSB0aGUgcHJvdmlzaW9uIG9mIG1vbnRobHkgY2FzaC1iYXNlZCB0cmFuc2ZlcnMgYW5kIHRoZSBwcm92aXNpb24gb2YgY3JvcCBhbmQgdmVnZXRhYmxlIGtpdHMuIA0KDQpgYGB7ciB0YWJsZS1ocnAtaWVycC1ocnAtaW5kaWNhdG9yfQ0KDQojIEkgZG9uJ3QgdGhpbmsgdGhpcyBpcyBuZWNlc3NhcnkgDQpocnBfYWN0X29yZCA8LSBmc2MgJT4lIA0KIGZpbHRlcihocnBfaWVycCAhPSAibm9uX2hycCIgJiB1bmlxdWVfYmVuZWZpY2lhcmllcyA9PSAiWWVzIikgJT4lIA0KIHN1bV9iZW4oYWN0aXZpdHkpDQoNCg0KZnNjICU+JSANCiAgZmlsdGVyKHVuaXF1ZV9iZW5lZmljaWFyaWVzID09ICJZZXMiICYgaHJwX2llcnAgIT0gIm5vbl9ocnAiKSAlPiUgDQogIHN1bV9iZW4yKGhycF9pbmRpY2F0b3IsIGhycF9pZXJwKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBocnBfaWVycCwgdmFsdWVzX2Zyb20gPSBiZW5lZmljaWFyaWVzKSAlPiUgDQogIG11dGF0ZSh0b3RhbF9IUlBfSUVSUCA9IGhycCArIGllcnAsDQogICAgICAgICBwY19vZl90b3RhbCA9IHJvdW5kKHRvdGFsX0hSUF9JRVJQIC8gc3VtKHRvdGFsX0hSUF9JRVJQKSAqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAgc2VsZWN0KGBIUlBfaW5kaWNhdG9yYCA9IGhycF9pbmRpY2F0b3IsIEhSUCA9IGhycCwgSUVSUCA9IGllcnAsIHRvdGFsX0hSUF9JRVJQLCBwY19vZl90b3RhbCkgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIkJlbmVmaWNpYXJpZXMgcmVhY2hlZCwgYnkgSFJQIGluZGljYXRvciIsIGZvcm1hdC5hcmdzID0gbGlzdChiaWcubWFyayA9ICIsIikpICU+JSANCiAgIyBjb2x1bW5fc3BlYyg2LCBjb2xvciA9IHNwZWNfY29sb3IoaHJwX2FjdF9vcmQkYmVuZWZpY2lhcmllc1sxOjhdLCBlbmQgPSAwLjgsIGRpcmVjdGlvbiA9IC0xLCBvcHRpb24gPSAiRyIpKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMigic3RyaXBlZCIpICU+JSAgDQogIGZvb3Rub3RlKCJub24tSFJQIGJlbmVmaWNpYXJpZXMgaGF2ZSBiZWVuIGV4Y2x1ZGVkIiwNCiAgICAgICAgICAgZ2VuZXJhbF90aXRsZSA9ICIiKQ0KDQoNCiMgcGFuZGVyKGNhcHRpb24gPSAiQmVuZWZpY2lhcmllcyByZWFjaGVkIGJ5IGFjdGl2aXR5LCBieSBIUlAgdmVyc2lvbiIpDQpgYGANCg0KYGBge3IgdGFibGUtaHJwLWllcnAtaHJwLWFjdGl2aXR5fQ0KZnNjICU+JSAgDQogIGZpbHRlcih1bmlxdWVfYmVuZWZpY2lhcmllcyA9PSAiWWVzIiAmIGhycF9pZXJwICE9ICJub25faHJwIikgJT4lIA0KICBncm91cF9ieShocnBfaWVycCwgYWN0aXZpdHkpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpICU+JSANCiAgcmVuYW1lKEhSUF9hY3Rpdml0eSA9IGFjdGl2aXR5KSAlPiUgDQogIG11dGF0ZShocnBfaWVycCA9IHJlY29kZShocnBfaWVycCwgImhycCIgPSAiSFJQIiwgImllcnAiID0gIklFUlAiKSkgJT4lIA0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gaHJwX2llcnAsIHZhbHVlc19mcm9tID0gYmVuZWZpY2lhcmllcykgJT4lIA0KICBtdXRhdGUodG90YWxfSFJQX0lFUlAgPSBIUlAgKyBJRVJQLA0KICAgICAgICAgcGNfb2ZfdG90YWwgPSByb3VuZCh0b3RhbF9IUlBfSUVSUCAvIHN1bSh0b3RhbF9IUlBfSUVSUCkgKiAxMDAsIGRpZ2l0cyA9IDIpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhwY19vZl90b3RhbCkpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJCZW5lZmljaWFyaWVzIHJlYWNoZWQsIGJ5IGFjdGl2aXR5IiwgZm9ybWF0LmFyZ3MgPSBsaXN0KGJpZy5tYXJrID0gIiwiKSkgJT4lIA0KICAjIGNvbHVtbl9zcGVjKDYsIGNvbG9yID0gc3BlY19jb2xvcihocnBfYWN0X29yZCRiZW5lZmljaWFyaWVzWzE6OF0sIGVuZCA9IDAuOCwgZGlyZWN0aW9uID0gLTEsIG9wdGlvbiA9ICJHIikpICU+JSANCiAga2FibGVfY2xhc3NpY18yKCJzdHJpcGVkIikgJT4lICANCiAgZm9vdG5vdGUoIm5vbi1IUlAgYmVuZWZpY2lhcmllcyBoYXZlIGJlZW4gZXhjbHVkZWQiLA0KICAgICAgICAgICBnZW5lcmFsX3RpdGxlID0gIiIpIA0KYGBgDQoNCjxicj4NCg0KQXMgYSBub3RlLCBsZXNzIHRoYW4gNyUgb2YgYWxsIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCB3ZXJlIGFzc29jaWF0ZWQgd2l0aCBDT1ZJRC0xOSByZXNwb25zZSBhY3Rpdml0aWVzLCBwZXJoYXBzIGluZGljYXRpbmcgdGhhdCBDT1ZJRC1yZWxhdGVkIGFjdGl2aXRpZXMgaGF2ZSBiZWVuIGxhcmdlbHkgbWFpbnN0cmVhbWVkLiBJbmRlZWQsIGluIDIwMjEsIHRoZXJlIG5vIHNwZWNpZmljIGNhbGwgZm9yIGEgQ09WSUQtMTkgcmVzcG9uc2UuIFRoZXJlIHdlcmUgYWxzbyByZWxhdGl2ZWx5IGZldyAyMDIwIENPVklELTE5IGFjdGl2aXRpZXMgZnJvbSAyMDIwIGNhcnJpZWQgb3ZlciBpbnRvIDIwMjEuIA0KDQpgYGB7cn0NCmZzYyAlPiUgZmlsdGVyKHVuaXF1ZV9iZW5lZmljaWFyaWVzID09ICJZZXMiKSAlPiUgDQogIHN1bV9iZW4yKGhycF9pZXJwLCBjb3ZpZF8xOV9yZXNwb25zZSkgJT4lIA0KICBtdXRhdGUoaHJwX2llcnAgPSByZWNvZGUoaHJwX2llcnAsICJocnAiID0gIkhSUCIsICJpZXJwIiA9ICJJRVJQIiwgIm5vbl9ocnAiID0gIm5vbl9IUlAiKSwgDQogICAgICAgICBjb3ZpZF8xOV9yZXNwb25zZSA9IHJlY29kZShjb3ZpZF8xOV9yZXNwb25zZSwgIm5vIiA9ICJObyIsICJ5ZXMiID0gIlllcyIpKSAlPiUgDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBocnBfaWVycCwgdmFsdWVzX2Zyb20gPSBiZW5lZmljaWFyaWVzKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIG11dGF0ZSh0b3RhbF9iZW4gPSBJRVJQICsgSFJQICsgbm9uX0hSUCwgDQogICAgICAgICBwY19vZl90b3RhbCA9IHJvdW5kKHRvdGFsX2JlbiAvIHN1bSh0b3RhbF9iZW4pICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBhcnJhbmdlKGRlc2MoY292aWRfMTlfcmVzcG9uc2UpKSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiQ09WSUQtMTkgcmVzcG9uc2UgYnkgSFJQIHZlcnNpb24iLCBmb3JtYXQuYXJncyA9IGxpc3QoYmlnLm1hcmsgPSAiLCIpKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMigpICU+JSANCiAgZm9vdG5vdGUoIkFsbCBiZW5lZmljaWFyaWVzIGhhdmUgYmVlbiBpbmNsdWRlZCBpbiAndG90YWxfYmVuJyIsDQogICAgICAgICAgIGdlbmVyYWxfdGl0bGUgPSAiIikNCmBgYA0KDQoNCjxicj48YnI+PGJyPg0KDQojIyAxLiBHZW9ncmFwaGljYWwgY292ZXJhZ2UNCg0KIyMjIDEuMSBDb21wYXJpbmcgYmVuZWZpY2lhcmllcyByZWFjaGVkIGFuZCAyMDIxIFBJTiBieSBzdGF0ZSBhbmQgcmVnaW9uDQoNCkEgdG90YWwgb2YgYHIgc3VtKGJlbiRiZW5lZmljaWFyaWVzKSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgdW5pcXVlIGJlbmVmaWNpYXJpZXMgaGF2ZSBiZWVuIHJlYWNoZWQgYWNyb3NzIHRoZSBjb3VudHJ5LCBvZiB3aGljaCwgYHIgZmlsdGVyKGhycF92ZXJzaW9uX3RhYiwgaHJwX3ZlcnNpb24gJWluJSBjKCJocnAiLCAiaWVycCIpKSAlPiUge3N1bSguJGJlbmVmaWNpYXJpZXMpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgcGVydGFpbmVkIHRvIEhSUCBhbmQgSUVSUCBhY3Rpdml0aWVzIGFuZCB0b3duc2hpcHMgYW5kIGByIGZpbHRlcihocnBfdmVyc2lvbl90YWIsIGhycF92ZXJzaW9uID09ICJub25faHJwIikgJT4lIHtzdW0oLiRiZW5lZmljaWFyaWVzKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHdlcmUgbm9uLUhSUC4gT3ZlcmFsbCwgYHIgcm91bmQoKGZpbHRlcihmc2MsIGhycF9pZXJwICVpbiUgYygiaHJwIiwgImllcnAiKSkgJT4lIHtzdW0oLiR1X2JlbiwgbmEucm0gPSBUUlVFKX0pIC8gKHN1bShwaW4kdGFyZ2V0XzIwMjEpKSAqIDEwMCwgZGlnaXRzID0gMilgJSBvZiB0aGUgdGFyZ2V0ZWQgYHIgc3VtKHBpbiR0YXJnZXRfMjAyMSkgJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHBlcnNvbnMgaW4gdGhlIEhSUC9JRVJQIHdlcmUgcmVhY2hlZC4gDQoNCjxicj4NCg0KYGBge3IgYmFycGxvdC1zdGF0ZS1iZW5lZmljaWFyaWVzLXBpbn0NCiMgY2hhbmdlIHRoZSBjb2xvdXJzIC0tIEkgcmVhbGx5IGRvbid0IGxpa2UgdGhlc2UgY29sb3VycyANCg0KcGluICU+JSANCiAgbGVmdF9qb2luKGJlbiAlPiUgDQogICAgICAgICAgICAgIGdyb3VwX2J5KGFkbWluM19wY29kZSkgJT4lIA0KICAgICAgICAgICAgICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSkpICU+JSANCiAgbXV0YXRlKGJlbmVmaWNpYXJpZXMgPSBpZmVsc2UoaXMubmEoYmVuZWZpY2lhcmllcyksIDAsIGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIGdyb3VwX2J5KHN0YXRlKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpLCANCiAgICAgICAgICAgIHRhcmdldF8yMDIxID0gc3VtKHRhcmdldF8yMDIxKSwgDQogICAgICAgICAgICBwaW5fMjAyMSA9IHN1bShwaW5fMjAyMSkpICU+JSANCiAgZmlsdGVyKHBpbl8yMDIxID4gMCB8IGJlbmVmaWNpYXJpZXMgPiAwKSAlPiUgDQogIHBpdm90X2xvbmdlcigtc3RhdGUsIG5hbWVzX3RvID0gInR5cGUiLCB2YWx1ZXNfdG8gPSAidmFsdWUiKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGZjdF9yZWxldmVsKHN0YXRlLCBzcl9vcmQpLCB5ID0gdmFsdWUsIGZpbGwgPSBmY3RfcmVsZXZlbCh0eXBlLCBjKCJiZW5lZmljaWFyaWVzIiwgInRhcmdldF8yMDIxIiwgInBpbl8yMDIxIikpKSkgKw0KICBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzX2Qob3B0aW9uID0gIkMiKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHZqdXN0ID0gMC40LCBhbmdsZSA9IDcwKSkgKw0KICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpICsNCiAgbGFicyh4ID0gIiIsDQogICAgICAgeSA9ICIiLCANCiAgICAgICB0aXRsZSA9ICJGb29kIHNlY3VyaXR5IGJlbmVmaWNpYXJpZXMgYW5kIHBlb3BsZSBpbiBuZWVkICgyMDIxKSIsDQogICAgICAgc3VidGl0bGUgPSAiU29tZSBzdGF0ZXMvcmVnaW9ucyBkaWQgbm90IGhhdmUgc3BlY2lmaWMgSFJQL0lFUlAgdGFyZ2V0czsgYWxsIGJlbmVmaWNpYXJpZXMgaW5jbHVkZWQiKSArDQogICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDIwMDAwMDAsIGJ5ID0gMjAwMDAwKSwgbGFiZWxzID0gY29tbWEpDQpgYGANCg0KPGJyPjxicj4NCg0KIyMjIDEuMiBUYWJsZSBvZiBiZW5lZmljaWFyaWVzIGFuZCBQSU4gYnkgc3RhdGUgYW5kIHJlZ2lvbg0KDQpgYGB7ciB0YWJsZS1iZW5lZmljaWFyaWVzLXBpbi1zdGF0ZX0NCg0Kc3RhdGVfYmVuX29yZCA8LSBmc2MgJT4lIA0KICBmaWx0ZXIodW5pcXVlX2JlbmVmaWNpYXJpZXMgPT0gIlllcyIpICU+JSANCiAgZ3JvdXBfYnkoc3RhdGUpICU+JSANCiAgc3VtbWFyaXNlKHRvdGFsX2JlbiA9IHN1bShiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBtdXRhdGUoYCVfb2ZfdG90YWxfYmVuYCA9IHJvdW5kKHRvdGFsX2JlbiAvIHN1bSh0b3RhbF9iZW4pICogMTAwLCBkaWdpdHMgPSAyKSklPiUgDQogIGFycmFuZ2UoZGVzYyh0b3RhbF9iZW4pKQ0KDQpmc2MgJT4lIA0KICBmaWx0ZXIodW5pcXVlX2JlbmVmaWNpYXJpZXMgPT0gIlllcyIpICU+JSANCiAgZ3JvdXBfYnkoc3RhdGUpICU+JSANCiAgc3VtbWFyaXNlKEhSUF9iZW4gPSBzdW0oYmVuZWZpY2lhcmllc1tocnBfaWVycCA9PSAiaHJwIl0pLA0KICAgICAgICAgICAgSUVSUF9iZW4gPSBzdW0oYmVuZWZpY2lhcmllc1tocnBfaWVycCA9PSAiaWVycCJdKSwNCiAgICAgICAgICAgIG5vbl9IUlBfYmVuID0gc3VtKGJlbmVmaWNpYXJpZXNbaHJwX2llcnAgPT0gIm5vbl9ocnAiXSksIA0KICAgICAgICAgICAgdG90YWxfYmVuID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIG11dGF0ZShgJV9vZl90b3RhbF9iZW5gID0gcm91bmQodG90YWxfYmVuIC8gc3VtKHRvdGFsX2JlbikgKiAxMDAsIGRpZ2l0cyA9IDIpKSU+JSANCiAgYXJyYW5nZShkZXNjKHRvdGFsX2JlbikpICU+JSANCiAga2JsKGNhcHRpb24gPSAiQmVuZWZpY2lhcmllcyByZWFjaGVkIChkZXNjLikgYnkgc3RhdGUvcmVnaW9uIiwgZm9ybWF0LmFyZ3MgPSBsaXN0KGJpZy5tYXJrID0gIiwiKSkgJT4lIA0KICBrYWJsZV9jbGFzc2ljXzIobGlnaHRhYmxlX29wdGlvbnMgPSBjKCJzdHJpcGVkIikpICU+JSANCiAgY29sdW1uX3NwZWMoNSwgY29sb3IgPSAid2hpdGUiLCBiYWNrZ3JvdW5kID0gc3BlY19jb2xvcihzdGF0ZV9iZW5fb3JkJGAlX29mX3RvdGFsX2JlbmBbMToxNl0sIGVuZCA9IDAuOCwgZGlyZWN0aW9uID0gLTEpKSAlPiUgDQogIGZvb3Rub3RlKGdlbmVyYWwgPSAiQWxsIGJlbmVmaWNpYXJpZXMgaGF2ZSBiZWVuIGluY2x1ZGVkIGluIHRoaXMgdGFibGUsIHJlZ2FyZGxlc3Mgb2YgdGhlaXIgaW5jbHVzaW9uIGluIHRoZSBIUlAvSUVSUCIsDQogICAgICAgICAgIGdlbmVyYWxfdGl0bGUgPSAiIikNCiMgcGFuZGVyKGNhcHRpb24gPSAiQmVuZWZpY2lhcmllcyByZWFjaGVkIChkZXNjLikgYnkgc3RhdGUvcmVnaW9uIikNCiANCg0KYGBgDQoNCjxicj4NClRoZSByZXNwb25zZSBpcyBmYWlybHkgc2tld2VkIGF0IHRoZSBzdGF0ZS9yZWdpb24gbGV2ZWwuIFlhbmdvbiBhbmQgUmFraGluZSBmb3JtIGByIHJvdW5kKGZpbHRlcihmc2MsIHN0YXRlICVpbiUgYygiWWFuZ29uIiwgIlJha2hpbmUiKSAmIHVuaXF1ZV9iZW5lZmljaWFyaWVzID09ICJZZXMiKSAlPiUge3N1bSguJGJlbmVmaWNpYXJpZXMpfSAvIGZpbHRlcihmc2MsIHVuaXF1ZV9iZW5lZmljaWFyaWVzID09ICJZZXMiKSAlPiUge3N1bSguJGJlbmVmaWNpYXJpZXMpfSAqIDEwMClgJSBvZiB0aGUgYmVuZWZpY2lhcmllcyByZWFjaGVkLiBCZW5lZmljaWFyaWVzIGZyb20gUmFraGluZSB3ZXJlIG1vc3RseSBhc3NvY2lhdGVkIHdpdGggdGhlIEhSUCwgd2hpbHN0IGJlbmVmaWNpYXJpZXMgZnJvbSBZYW5nb24gd2VyZSBtb3N0bHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBJRVJQLiANCg0KUmFraGluZSByZW1haW5zIGEgc3RyYXRlZ2ljIHByaW9yaXR5IGZvciBkb25vcnMsIHllYXIgYWZ0ZXIgeWVhciwgYXMgbmVlZHMgYXJlIHN0aWxsIGhpZ2ggYW5kIHRoZXJlIGlzIGEgcGFydGljdWxhciBpbnRlcmVzdCBpbiB0aGUgUm9oaW5neWEgYW5kIG90aGVyIHN0YXRlbGVzcyBwZXJzb25zLiBJbiBhZGRpdGlvbiwgdGhlIG51bWJlciBvZiBwZXJzb25zIGxpdmluZyBpbiBjYW1wcyByZW1haW5zIGhpZ2ggKDE0MCw1MjUgcGVyc29ucyBhY2NvcmRpbmcgdG8gdGhlIFNoZWx0ZXIvTkZJL0NDQ00gQ2x1c3RlciwgYXMgb2YgMTYgRmVicnVhcnkgMjAyMikuIA0KDQpXaGVuIHRoZSBJRVJQIHdhcyBlc3RhYmxpc2hlZCwgdW5kZXIgdGhlIGxlYWRlcnNoaXAgb2YgT0NIQSwgaXQgd2FzIGRlY2lkZWQgdGhhdCBhIHBlcmktdXJiYW4gcmVwb25zZSAocHJpbmNpcGFsbHkgaW4gWWFuZ29uIGFuZCBNYW5kYWxheSkgd291bGQgYmUgYXQgdGhlIGNvcmUgb2YgdGhpcyBIUlAgYWRkZWRuZHVtLiBBcyBhIHJlc3VsdCwgdG93bnNoaXBzIGluIFlhbmdvbiBtYXNzaXZlbHkgImFic29yYmVkIiB0aGlzIGh1bWFuaXRhcmlhbiBhc3Npc3RhbmNlLg0KDQo8YnI+PGJyPg0KDQojIyMgMS4zIFRvd25zaGlwLWxldmVsIGRpc3RyaWJ1dGlvbiBvZiBiZW5lZmljaWFyaWVzDQoNCg0KSnVzdCBhcyB0aGUgcmVzcG9uc2UgaXMgaGVhdmlseSB3ZWlnaHRlZCB0b3dhcmRzIFlhbmdvbiBhbmQgUmFraGluZSBhdCB0aGUgc3RhdGUgYW5kIHJlZ2lvbiBsZXZlbCwgdGhlIHNhbWUgaXMgYWxzbyB0cnVlIGF0IHRoZSB0b3duc2hpcCBsZXZlbC4gVGhlc2UgMTAgdG93bnNoaXBzIGJlbG93IGFyZSB3aGVyZSA3NiUgb2YgYWxsIEZTQyBiZW5lZmljaWFyaWVzIGFyZSBsb2NhdGVkOg0KDQpgYGB7ciB0YWJsZS10b3AtdG93bnNoaXBzLWJlbmVmaWNpYXJpZXN9DQojIGNoZWNrIHRoZSBwYXJhZ3JhcGggdGV4dCBhYm92ZSBpZiB5b3UgcmVydW4gdGhlIHJlcG9ydCBvbiBuZXcgZGF0YSANCnRzcF9vcmQgPC0gZnNjICU+JSAgDQogIGZpbHRlcih1bmlxdWVfYmVuZWZpY2lhcmllcyA9PSAiWWVzIikgJT4lIA0KICBncm91cF9ieSh0b3duc2hpcCkgJT4lIA0KICBzdW1tYXJpc2UodG90YWxfYmVuID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIG11dGF0ZSh0b3duc2hpcCA9IGNhc2Vfd2hlbih0b3RhbF9iZW4gPiA0NjYwNyB+IHRvd25zaGlwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiT3RoZXIgMTQxIHRvd25zaGlwcyIpKSAlPiUgDQogIGdyb3VwX2J5KHRvd25zaGlwKSAlPiUgDQogIHN1bW1hcmlzZV9hbGwoLmZ1bnMgPSBzdW0pICU+JSBhcnJhbmdlKGRlc2ModG90YWxfYmVuKSkNCg0KZnNjICU+JSAgDQogIGZpbHRlcih1bmlxdWVfYmVuZWZpY2lhcmllcyA9PSAiWWVzIikgJT4lIA0KICBncm91cF9ieSh0b3duc2hpcCkgJT4lIA0KICBzdW1tYXJpc2UoSFJQX2JlbiA9IHN1bShiZW5lZmljaWFyaWVzW2hycF9pZXJwID09ICJocnAiXSksDQogICAgICAgICAgICBJRVJQX2JlbiA9IHN1bShiZW5lZmljaWFyaWVzW2hycF9pZXJwID09ICJpZXJwIl0pLA0KICAgICAgICAgICAgbm9uX0hSUF9iZW4gPSBzdW0oYmVuZWZpY2lhcmllc1tocnBfaWVycCA9PSAibm9uX2hycCJdKSwgDQogICAgICAgICAgICB0b3RhbF9iZW4gPSBzdW0oYmVuZWZpY2lhcmllcyksIC5ncm91cHMgPSAiZHJvcCIpICU+JSANCiAgbXV0YXRlKHRvd25zaGlwID0gY2FzZV93aGVuKHRvdGFsX2JlbiA+IDQ2NjA3IH4gdG93bnNoaXAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+ICJPdGhlciAxNDEgdG93bnNoaXBzIikpICU+JSANCiAgZ3JvdXBfYnkodG93bnNoaXApICU+JSANCiAgc3VtbWFyaXNlX2FsbCguZnVucyA9IHN1bSkgJT4lIA0KICBtdXRhdGUoYCVfb2ZfdG90YWxfYmVuYCA9IHJvdW5kKHRvdGFsX2JlbiAvIHN1bSh0b3RhbF9iZW4pICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBsZWZ0X2pvaW4odG93bnNoaXBzICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KHN0YXRlID0gc3RhdGVfbmFtZSwgdG93bnNoaXAgPSB0b3duc2hpcF9uYW1lKSwgYnkgPSAidG93bnNoaXAiKSAlPiUgDQogIHJlbG9jYXRlKHN0YXRlKSAlPiUgDQogIGFycmFuZ2UoZGVzYyh0b3RhbF9iZW4pKSAlPiUNCiAga2JsKGNhcHRpb24gPSAiVG9wIDEwIHRvd25zaGlwcyBieSBiZW5lZmljaWFyaWVzIHJlYWNoZWQgKGRlc2MpIiwgZm9ybWF0LmFyZ3MgPSBsaXN0KGJpZy5tYXJrID0gIiwiKSkgJT4lIA0KICBjb2x1bW5fc3BlYyg2LCBjb2xvciA9ICJ3aGl0ZSIsIGJhY2tncm91bmQgPSBzcGVjX2NvbG9yKHRzcF9vcmQkdG90YWxfYmVuWzE6MTFdLCBlbmQgPSAwLjgsIGRpcmVjdGlvbiA9IC0xKSkgJT4lDQogIGthYmxlX2NsYXNzaWNfMihsaWdodGFibGVfb3B0aW9ucyA9IGMoInN0cmlwZWQiKSkgJT4lIA0KICBmb290bm90ZShnZW5lcmFsID0gIkFsbCBiZW5lZmljaWFyaWVzIGhhdmUgYmVlbiBpbmNsdWRlZCBpbiAndG90YWxfYmVuJywgcmVnYXJkbGVzcyBvZiB0aGVpciBpbmNsdXNpb24gaW4gdGhlIEhSUC9JRVJQIiwNCiAgICAgICAgICAgZ2VuZXJhbF90aXRsZSA9ICIiKQ0KDQpgYGANCg0KPGJyPg0KDQpgciBiZW4gJT4lIHNlbGVjdChhZG1pbjNfcGNvZGUpICU+JSBkaXN0aW5jdCgpICU+JSBucm93KClgIHRvd25zaGlwcyBvdmVyYWxsIGhhdmUgYmVlbiByZWFjaGVkIGJ5IGZvb2Qgc2VjdXJpdHkgYWN0aXZpdGllcyBpbiAyMDIxLCBpbmNsdWRpbmcgbm9uLUhSUCBhY3Rpdml0aWVzLiBUaGlzIGlzIGByIHJvdW5kKGJlbiAlPiUgc2VsZWN0KHRvd25zaGlwKSAlPiUgZGlzdGluY3QoKSAlPiUgbnJvdygpIC8gbnJvdyh0b3duc2hpcHMpICogMTAwLCBkaWdpdHMgPSAyKWAlIHRoZSAzMzAgdG93bnNoaXBzIGluIHRoZSBjb3VudHJ5LiBgciBmaWx0ZXIoZnNjLCBocnBfaWVycCAlaW4lIGMoImhycCIsICJpZXJwIikpICU+JSBkaXN0aW5jdChhZG1pbjNfcGNvZGUpICU+JSBucm93KClgIHRvd25zaGlwcyBoYXZlIGJlZW4gcmVhY2hlZCBieSBIUlAvSUVSUCBhY3Rpdml0aWVzLiANCg0KVGhlIDIwMjEgSFJQIHdhcyBkZXZlbG9wZWQgdXNpbmcgYSB1bml0LWJhc2VkIGNvc3RpbmcgbWV0aG9kb2xvZ3ksIGJhc2VkIG9uIGEgZm9ybWFsIGFzc2Vzc21lbnQgY29uZHVjdGVkIGJ5IEZBTy9XRlAuIFRhcmdldGluZyB3YXMgYmFzZWQgb24gdGhlIHJlc3BvbnNlIGNhcGFjaXR5IG9mIEZTQyBwYXJ0bmVycyBhbmQgY29zdGluZyB3YXMgYmFzZWQgb24gdGhlIGF2ZXJhZ2UgY29zdCBvZiBpbXBsZW1lbnRhdGlvbiBwcm92aWRlZCBieSBtYWlubHkgVU4gYWdlbmNpZXMgYW5kIENsdXN0ZXIgbGVhZHMuIFRoZSAyMDIxIElFUlAgZm9sbG93ZWQgYSBwcm9ncmFtbWUtYmFzZWQgbWV0aG9kb2xvZ3kgY29uc2lzdGluZyBvZiBzY2FsaW5nIHRoZSByZXNwb25zZSBiYXNlZCBvbiBwYXJ0bmVyLXN1Ym1pdHRlZCBwcm9qZWN0cywgYmFzZWQgb24gb3JpZW50YXRpb24gYW5kIGd1aWRhbmNlIHByb3ZpZGVkIGJ5IHRoZSBzZWN0b3JzL2NsdXN0ZXJzLiBTdWJtaXR0ZWQgcHJvamVjdHMgcmVmbGVjdGVkIHBhcnRuZXJzJyByZXNwb25zZSBjYXBhY2l0aWVzLiANCg0KRXZlbiB0aG91Z2ggdGhlIElFUlAgd2FzIHZhbGlkYXRlZCBieSBodW1hbml0YXJpYW4gcGFydG5lcnMsIGl0IHdhcyBuZXZlciBlbmZvcmNlZCBieSB0aGUgZGUtZmFjdG8gYXV0aG9yaXRpZXMuIFRoaXMgbGltaXRlZCB0aGUgc2NvcGUgb2Ygd29yayBhbmQgdGhlIGFiaWxpdGllcyBvZiBodW1hbml0YXJpYW4gYWN0b3JzIHRvIGNvbmR1Y3QgaW4tZGVwdGggdnVsbmVyYWJpbGl0eSBhbmQgbmVlZHMgYXNzZXNzbWVudHMuIEl0IHdhcyB0aGVuIGRlY2lkZWQgdG8gdHJlYXQgdG93bnNoaXAtbGV2ZWwgdGFyZ2V0cyBhcyB0aGUgUElOIGluIGFyZWFzIHdoZXJlIHRoZSBQSU4gaGFkIG5vdCBiZWVuIGNhbGN1bGF0ZWQuIEZpbmFsbHksIElFUlAgaHVtYW5pdGFyaWFuIGFzc2lzdGFuY2UgYWxzbyByZWFjaGVkIG5vbi1wZXJpLXVyYmFuIHRvd25zaGlwcyBmb3Igd2hpY2ggbm8gdGFyZ2V0cyBoYWQgYmVlbiBzZXQuIA0KDQpUbyBtb21lbnRhcmlseSBuYXJyb3cgZG93biB0aGUgZm9jdXMgdG8gdGhlIDU1IHRvd25zaGlwcyB3aXRoIHNwZWNpZmljIEhSUCBvciBJRVJQIHRhcmdldHMsIHRoZXJlIGlzIHN1YnN0YW50aWFsIHZhcmlhbmNlIGluIHRoZSBwZXJjZW50YWdlIG9mIHRoZSB0YXJnZXQgdGhhdCBoYXMgYmVlbiByZWFjaGVkLiBIbGFpbmd0aGFyeWEncyBiZW5lZmljaWFyeSBmaWd1cmVzIGFyZSAzNzglIG9mIGl0cyBlc3RhYmxpc2hlZCB0YXJnZXQsIHdoZXJlYXMgSHBhcHVuIGluIEtheWluIGFuZCBLeWV0aGkgaW4gU2hhbiBoYWQgYmVlbiB0YXJnZXRlZCBzaW5jZSB0aGUgaW5pdGlhbCBIUlAgYW5kIGhhdmUgbm90IGJlZW4gcmVhY2hlZCBieSBhbnkgRlNDIGFjdGl2aXRpZXM7IGFkZGl0aW9uYWxseSwgRGFnb24gTXlvdGhpdCAoTm9ydGgpIGFuZCBJbnNlaW4gaW4gWWFuZ29uIGFuZCBDaGFuYXlldGhhemFuIGluIE1hbmRhbGF5IHdlcmUgdGFyZ2V0ZWQgaW4gdGhlIElFUlAgYW5kIGFsc28gaGF2ZSBub3QgYmVlbiByZWFjaGVkLg0KDQoNCmBgYHtyIGRhdGFzZXQtdHMtdGFyZ2V0LXJlYWNoZWR9DQoNCnRzX3RhcmdldF9yZWFjaGVkIDwtIHBpbiAlPiUgIA0KICBzZWxlY3QoYWRtaW4zX3Bjb2RlLCBzdGF0ZSwgdG93bnNoaXAsIHRhcmdldF8yMDIxKSAlPiUgDQogIGZpbHRlcih0YXJnZXRfMjAyMSA+IDApICU+JSANCiAgbGVmdF9qb2luKGJlbiAlPiUgDQogICAgICAgICAgICAgIGdyb3VwX2J5KGFkbWluM19wY29kZSkgJT4lIA0KICAgICAgICAgICAgICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSksIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgbXV0YXRlKHBjX3JlYWNoZWQgPSBiZW5lZmljaWFyaWVzIC8gdGFyZ2V0XzIwMjEgKiAxMDApICU+JSANCiAgcmVwbGFjZShpcy5uYSguKSwgMCkgJT4lIGFycmFuZ2UoZGVzYyhwY19yZWFjaGVkKSkNCg0KDQpgYGANCg0KT2YgdGhlc2UgNTUgdG93bnNoaXBzLCB0aGVyZSB3ZXJlIGByIG5yb3coZmlsdGVyKHRzX3RhcmdldF9yZWFjaGVkLCBwY19yZWFjaGVkID4gMTIwKSlgIHRvd25zaGlwcyB3aGVyZSBwYXJ0bmVycyByZWFjaGVkIG1vcmUgdGhhbiAxMjAlIG9mIHRoZWlyIHRhcmdldCwgYHIgbnJvdyhmaWx0ZXIodHNfdGFyZ2V0X3JlYWNoZWQsIHBjX3JlYWNoZWQgPiAxMDAgJiBwY19yZWFjaGVkIDw9IDEyMCkpYCB3aGVyZSB0aGV5IHJlYWNoZWQgYmV0d2VlbiAxMDAlIGFuZCAxMTklIG9mIHRoZWlyIHRhcmdldDsgYHIgbnJvdyhmaWx0ZXIodHNfdGFyZ2V0X3JlYWNoZWQsIHBjX3JlYWNoZWQgPiA4MCAmIHBjX3JlYWNoZWQgPD0gMTAwKSlgIHRvd25zaGlwcyB3aGVyZSB0aGV5IHJlYWNoZWQgYmV0d2VlbiA4MCUgYW5kIDEwMCUgb2YgdGhlaXIgdGFyZ2V0OyBhbmQgYHIgbnJvdyhmaWx0ZXIodHNfdGFyZ2V0X3JlYWNoZWQsIHBjX3JlYWNoZWQgPD0gODAgJiBwY19yZWFjaGVkICE9IDApKWAgdG93bnNoaXBzIHdoZXJlIHRoZXkgcmVhY2hlZCBsZXNzIHRoYW4gODAlIG9mIHRoZWlyIHRhcmdldC4NCg0KPGJyPg0KDQpgYGB7ciBoaXN0b2dyYW0tYmVuZWZpY2lhcmllcy1ocnAtdGFyZ2V0LXJlYWNoZWR9DQoNCnRzX3RhcmdldF9yZWFjaGVkICU+JSANCiAgbXV0YXRlKHBjX3JlYWNoZWQgPSBpZmVsc2UocGNfcmVhY2hlZCA+IDIwMCwgMjAwLCBwY19yZWFjaGVkKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBwY19yZWFjaGVkKSkgKyANCiAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDIwKSArIA0KICAgZ2VvbV9yZWN0KGFlcyh4bWluID0gODAsIHhtYXggPSAxMjAsIHltaW4gPSAtMC4wMTUsIHltYXggPSAxMS4wMTUpLA0KICAgICAgICAgICAgZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9ICJnb2xkZW5yb2QiLCBzaXplID0gMC41KSArDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMjAwLCBieSA9IDIwKSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDEwLCBieSA9IDIpKSArIA0KICBsYWJzKHggPSAiJSBvZiBiZW5lZmljaWFyaWVzIGFjdHVhbGx5IHJlYWNoZWQiLCANCiAgICAgICB5ID0gIk51bWJlciBvZiB0b3duc2hpcHMiLA0KICAgICAgIHRpdGxlID0gIkRpc3RyaWJ1dGlvbiBvZiB0aGUgNTUgdG93bnNoaXBzIHdpdGggc3BlY2lmaWMgMjAyMSBIUlAvSUVSUCB0YXJnZXRzIGJ5IHJlYWNoZWQiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJWYWx1ZXMgYWJvdmUgMjAwJSBoYXZlIGJlZW4gbHVtcGVkIHRvZ2V0aGVyIGF0IDIwMCUiKQ0KYGBgDQoNCjxicj4NCg0KVGhlIGhpc3RvZ3JhbSBhYm92ZSBncm91cHMgdG93bnNoaXBzIGJhc2VkIG9uIHRoZSBwZXJjZW50IG9mIHRoZWlyIHRhcmdldCByZWFjaGVkLiBUaGUgcGVyY2VudGFnZSByZWFjaGVkIGlzIG9uIHRoZSB4LWF4aXMgYW5kIHRoZSBudW1iZXIgb2YgdG93bnNoaXBzIGlzIG9uIHRoZSB5LWF4aXMuIEZyb20gYSBwcm9ncmFtbWUgbWFuYWdlbWVudCBwZXJzcGVjdGl2ZSwgaXQgd291bGQgYmUgZGVzaXJhYmxlIHRvIHNlZSB0aGUgbWFqb3JpdHkgb2YgdG93bnNoaXBzIHdpdGhpbiB0aGUgeWVsbG93IGJveCAoYmV0d2VlbiA4MCUgYW5kIDEyMCUgb2YgdGhlIHRhcmdldCByZWFjaGVkKSwgd2hpY2ggd291bGQgaW5kaWNhdGUgdGhlIGp1ZGljaW91cyBkZXBsb3ltZW50IG9mIHJlc291cmNlcy4gSG93ZXZlciwgd2Ugc2VlIHRoYXQgYm90aCBvdmVycmVhY2ggYW5kIHVuZGVyLXJlYWNoaW5nIGFyZSB2ZXJ5IGNvbW1vbiwgd2l0aCB0aGUgbGFyZ2VzdCBudW1iZXJzIG9mIHRvd25zaGlwcyBjbHVzdGVyZWQgYXJvdW5kIDAlIGFuZCAyMDAlIG9yIG1vcmUgb2YgdGhlIHRhcmdldCByZWFjaGVkLiANCg0KVG93bnNoaXBzIHdpdGggbG93IGxldmVscyBvZiBhY2hpZXZlbWVudCBxdWVzdGlvbiBGU0MgcGFydG5lcnMnIGNhcGFjaXRpZXMgd2hpbGUgaGlnaCBsZXZlbHMgb2Ygb3ZlcnJlYWNoIHN1Z2dlc3QgdGhhdDogDQoNCiogQXNzdW1wdGlvbiAxOiB0aGUgSE5PL0hSUCBkaWQgbm90IHJlYWxseSBpbmZvcm0gYWJvdXQgdGhlIHJlYWwgc2l0dWF0aW9uIGluIHRob3NlIHRvd25zaGlwcy4gSW5kZWVkLCBpbnB1dHMgbWFpbmx5IGNhbWUgZnJvbSBVTiBhZ2VuY2llcyBhbmQgQ2x1c3RlciBsZWFkcy4gDQoNCiogQXNzdW1wdGlvbiAyOiB0aGUgY29udGV4dCBtYXkgaGF2ZSBjaGFuZ2VkIGR1cmluZyB0aGUgeWVhciBhcyB0aGUgcG9zdC1jb3VwIGNyaXNpcyBwcm9ncmVzc2VkLiANCg0KKiBBc3N1bXB0aW9uIDM6IEZTQyBwYXJ0bmVycyBoYXZlIGxpbWl0ZWQgY2FwYWNpdGllcyB0byBhZGFwdCB0aGVpciBwcm9ncmFtbWluZyAobGFjayBvZiBmbGV4aWJpbGl0eSBhbmQgcmVzcG9uc2l2ZW5lc3MpLiANCg0KDQo8YnI+PGJyPg0KDQojIyMgMS40IExvY2F0aW9ucw0KDQpQYXJ0bmVycyBoYXZlIHJlc3BvbmRlZCBpbiBhIHRvdGFsIG9mIGByIGZvcm1hdChiZW4gJT4lIHNlbGVjdChsb2NhdGlvbikgJT4lIGRpc3RpbmN0KCkgJT4lIG5yb3coKSwgYmlnLm1hcmsgPSAiLCIpYCBsb2NhdGlvbnMgYWNyb3NzIHRoZSBjb3VudHJ5LCB3aXRoIHRoZSB2YXN0IG1ham9yaXR5IG9mIGxvY2F0aW9ucyBvbmx5IGhhdmluZyBvbmx5IG9uZSBwYXJ0bmVyIG9wZXJhdGluZyBpbiB0aGVtOyB0aGUgbWF4aW11bSBudW1iZXIgb2YgcGFydG5lcnMgaW4gYW55IGxvY2F0aW9uIGlzIDQuIE9mIHRoZSBgciBmb3JtYXQoZnNjICU+JSBucm93KCksIGJpZy5tYXJrID0gIiwiKWAgcm93cyByZXBvcnRlZCBpbiB0aGUgNVdzLCBvbmx5IGByIHN1bShpcy5uYShmc2MkbG9jYXRpb24pKWAgZGlkIG5vdCByZXBvcnQgYSBzcGVjaWZpYyBsb2NhdGlvbi4NCg0KTG9jYXRpb25zIGFyZSBjbGFzc2lmaWVkIGludG8gdGhyZWUgZ3JvdXBzIC0tIGNhbXBzLCBpbmR1c3RyaWFsIHpvbmVzIGFuZCB2aWxsYWdlcy90b3ducy93YXJkczoNCg0KYGBge3IgdGFibGUtbG9jYXRpb25zfQ0KDQpiZW4gJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGxvY2F0aW9uX3R5cGUpKSAlPiUgDQogIGdyb3VwX2J5KGxvY2F0aW9uX3R5cGUpICU+JSANCiAgc3VtbWFyaXNlKGxvY2F0aW9ucyA9IG5fZGlzdGluY3QobG9jYXRpb24pLA0KICAgICAgICAgICAgdG93bnNoaXBzID0gbl9kaXN0aW5jdCh0b3duc2hpcCksDQogICAgICAgICAgICBiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIG11dGF0ZShwY19vZl9iZW4gPSByb3VuZChiZW5lZmljaWFyaWVzIC8gc3VtKGJlbmVmaWNpYXJpZXMpICogMTAwLCBkaWdpdHMgPSAyKSwgDQogICAgICAgICBhdmdfYmVuID0gcm91bmQoYmVuZWZpY2lhcmllcyAvIGxvY2F0aW9ucywgZGlnaXRzID0gMCkpICU+JQ0KICBhcnJhbmdlKGRlc2MoYmVuZWZpY2lhcmllcykpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJTdW1tYXJ5IG9mIGxvY2F0aW9uIHR5cGVzIiwgZm9ybWF0LmFyZ3MgPSBsaXN0KGJpZy5tYXJrID0gIiwiKSkgJT4lIA0KICBrYWJsZV9jbGFzc2ljXzIoKSAlPiUgDQogIGZvb3Rub3RlKGdlbmVyYWwgPSAiMzgxLDk3MCBiZW5lZmljaWFyaWVzIHdlcmUgcmVwb3J0ZWQgaW4gdGhlIDIxMSByb3dzIHdpdGhvdXQgc3BlY2lmaWMgbG9jYXRpb25zIiwNCiAgICAgICAgICAgZ2VuZXJhbF90aXRsZSA9ICIiKQ0KICAjIHBhbmRlcihjYXB0aW9uID0gIlN1bW1hcnkgb2YgbG9jYXRpb24gdHlwZXMiKQ0KDQpgYGANCg0KPGJyPg0KDQpUaGUgdmFzdCBtYWpvcml0eSBvZiBsb2NhdGlvbnMgYXJlIHNlcnZlZCBieSBvbmx5IG9uZSBwYXJ0bmVyLiBCZWxvdyBhcmUgYSBzZXJpZXMgb2YgaGlzdG9ncmFtcyBzaG93aW5nIHRoZSB2YXJpYXRpb24gaW4gdGhlIG51bWJlciBvZiBiZW5lZmljaWFyaWVzIGJ5IGxvY2F0aW9uLCBzcGxpdCBieSBudW1iZXIgb2YgcGFydG5lcnMgaW4gZWFjaCBsb2NhdGlvbi4gTG9jYXRpb25zIHdpdGggb25lIHBhcnRuZXIgcHJlc2VudCBoYXZlIGEgbGFyZ2UgcGVhayBhcm91bmQgMTAwIGJlbmVmaWNpYXJpZXMgcGVyIGxvY2F0aW9uczsgYW5kIGEgc2xpZ2h0IG1ham9yaXR5IG9mIGxvY2F0aW9ucyB3aXRoIHR3byBwYXJ0bmVycyBoYXZlIG1vcmUgdGhhbiAxLDAwMCBiZW5lZmljaWFyaWVzLg0KDQo8YnI+DQoNCmBgYHtyIGhpc3RvZ3JhbS1sb2NhdGlvbnMtYnktcGFydG5lcn0NCg0KZnNjICU+JSANCiAgZmlsdGVyKCFpcy5uYShsb2NhdGlvbikpICU+JSANCiAgZ3JvdXBfYnkobG9jYXRpb24sIHRvd25zaGlwKSAlPiUgIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSwgDQogICAgICAgICAgICBwYXJ0bmVycyA9IG5fZGlzdGluY3QoaW1wbGVtZW50aW5nX3BhcnRuZXJzKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lIA0KICBhcnJhbmdlKGRlc2MocGFydG5lcnMpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGJlbmVmaWNpYXJpZXMpKSArDQogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMC4xKSArDQogIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBjb21tYSwgdHJhbnMgPSAibG9nMTAiKSArDQogIGZhY2V0X3dyYXAofiBwYXJ0bmVycykgKw0KICBsYWJzKHkgPSAibnVtYmVyIG9mIGxvY2F0aW9ucyIsDQogICAgICAgeCA9ICJiZW5lZmljaWFyaWVzIHBlciBsb2NhdGlvbiIsIA0KICAgICAgIHRpdGxlID0gIkhpc3RvZ3JhbXMgb2YgYmVuZWZpY2lhcmllcyBieSBsb2NhdGlvbiIsDQogICAgICAgc3VidGl0bGUgPSAiRmFjZXRlZCBieSBudW1iZXIgb2YgcGFydG5lcnMgcGVyIGxvY2F0aW9uIikNCg0KYGBgDQoNCg0KPGJyPg0KDQpJbiBnZW5lcmFsLCB0aGUgbW9yZSBwYXJ0bmVycyBvcGVyYXRpbmcgaW4gYSBnaXZlbiBsb2NhdGlvbiwgdGhlIGhpZ2hlciB0aGUgYXZlcmFnZSBudW1iZXIgb2YgYmVuZWZpY2lhcmllczsgaG93ZXZlciwgaXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgdGhlc2UgbXVsdGktcGFydG5lciBsb2NhdGlvbnMgYXJlIGNvbXBhcmF0aXZlbHkgcmFyZS4gVGhlIGxvY2F0aW9ucyB3aXRoIGZvdXIgcGFydG5lcnMgYXJlIE5hbSBIbGFpbmcgaW4gQmhhbW8sIHdoZXJlIGl0IGlzIHN1c3BlY3RlZCB0aGF0IHRoZSBoaWdoIG51bWJlciBvZiBwYXJ0bmVycyBpcyBkdWUgdG8gYmVuZWZpY2lhcmllcyBmcm9tIHRoaXMgdmlsbGFnZSBwYXJ0aWNpcGF0aW5nIGluIGEgcmFuZ2Ugb2YgYWN0aXZpdGllcyBhbmQgdHJhaW5pbmdzIGhlbGQgaW4gdGhlIHRvd25zaGlwIHNlYXQsIGFuZCBNb21hdWsgQmFwdGlzdCBDaHVyY2gsIHdoaWNoIGlzIGEgY2FtcCBsb2NhdGlvbi4gDQoNCmBgYHtyIHRhYmxlLWxvY2F0aW9ucy1wYXJ0bmVyc30NCmZzYyAlPiUgDQogIGZpbHRlcighaXMubmEobG9jYXRpb24pKSAlPiUgDQogIGdyb3VwX2J5KGxvY2F0aW9uLCB0b3duc2hpcCkgJT4lICANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcyksIA0KICAgICAgICAgICAgbnVtYmVyX29mX3BhcnRuZXJzID0gbl9kaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lcnMpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUgDQogIGdyb3VwX2J5KG51bWJlcl9vZl9wYXJ0bmVycykgJT4lIA0KICBzdW1tYXJpc2UobG9jYXRpb25zID0gc3VtKG5fZGlzdGluY3QobG9jYXRpb24pKSwNCiAgICAgICAgICAgIGF2Z19iZW5lZmljaWFyaWVzID0gbWVkaWFuKGJlbmVmaWNpYXJpZXMpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUNCiAgbXV0YXRlKG51bWJlcl9vZl9wYXJ0bmVycyA9IHJlY29kZShudW1iZXJfb2ZfcGFydG5lcnMsIGAxYCA9ICJvbmUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgYDJgID0gInR3byIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBgM2AgPSAidGhyZWUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgYDRgID0gImZvdXIiKSkgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIkF2ZXJhZ2UgYmVuZWZpY2lhcnkgZnJlcXVlbmNpZXMgaW4gbG9jYXRpb25zIHdpdGggb25lLCB0d28sIHRocmVlIGFuZCBmb3VyIHBhcnRuZXJzIiwgZm9ybWF0LmFyZ3MgPSBsaXN0KGJpZy5tYXJrID0gIiwiKSkgJT4lIA0KICBrYWJsZV9jbGFzc2ljXzIoZnVsbF93aWR0aCA9IEZBTFNFLCBwb3NpdGlvbiA9ICJsZWZ0IikNCiAjIHBhbmRlcihjYXB0aW9uID0gIkF2ZXJhZ2UgYmVuZWZpY2lhcnkgZnJlcXVlbmNpZXMgaW4gbG9jYXRpb25zIHdpdGggb25lLCB0d28sIHRocmVlIGFuZCBmb3VyIHBhcnRuZXJzIikNCg0KYGBgDQoNCg0KPGJyPg0KDQpXaGVuIGdyb3VwIGJ5IG51bWJlciBvZiBkaXN0aW5jdCBGU0MgYWN0aXZpdGllcyBieSBsb2NhdGlvbiwgaXQgaXMgb2JzZXJ2ZWQgdGhhdCBhIG1ham9yaXR5IG9mIGxvY2F0aW9ucyBoYWQgb25seSBvbmUgRlNDIGFjdGl2aXR5IGJlaW5nIGltcGxlbWVudGVkIHRoZXJlLiBUaGUgc3Bpa2UgaW4gbnVtYmVyIG9mIHRvd25zaGlwcyB3aXRoIDMgYWN0aXZpdGllcyBwZXIgbG9jYXRpb24gd2VyZSBtb3N0bHkgdmlsbGFnZXMgYW5kIHRvd25zIGluIEF5ZXlhcndhZHkgYW5kIE1hZ3dheS4gDQoNCjxicj4NCg0KYGBge3IgaGlzdG9ncmFtLWxvY2F0aW9ucy1ieS1hY3Rpdml0aWVzfQ0KDQpmc2MgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGxvY2F0aW9uKSkgJT4lIA0KICBncm91cF9ieShsb2NhdGlvbiwgdG93bnNoaXApICU+JSAgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpLCANCiAgICAgICAgICAgIGFjdGl2aXRpZXMgPSBuX2Rpc3RpbmN0KGFjdGl2aXR5LCAuZ3JvdXBzID0gImRyb3AiKSkgJT4lIA0KICBhcnJhbmdlKGRlc2MoYWN0aXZpdGllcykpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gYmVuZWZpY2lhcmllcykpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAwLjEpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hLCB0cmFucyA9ICJsb2cxMCIpICsNCiAgZmFjZXRfd3JhcCh+IGFjdGl2aXRpZXMpICsNCiAgbGFicyh5ID0gIm51bWJlciBvZiBsb2NhdGlvbnMiLA0KICAgICAgIHggPSAiQmVuZWZpY2lhcnkgZnJlcXVlbmNpZXMgcGVyIGxvY2F0aW9uIiwgDQogICAgICAgdGl0bGUgPSAiSGlzdG9ncmFtcyBvZiBudW1iZXIgb2YgRlNDIGFjdGl2aXRpZXMgYnkgbG9jYXRpb24iLA0KICAgICAgIHN1YnRpdGxlID0gIkZhY2V0ZWQgYnkgbnVtYmVyIG9mIEZTQyBhY3Rpdml0aWVzIHBlciBsb2NhdGlvbiIpDQoNCmBgYA0KDQo8YnI+DQoNCkFzIGV4cGVjdGVkLCB0aGUgaGlnaGVyIG51bWJlciBvZiBGU0MgYWN0aXZpdGllcyBpbiBhIGdpdmVuIGxvY2F0aW9uLCB0aGUgaGlnaGVyIHRoZSBudW1iZXIgb2YgYmVuZWZpY2lhcnkgZnJlcXVlbmNpZXMgcmVhY2hlZC4gVGhlIHRvdyBsb2NhdGlvbnMgd2l0aCA1IGFjdGl2aXRpZXMgYmVpbmcgaW1wbGVtZW50ZWQgaW4gdGhlbSBhcmUgYSBjYW1wIGluIFBhdWt0YXcgYW5kIGEgdmlsbGFnZSBpbiBNYXVuZ2Rhdy4gT25jZSBkYXRhIGZyb20gb3RoZXIgQ2x1c3RlcnMgaXMgb2J0YWluZWQsIG11bHRpLXNlY3RvciBjb3ZlcmFnZSBhbmQgaW50ZXJhY3Rpb25zIGJldHdlZW4gYWN0aXZpdGllcyBzaG91bGQgYmUgZXhwbG9yZWQuIA0KDQpgYGB7ciB0YWJsZS1sb2NhdGlvbnMtYWN0aXZpdGllc30NCmZzYyAlPiUgDQogIGZpbHRlcighaXMubmEobG9jYXRpb24pKSAlPiUgDQogIGdyb3VwX2J5KGxvY2F0aW9uLCB0b3duc2hpcCkgJT4lICANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcyksIA0KICAgICAgICAgICAgbnVtYmVyX29mX2FjdGl2aXRpZXMgPSBuX2Rpc3RpbmN0KGFjdGl2aXR5KSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lIA0KICBncm91cF9ieShudW1iZXJfb2ZfYWN0aXZpdGllcykgJT4lIA0KICBzdW1tYXJpc2UobG9jYXRpb25zID0gc3VtKG5fZGlzdGluY3QobG9jYXRpb24pKSwNCiAgICAgICAgICAgIGF2Z19iZW5lZmljaWFyeV9mcmVxdWVuY2llcyA9IG1lZGlhbihiZW5lZmljaWFyaWVzKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lIA0KICBtdXRhdGUobnVtYmVyX29mX2FjdGl2aXRpZXMgPSByZWNvZGUobnVtYmVyX29mX2FjdGl2aXRpZXMsIGAxYCA9ICJvbmUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgYDJgID0gInR3byIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBgM2AgPSAidGhyZWUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgYDRgID0gImZvdXIiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGA1YCA9ICJmaXZlIiksDQogICAgICAgICBhdmdfYmVuZWZpY2lhcnlfZnJlcXVlbmNpZXMgPSByb3VuZChhdmdfYmVuZWZpY2lhcnlfZnJlcXVlbmNpZXMpKSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiQXZlcmFnZSBiZW5lZmljaWFyeSBmcmVxdWVuY2llcyBpbiBsb2NhdGlvbnMgd2l0aCBvbmUsIHR3bywgdGhyZWUsIGZvdXIgYW5kIGZpdmUgYWN0aXZpdGllcyIsIA0KICAgICAgICBmb3JtYXQuYXJncyA9IGxpc3QoYmlnLm1hcmsgPSAiLCIpKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMihmdWxsX3dpZHRoID0gRkFMU0UsIHBvc2l0aW9uID0gImxlZnQiKQ0KICMgcGFuZGVyKGNhcHRpb24gPSAiQXZlcmFnZSBiZW5lZmljaWFyaWVzIGJ5IGxvY2F0aW9ucyB3aXRoIG9uZSwgdHdvLCB0aHJlZSBhbmQgZm91ciBwYXJ0bmVycyIpDQoNCmBgYA0KDQoNCjxicj48YnI+PGJyPg0KDQojIyAyLiBBY3Rpdml0aWVzIGFuZCBtb2RhbGl0aWVzDQoNCiMjIyAyLjEgTW9udGhseSBwcm9ncmVzcyBieSBhY3Rpdml0eQ0KDQo8YnI+DQoNCmBgYHtyIGxpbmUtcGxvdC1mYWNldC1hY3Rpdml0eSwgZmlnLmhlaWdodD02fQ0KYmVuICU+JSANCiAgZ3JvdXBfYnkoYWN0aXZpdHkpICU+JSANCiAgYXJyYW5nZShkYXRlKSAlPiUgDQogIG11dGF0ZShjdW1fYmVuID0gY3Vtc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGRhdGUsIHkgPSBjdW1fYmVuLCBjb2xvdXIgPSBhY3Rpdml0eSkpICsNCiAgZ2VvbV9saW5lKHNpemUgPSAwLjcpICsNCiAgZ2VvbV92bGluZShjb2xvdXIgPSAiZ3JleTUwIiwgbHR5ID0gMiwgeGludGVyY2VwdCA9IGFzLm51bWVyaWMoYXMuRGF0ZSgiMjAyMS0wNi0wMSIpKSkgKw0KICBzY2FsZV94X2RhdGUoZGF0ZV9icmVha3MgPSAiMSBtb250aCIsIGRhdGVfbGFiZWxzID0gIiViIikgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsNCiAgZmFjZXRfd3JhcCh+IGFjdGl2aXR5LCBzY2FsZXMgPSAiZnJlZV95IikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA1KSkgKyAjIHNlZSBpZiB0aGlzIHdvcmtzIHdoZW4geW91IGtuaXQsIHRoZW4gZG8gaXQgZm9yIHRoZSBvdGhlciBwbG90cyANCiAgbGFicyh4ID0gIk1vbnRoIiwgDQogICAgICAgeSA9ICJDdW11bGF0aXZlIGJlbmVmaWNpYXJpZXMiLCANCiAgICAgICB0aXRsZSA9ICJNb250aGx5IHByb2dyZXNzIGJ5IGFjdGl2aXR5LCAyMDIxIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJGaWd1cmVzIGFyZSBpbiBjdW11bGF0aXZlIHVuaXF1ZSBiZW5lZmljaWFyaWVzIHJlYWNoZWQiKSArIA0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMikpDQoNCmBgYA0KDQo8YnI+IA0KDQpTaXggb2YgdGhlIGVpZ2h0IEZvb2QgU2VjdXJpdHkgYWN0aXZpdGllcyAobW9udGhseSBmb29kIGJhc2tldHMsIHN1cHBvcnQgZm9yIGluY29tZSBnZW5lcmF0aW9uLCBjYXNoIGZvciB3b3JrL2Zvb2QgZm9yIGFzc2V0cywgbGl2ZXN0b2NrIGtpdHMsIGNyb3AgYW5kIHZlZ2V0YWJsZSBraXRzIGFuZCBmaXNoZXJ5IGtpdHMpIGV4cGVyaWVuY2VkIGxhcmdlIHJhbXAgdXBzIGluIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCBhZnRlciB0aGUgYWRkaXRpb24gb2YgdGhlIDIwMjEgSUVSUC4gDQoNClRoZSBwbG90IGFib3ZlIHNob3dzIHRoZSBGU0MncyBhY2hpZXZlbWVudHMgYWNyb3NzIHRoZSBlaWdodCA1VyBhY3Rpdml0aWVzLiBUaGUgbWFqb3JpdHkgb2YgdGhlIGNhc2Vsb2FkIGZvciBtb250aGx5IGNhc2gtYmFzZWQgdHJhbnNmZXJzIHdhcyBlc3RhYmxpc2hlZCBpbiBlYXJseSAyMDIxICh3aXRoIHRoZSBudW1iZXIgb2YgYmVuZWZpY2lhcmllcyBvbmx5IGluY3JlYXNpbmcgdmVyeSBpbmNyZW1lbnRhbGx5IGFjcm9zcyB0aGUgY291cnNlIG9mIHRoZSB5ZWFyKS4gVGhpcyBoaWdobGlnaHRzIHR3byB0aGluZ3M6DQoNCiogTWFueSBwcm9qZWN0cyBjb250cmlidXRpbmcgdG8gdGhpcyBhY3Rpdml0eSByZXBlYXQgeWVhciBhZnRlciB5ZWFyIGFuZCBoYWQganVzdCBiZWVuIGluc2VydGVkIGludG8gdGhlIEhSUC4gDQoNCiogVGhlIG9wZXJhdGlvbmFsIGNvbnN0cmFpbnRzIGZvciB0aGUgaW1wbGVtZW50YXRpb24gb2YgSUVSUCBhc3Npc3RhbmNlIGhhdmUgcHVzaGVkIEZTQyBwYXJ0bmVycyB0byByZXNvcnQgdG8gbW9yZSBpbi1raW5kIGRlbGl2ZXJ5IGFzIG9wcG9zZWQgdG8gY2FzaC1iYXNlZCB0cmFuc2ZlcnMgKENCVCksIGVzcGVjaWFsbHkgaW4gcGVyaS11cmJhbiBhcmVhcyAoWWFuZ29uIGFuZCBNYW5kYWxheSkuIENhc2ggYXZhaWxhYmlsaXR5IGFmdGVyIHRoZSBjb3VwIGFuZCAiaW5zdHJ1Y3Rpb25zIiBmcm9tIHRoZSBkZS1mYWN0byBhdXRob3JpdGllcyBoYXZlIGxpbWl0ZWQgdGhlIHVzZSBvZiBDQlQ6IDk5LjclIG9mIElFUlAgYmVuZWZpY2lhcmllcyBpbiB0aGVzZSB0d28gcmVnaW9ucyB3ZXJlIHJlYWNoZWQgdGhyb3VnaCB0aGUgaW4ta2luZCBtb2RhbGl0eS4gDQoNClRoZSBwcm92aXNpb24gb2YgdGVjaG5pY2FsIHRyYWluaW5nIGZvbGxvd3MgdGhlIHNhbWUgcGF0dGVybiAod2l0aCBpdHMgY2FzZWxvYWQgYmVpbmcgbGFyZ2VseSBlc3RhYmxpc2hlZCBpbiBlYXJseSAyMDIxKSBhcyB0aGUgSUVSUCBkaWQgbm90IGluY2x1ZGUgdGhpcyB0eXBlIG9mIGFjdGl2aXR5IGFzIGl0IG9ubHkgaW5jbHVkZXMgbGlmZXNhdmluZyBhY3Rpdml0aWVzLiANCg0KSG93ZXZlciwgcHJvZ3Jlc3Mgb3ZlciB0aW1lIHdhcyBhbHNvIHN1YmplY3QgdG8gdGhlIGF2YWlsYWJpbGl0eSBvZiBmdW5kcyBhbmQgd2FzIGFsc28gbGlua2VkIHRvIHNlYXNvbmFsIGNhbGVuZGFycyAoaS5lLiBhZ3JpY3VsdHVyZSkuIFRoZXNlIHR3byByZWFzb25zIGxpbWl0IHRoZSBjYXBhY2l0eSBvZiB0aGUgRlNDIHRvIHJlYWNoIG1vcmUgdnVsbmVyYWJsZSBwZXJzb25zLiAyLjggbWlsbGlvbiBwZW9wbGUgcmVjZWl2ZWQgZm9vZCBhc3Npc3RhbmNlIHdoaWxzdCBvbmx5IDUwMCwwMDAgcmVjZWl2ZWQgc3VwcG9ydCBmb3IgYWdyaWN1bHR1cmUgYW5kIGxpdmVsaWhvb2QgYWN0aXZpdGllcy4gDQoNCkl0IGlzIGFsc28gZGlmZmljdWx0IHRvIGFzc2VzcyB0aGUgaW1wYWN0IG9mIGFjY2VzcyBvbiB0aGUgcHJvZ3Jlc3Mgb2YgYWN0aXZpdGllcyBvdmVyIHRpbWUgYXMgbWFueSBwYXJ0bmVycyB1c2UgZmxleGlibGUgZnVuZGluZyBvciBiZWNhdXNlIHByb2plY3RzIGhhZCBiZWVuIG1vZGlmaWVkIHdpdGggZG9ub3IgYXBwcm92YWwuIA0KDQoNCjxicj48YnI+DQoNCiMjIyAyLjIgRGVsaXZlcnkgbW9kYWxpdGllcw0KDQpDYXNoIGFuZCBpbi1raW5kIGRpc3RyaWJ1dGlvbnMgd2VyZSBlYWNoIHRoZSBtYWluIGRlbGl2ZXJ5IG1vZGFsaXR5IGluIHRocmVlIGFjdGl2aXRpZXMuIFRoZSBwcm92aXNpb24gb2Ygc2VydmljZXMgYW5kIHN1cHBvcnQgYmVpbmcgcHJlZG9taW5hbnQgaW4gdHdvLiBUaGUgaW4ta2luZCBtb2RhbGl0eSBoYXMgdGhlIGhpZ2hlc3QgcmVhY2ggKGluIHRlcm1zIG9mIGJlbmVmaWNpYXJpZXMpLCBnaXZlbiB0aGUgZXNwZWNpYWxseSBsYXJnZSBiZW5lZmljaWFyeSBudW1iZXJzIG9yaWdpbmF0aW5nIGZyb20gdGhlIHByb3Zpc2lvbiBvZiBtb250aGx5IGZvb2QgYmFza2V0cy4gU2V2ZXJhbCBtaXNjbGFzc2lmaWNhdGlvbnMgZS5nLiBzbWFsbCBwb3J0aW9ucyBvZiBtb250aGx5IGNhc2ggdHJhbnNmZXJzIGhhdmUgYmVlbiBjb2RlZCBhcyAiaW4ta2luZCIgYW5kIHNvbWUgaW4ta2luZCBmb29kIGJhc2tldHMgd2VyZSBjb2RlZCBhcyAiY2FzaCIgYW5kICJoeWJyaWQiLiANCg0KRm9yIG1vcmUgY2xhcml0eSwgaXQgd2lsbCBiZSB3b3J0aHdoaWxlIHRvIGJldHRlciBkaWZmZXJlbnRpYXRlICJzdXBwb3J0IGZvIGluY29tZSBnZW5lcmF0aW5nIGFjdGl2aXRpZXMiIGFuZCB0aGUgInByb3Zpc2lvbiBvZiB0ZWNobmljYWwgdHJhaW5pbmciIGFzIHRoZXNlIGFyZSwgaW4gbWFueSBjYXNlcywgcHJvdmlkZWQgaW4gdGhlIGZyYW1lIG9mIHRoZSBzYW1lIGludGVydmVudGlvbi4gDQoNCjxicj4NCg0KYGBge3IgYmFycGxvdC1mYWNldC1hY3Rpdml0eS1tb2RhbGl0eSwgZmlnLmhlaWdodD02fQ0KZnNjICU+JSANCiAgZmlsdGVyKCFpcy5uYShkZWxpdmVyeV9tb2RhbGl0eSkpICU+JSANCiAgZ3JvdXBfYnkoZGVsaXZlcnlfbW9kYWxpdHksIGFjdGl2aXR5KSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUNCiAgbXV0YXRlKGRlbGl2ZXJ5X21vZGFsaXR5ID0gcmVjb2RlKGRlbGl2ZXJ5X21vZGFsaXR5LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIeWJyaWQgKEluLWtpbmQgJiBDYXNoKSIgPSAiSHlicmlkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXJ2aWNlIGRlbGl2ZXJ5L3N1cHBvcnQiID0gIlNlcnZpY2VzL3N1cHBvcnQiKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBkZWxpdmVyeV9tb2RhbGl0eSwgeSA9IGJlbmVmaWNpYXJpZXMsIGZpbGwgPSBhY3Rpdml0eSkpICsNCiAgZ2VvbV9jb2woKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBjb21tYSkgKw0KICBsYWJzKHggPSAiIiwNCiAgICAgICB0aXRsZSA9ICJEZWxpdmVyeSBtb2RhbGl0eSBieSBhY3Rpdml0eSwgMjAyMSIsDQogICAgICAgc3VidGl0bGUgPSAiRmlndXJlcyBhcmUgaW4gYmVuZWZpY2lhcnkgZnJlcXVlbmNpZXMiKSArIA0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDAsIGhqdXN0ID0gMC41LCB2anVzdCA9IDAuNSkpICsNCiAgZmFjZXRfd3JhcCh+IGFjdGl2aXR5LCBzY2FsZXMgPSAiZnJlZV95IikNCg0KYGBgDQoNCjxicj4NCg0KYHIgcm91bmQoZmlsdGVyKGZzYywgZGVsaXZlcnlfbW9kYWxpdHkgPT0gIkluLWtpbmQiKSAlPiUge3N1bSguJGJlbmVmaWNpYXJpZXMpfSAvIHN1bShmc2MkYmVuZWZpY2lhcmllcykgKiAxMDApYCUgb2YgYmVuZWZpY2lhcnkgZnJlcXVlbmNpZXMgcmVjZWl2ZWQgc3VwcG9ydCB0aHJvdWdoIHRoZSBpbi1raW5kIHNlcnZpY2UgZGVsaXZlcnkuIEJlbmVmaWNpYXJ5IGZyZXF1ZW5jaWVzIGFyZSB1c2VkIGhlcmUgYXMgdGhlcmUgd2VyZSBzZXZlcmFsIGluc3RhbmNlcyBvZiBtb2RhbGl0aWVzIGNoYW5naW5nIHBhcnR3YXkgdGhyb3VnaCBhbiBpbnRlcnZlbnRpb24gb3ZlciB0aGUgY291cnNlIG9mIDIwMjEuIGByIHJvdW5kKGZpbHRlcihmc2MsIGRlbGl2ZXJ5X21vZGFsaXR5ID09ICJDYXNoIikgJT4lIHtzdW0oLiRiZW5lZmljaWFyaWVzKX0gLyBzdW0oZnNjJGJlbmVmaWNpYXJpZXMpICogMTAwKWAlIG9mIGJlbmVmaWNpYXJ5IGZyZXF1ZW5jaWVzIHdlcmUgcmVhY2hlZCB0aHJvdWdoIGNhc2ggdHJhbnNmZXJzLiBIb3dldmVyLCB0aGVzZSBvdmVyYWxsIGF2ZXJhZ2VzIGJlbGllIGhvdyB2ZXJ5IG1ham9yIGRpZmZlcmVuY2VzIGluIHRoZSB0eXBlcyBvZiBkZWxpdmVyeSBtb2RhbGl0aWVzIGVtcGxveWVkIGR1cmluZyB0aGUgSFJQIGFuZCB0aGUgSUVSUC4gDQoNCldpdGggcmVmZXJlbmNlIHRvIHRoZSBwbG90IGJlbG93LCBIUlAgYmVuZWZpY2lhcmllcyB3ZXJlIHJlYWNoZWQgd2l0aCBhIGZhaXJseSBldmVuIHNwbGl0IGJldHdlZW4gY2FzaCBhbmQgaW4ta2luZCBtb2RhbGl0aWVzLiBIb3dldmVyLCB1bmRlciB0aGUgSUVSUCwgdGhlIGluLWtpbmQgbW9kYWxpdHkgd2FzLCBieSBmYXIsIHRoZSBtb3N0IGNvbW1vbiBkZWxpdmVyeSBtZWNoYW5pc20gdXNlZC4gVGhpcyBtaWdodCBub3QgYmUgaW4gbGluZSB3aXRoIGJlbmVmaWNpYXJpZXMnIHByZWZlcmVuY2VzIG9uIGRlbGl2ZXJ5IG1lY2hhbmlzbXMgYW5kIG1heSBiZSBhIHJlZmxlY3Rpb24gb2YgaG93IGRlbGl2ZXJ5IG1vZGFsaXRpZXMgd2VyZSBpbXBhY3RlZCBieSB0aGUgZHluYW1pY3Mgb2YgdGhlIGNvbmZsaWN0IGFuZCB0aGUgdmFyaW91cyBjb250ZXh0dWFsIGFuZCBhZG1pbmlzdHJhdGl2ZSBjb25zdHJhaW50cy4gDQoNCjxicj4NCg0KYGBge3IgYmFycGxvdC1kZWxpdmVyeS1tb2RhbGl0aWVzfQ0KZnNjICU+JSANCiAgZmlsdGVyKCFpcy5uYShkZWxpdmVyeV9tb2RhbGl0eSkpICU+JSANCiAgZ3JvdXBfYnkoaHJwX2llcnAsIGRlbGl2ZXJ5X21vZGFsaXR5KSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGRlbGl2ZXJ5X21vZGFsaXR5LCB5ID0gYmVuZWZpY2lhcmllcywgZmlsbCA9IGhycF9pZXJwKSkgKw0KICBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpICsgDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19kKCkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEsIGJyZWFrcyA9IHNlcSgwLCAzMDAwMDAwLCBieSA9IDUwMDAwMCkpICsNCiAgbGFicyh4ID0gIkRlbGl2ZXJ5IG1vZGFsaXR5IiwgDQogICAgICAgeSA9ICJOdW1iZXIgb2YgYmVuZWZpY2lhcmllcyIsIA0KICAgICAgIHRpdGxlID0gIkJlbmVmaWNpYXJ5IGZyZXF1ZW5jaWVzIGJ5IGRlbGl2ZXJ5IG1vZGFsaXRpZXMgYW5kIHJlc3BvbnNlIHBsYW4iLA0KICAgICAgIHN1YnRpdGxlID0gIkZpZ3VyZXMgYXJlIGluIGJlbmVmaWNpYXJ5IGZyZXF1ZW5jaWVzIiwgDQogICAgICAgZmlsbCA9ICIiKQ0KYGBgDQoNCg0KPGJyPg0KDQpSZWdhcmRpbmcgdGhlIHRhYmxlIGFib3ZlLCB0aGVyZSBpcyBhIHN0cm9uZyBhcmd1bWVudCB0byByZW1vdmUgdGhlIG9wdGlvbiAib3RoZXIiIGZyb20gdGhlIDVXIGNvbHVtbiBgZnJlcXVlbmN5YCAocmVmZXJyaW5nIHRvIGZyZXF1ZW5jeSBvZiB0cmFuc2Zlci9kZWxpdmVyeSkuIFdoYXQgZXhhY3RseSBpdCBjb25ub3RlcyBpcyB1bmNsZWFyLCBhcyBwYXJ0bmVycyBtaWdodCBlbGVjdCB0aGlzIG9wdGlvbiBmb3IgYWN0aXZpdGllcyB0aGF0IG9jY3VyIGJvdGggbW9yZSBhbmQgbGVzcyBmcmVxdWVudGx5IHRoYW4gZXZlcnkgbW9udGguIFRoZXJlIGlzIGFsc28gdGhlIHBvc3NpYmlsaXR5IHRoYXQgcGFydG5lcnMgYXJlIGp1c3QgZWxlY3RpbmcgIm90aGVyIiBpbnN0ZWFkIG9mIGxlYXZpbmcgdGhlIGNvbHVtbiBibGFuay4gIA0KDQo8YnI+DQoNCg0KYGBge3IgdGFibGUtbW9kYWxpdHktZnJlcXVlbmN5fQ0KDQojIGNoYW5nZWQgdG8gYmVuZWZpY2lhcnkgZnJlcXVlbmNpZXMgaW5zdGVhZCBvZiB1bmlxdWUgYmVuZWZpY2lhcmllcyANCmZzYyAlPiUgDQogIGZpbHRlcighaXMubmEoZGVsaXZlcnlfbW9kYWxpdHkpKSAlPiUgDQogIGdyb3VwX2J5KGRlbGl2ZXJ5X21vZGFsaXR5LCBmcmVxdWVuY3kpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcyksIC5ncm91cHMgPSAiZHJvcCIpICU+JSANCiAgZmlsdGVyKGJlbmVmaWNpYXJpZXMgPiAwKSAlPiUgDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBmcmVxdWVuY3ksIHZhbHVlc19mcm9tID0gYmVuZWZpY2lhcmllcykgJT4lIA0KICBhZG9ybl90b3RhbHMoImNvbCIsIG5hLnJtID0gVFJVRSkgJT4lIA0KICBtdXRhdGUoYCVUb3RhbGAgPSByb3VuZChUb3RhbCAvIHN1bShUb3RhbCkgKiAxMDAsIGRpZ2l0cyA9IDIpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhUb3RhbCkpICU+JSANCiAgYWRvcm5fdG90YWxzKCJyb3ciLCBuYS5ybSA9IFRSVUUpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJCZW5lZmljaWFyeSBmcmVxdWVuY2llcyBieSBkZWxpdmVyeSBtb2RhbGl0aWVzIGFuZCBmcmVxdWVuY3kgb2YgZGlzdHJpYnV0aW9uIiwgZm9ybWF0LmFyZ3MgPSBsaXN0KGJpZy5tYXJrID0gIiwiKSkgJT4lIA0KICBrYWJsZV9jbGFzc2ljXzIoInN0cmlwZWQiKSAlPiUgDQogIGZvb3Rub3RlKGdlbmVyYWwgPSAiQmVuZWZpY2lhcnkgZnJlcXVlbmNpZXMgcmVwb3J0ZWQgd2l0aG91dCBhIGRlbGl2ZXJ5IG1vZGFsaXR5IHNwZWNpZmllZCBoYXZlIGJlZW4gZXhjbHVkZWQiLCANCiAgICAgICAgICAgZ2VuZXJhbF90aXRsZSA9ICIiKQ0KICAjIHBhbmRlcihjYXB0aW9uID0gIkJlbmVmaWNpYXJ5IGZyZXF1ZW5jaWVzIGJ5IGRlbGl2ZXJ5IG1vZGFsaXRpZXMgYW5kIGZyZXF1ZW5jeSBvZiBkaXN0cmlidXRpb24iKQ0KDQpgYGANCg0KPGJyPg0KDQpUaGUgIkZpcnN0IiBjYXRlZ29yeSBkb2VzIG5vdCByZWFsbHkgaGF2ZSBtdWNoIHJlbGF0aW9uIHRvIHRoZSAiTW9udGhseSIgY2F0ZWdvcnksIGkuZS4gYW4gaW5jcmVhc2UgaW4gYmVuZWZpY2lhcmllcyByZXBvcnRlZCBhcyAiRmlyc3QiIGRvIG5vdCBjb3JyZXNwb25kIHRvIGFuIGluY3JlYXNlIGluICJNb250aGx5IiBiZW5lZmljaWFyaWVzIGluIHRoZSBmb2xsb3dpbmcgbW9udGhzLCBtZWFuaW5nIHRoYXQgdGhlc2UgYmVuZWZpY2lhcmllcyBzaG91bGQgZmFsbCB1bmRlciB0aGUgIk9uZS1vZmYiIGNhdGVnb3J5LiBGb3Igbm9uLW1vbnRobHkgcm91dGluZSBhY3Rpdml0aWVzIChhZ3JpY3VsdHVyZSwgbGl2ZWxpaG9vZHMpLCB0aGVyZSBpcyBubyByZWxhdGlvbiAiRmlyc3QiIGFuZCB0aGUgIk1vbnRobHkiIGNhdGVnb3JpZXMuIA0KDQpUaGUgY29sdW1uIGBtb250aHNfb2ZfZm9vZF9yYXRpb25fZGlzdHJpYnV0ZWRgLCBidXQgdGhpcyBjb2x1bW4gaXMgbGFyZ2VseSBibGFuayBhbmQgbm9uLU5BIHZhbHVlcyBoYXZlIGFsc28gbm90IGJlZW4gZmlsbGVkIHdlbGwsIG1lYW5pbmcgdGhhdCBhIGtleSBwaWVjZSBvZiBkYXRhIC0tIGFjdGl2aXR5IGR1cmF0aW9ucyAtLSBoYXMgbm90IGJlZW4gZWZmZWN0aXZlbHkgY2FwdHVyZWQuIEhvd2V2ZXIsIGEgd29ya2Fyb3VuZCAtLSByZXF1aXJpbmcgY29uc2lkZXJhYmxlIGVmZm9ydCwgeWllbGRzIHRoZSB0YWJsZSBiZWxvdywgc2hvd2luZyB0aGUgYXZlcmFnZSBkdXJhdGlvbiAoaW4gbW9udGhzKSBvZiB0aGUgdmFyaW91cyBhY3Rpdml0aWVzIGNsYXNzaWZpZWQgYXMgIk1vbnRobHkiIHVuZGVyIHRoZSBgZnJlcXVlbmN5YCBjb2x1bW46DQoNCg0KYGBge3IgdGFibGUtYXZnLWR1cmF0aW9uLWFjdGl2aXRpZXN9DQpmc2MgJT4lICANCiAgZmlsdGVyKGZyZXF1ZW5jeSA9PSAiTW9udGhseSIpICU+JSANCiAgZ3JvdXBfYnkoYWN0aXZpdHksIHRvd25zaGlwLCBsb2NhdGlvbikgJT4lDQogIHN1bW1hcmlzZShyZWN1cnJlbmNlcyA9IG5fZGlzdGluY3QoZGF0ZSksIC5ncm91cHMgPSAiZHJvcCIpICU+JQ0KICBncm91cF9ieShhY3Rpdml0eSkgJT4lIA0KICBzdW1tYXJpc2UoYXZnX2R1cmF0aW9uX21vbnRocyA9IHJvdW5kKG1lYW4ocmVjdXJyZW5jZXMpLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBhcnJhbmdlKGRlc2MoYXZnX2R1cmF0aW9uX21vbnRocykpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJBdmVyYWdlIGR1cmF0aW9uIChpbiBtb250aHMpIG9mIG1vbnRobHkgYWN0aXZpdGllcyIpICU+JSANCiAga2FibGVfY2xhc3NpY18yKGZ1bGxfd2lkdGggPSBGQUxTRSwgcG9zaXRpb24gPSAibGVmdCIpICU+JSAgDQogIGZvb3Rub3RlKCJPbmx5ICdtb250aGx5JyBhY3Rpdml0aWVzIGluY2x1ZGVkIiwgDQogICAgICAgICAgIGdlbmVyYWxfdGl0bGUgPSAiIikNCiAgIyBwYW5kZXIoY2FwdGlvbiA9ICJBdmVyYWdlIGR1cmF0aW9uIChpbiBtb250aHMpIG9mIG1vbnRobHkgYWN0aXZpdGllcyIpDQogIA0KYGBgDQoNCjxicj48YnI+DQoNCiMjIyAyLjMgTW9uZXRhcnkgdmFsdWVzIG9mIGludGVydmVudGlvbiBwYWNrYWdlcyBwZXIgaG91c2Vob2xkDQoNCjxicj4NCg0KYGBge3IgcGxvdC11c2QtaGhkLWJpbn0NCmZzYyAlPiUgDQogIGZpbHRlcih1bmlxdWVfYmVuZWZpY2lhcmllcyA9PSAiWWVzIiAmICFpcy5uYSh1c2RfaGhkX2JpbikpICU+JQ0KICBmaWx0ZXIoZGVsaXZlcnlfbW9kYWxpdHkgJWluJSBjKCJDYXNoIiwgIkh5YnJpZCAoSW4ta2luZCAmIENhc2gpIiwgIlZvdWNoZXIiKSkgJT4lDQogIGdyb3VwX2J5KHVzZF9oaGRfYmluKSAlPiUgIA0KICBzdW1tYXJpc2UoaG91c2Vob2xkcyA9IHN1bShob3VzZWhvbGRzKSkgJT4lDQogIG11dGF0ZShgJV9vZl9ob3VzZWhvbGRzYCA9IHJvdW5kKGhvdXNlaG9sZHMgLyBzdW0oaG91c2Vob2xkcykqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gdXNkX2hoZF9iaW4sIHkgPSBob3VzZWhvbGRzLCBmaWxsID0gdXNkX2hoZF9iaW4pKSArDQogIGdlb21fY29sKCkgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gYCVfb2ZfaG91c2Vob2xkc2ApLCB2anVzdCA9IC0wLjUsIHNpemUgPSAzKSArDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19kKG9wdGlvbiA9ICJtYWtvIiwgZGlyZWN0aW9uID0gLTEpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hLCBicmVha3MgPSBzZXEoMCwgMjUwMDAsIGJ5ID0gNTAwMCkpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLCANCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAzMCwgaGp1c3QgPSAwLjgsIHZqdXN0ID0gMC45KSkgKw0KICBsYWJzKHggPSAiVVNEIHZhbHVlIG9mIGNhc2ggdHJhbnNmZXIgcGVyIGhvdXNlaG9sZCBwZXIgbW9udGgiLA0KICAgICAgIHkgPSAiTnVtYmVyIG9mIGhvdXNlaG9sZHMiLA0KICAgICAgIHRpdGxlID0gIk51bWJlciBvZiBob3VzZWhvbGRzIGJ5IHZhbHVlIG9mIGNhc2ggdHJhbnNmZXIgcGVyIGhvdXNlaG9sZCIsDQogICAgICAgc3VidGl0bGUgPSAiRmlndXJlcyBhdCB0aGUgdG9wIG9mIGVhY2ggYmFyIHNob3cgcGVyY2VudGFnZSBvZiBob3VzZWhvbGRzXG5Pbmx5IGhvdXNlaG9sZHMgcmVhY2hlZCB0aHJvdWdoIHRoZSBjYXNoLCBoeWJyaWQgb3Igdm91Y2hlciBtb2RhbGl0aWVzIGFyZSBpbmNsdWRlZCIpDQpgYGANCg0KPGJyPg0KDQoNClRoZSBtb3N0IGNvbW1vbiB0cmFuc2ZlciB2YWx1ZXMgLS0gaW4gdGVybXMgb2YgYmVuZWZpY2lhcmllcyByZWFjaGVkIC0tIGFyZSBiZXR3ZWVuIFVTRCA2MCBhbmQgNzAsIGl0IHNob3VsZCBhbHNvIGJlIG5vdGVkIHRoYXQgYSBub3QgaW5zaWduaWZpY2FudCBudW1iZXIgb2YgaG91c2Vob2xkcyAoYWJvdXQgOCUpIHdlcmUgcmVhY2hlZCBieSBjYXNoIHRyYW5zZmVyIGludGVydmVudGlvbnMgdmFsdWVkIGF0IFVTRCAxMDAgcGVyIGhvdXNlaG9sZCBvciBtb3JlICh1c3VhbGx5IGxpdmVsaWhvb2RzIGludGVydmVudGlvbnMpLiBJdCBzaG91bGQgYWxzbyBiZSBub3RlZCB0aGF0IDM1JSBvZiB0aGUgaG91c2Vob2xkcyB3aG8gcmVjZWl2ZWQgdHJhbnNmZXJzIHZhbHVlcyBhdCBiZWxvdyBVU0QgNDAvbW9udGggd2VyZSB0aGUgYmVuZWZpY2lhcmllcyBvZiB0aGUgImh5YnJpZCIgZGVsaXZlcnkgbW9kYWxpdHksIGFuZCB0aGUgdmFsdWUgb2YgdGhlIGluLWtpbmQgZ29vZHMgdGhleSByZWNlaXZlZCBoYXZlIG5vdCBiZWVuIGluY2x1ZGVkIGluIHRoaXMgc3VtIGFzIEZTQyBwYXJ0bmVycyBoYXZlIG5vdCBwcm92aWRlZCB0aGUgbW9uZXRhcnkgdmFsdWVzIG9mIGluLWtpbmQgYWN0aXZpdGllcy4gUGxlYXNlIG5vdGUgdGhhdCB0aGVzZSBtb25ldGFyeSB2YWx1ZXMgd2VyZSBjYWxjdWxhdGVkIG9ubHkgZnJvbSB1bmlxdWUgYmVuZWZpY2lhcnkgaG91c2Vob2xkcyBhbmQgdGhhdCB0aGVzZSBhcmUgbm90IHRoZSBjdW11bGF0aXZlIHN1bXMgcGVyIGhvdXNlaG9sZC4NCg0KDQpgYGB7ciB0YWJsZS11c2QtaGhkLWJpbi1mcmVxdWVuY3l9DQpjYXNoX2RlbGl2ZXJ5X21lY2hhbmlzbSA8LSBmc2MgJT4lICANCiAgZmlsdGVyKCFpcy5uYSh1c2RfaGhkX2JpbikgJiB1bmlxdWVfYmVuZWZpY2lhcmllcyA9PSAiWWVzIiAmICFpcy5uYShjYXNoX2RlbGl2ZXJ5X21lY2hhbmlzbSkgKSAlPiUgDQogIGZpbHRlcihkZWxpdmVyeV9tb2RhbGl0eSAlaW4lIGMoIkNhc2giLCAiSHlicmlkIChJbi1raW5kICYgQ2FzaCkiLCAiVm91Y2hlciIpKSAlPiUgDQogIG11dGF0ZShob3VzZWhvbGRzID0gcm91bmQoaG91c2Vob2xkcykpICU+JSANCiAgZ3JvdXBfYnkoY2FzaF9kZWxpdmVyeV9tZWNoYW5pc20pICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcyksIA0KICAgICAgICAgICAgaG91c2Vob2xkcyA9IHN1bShob3VzZWhvbGRzKSkgJT4lIA0KICBtdXRhdGUocGNfb2ZfaGhkID0gcm91bmQoaG91c2Vob2xkcyAvIHN1bShob3VzZWhvbGRzKSAqIDEwMCwgZGlnaXRzID0gMiksDQogICAgICAgICBwY19vZl9iZW4gPSByb3VuZChiZW5lZmljaWFyaWVzIC8gc3VtKGJlbmVmaWNpYXJpZXMpICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICByZWxvY2F0ZShwY19vZl9iZW4sIC5hZnRlciA9IGJlbmVmaWNpYXJpZXMpICU+JSANCiAgYXJyYW5nZShkZXNjKGhvdXNlaG9sZHMpKQ0KDQpjYXNoX2RlbGl2ZXJ5X21lY2hhbmlzbSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiQ2FzaCB0cmFuc2ZlciwgaHlicmlkIGFuZCB2b3VjaGVyIHZhbHVlcyBwZXIgaG91c2Vob2xkLCBieSBjYXNoIGRlbGl2ZXJ5IG1lY2hhbmlzbSAoVVNEKSIsIA0KICAgICAgICBmb3JtYXQuYXJncyA9IGxpc3QoYmlnLm1hcmsgPSAiLCIpKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMihsaWdodGFibGVfb3B0aW9ucyA9ICJzdHJpcGVkIiwgcG9zaXRpb24gPSAibGVmdCIsIGZ1bGxfd2lkdGggPSBGQUxTRSkgJT4lIA0KICBmb290bm90ZShnZW5lcmFsID0gIk9ubHkgaG91c2Vob2xkcyB3aGljaCB3ZXJlIHJlYWNoZWQgYnkgY2FzaCwgaHlicmlkIG9yIHZvdWNoZXIgbW9kYWxpdGllcyBhcmUgaW5jbHVkZWQiLCANCiAgICAgICAgICAgZ2VuZXJhbF90aXRsZSA9ICIiKQ0KIyBwYW5kZXIoY2FwdGlvbiA9ICJDYXNoIHRyYW5zZmVyLCBoeWJyaWQgYW5kIHZvdWNoZXIgdmFsdWVzIHBlciBob3VzZWhvbGQgYnkgY2FzaCBkZWxpdmVyeSBtZWNoYW5pc20gKFVTRCkiKQ0KDQpgYGANCg0KPGJyPg0KDQpCeSBmYXIgdGhlIG1vc3QgY29tbW9uIGNhc2ggZGVsaXZlcnkgbWVjaGFuaXNtIHdhcyBkaXJlY3QgY2FzaCBwYXltZW50cyAtLSBgciBmaWx0ZXIoY2FzaF9kZWxpdmVyeV9tZWNoYW5pc20sIGNhc2hfZGVsaXZlcnlfbWVjaGFuaXNtID09ICJEaXJlY3QgY2FzaCBwYXltZW50IikgJT4lICBwdWxsKHBjX29mX2hoZClgJSBvZiBob3VzZWhvbGRzIHdlcmUgcmVhY2hlZCB0aHJvdWdoIHRoaXMgbWVjaGFuaXNtLiBUcmFuc2ZlcnMgbWFkZSB0aHJvdWdoIE1vbmV5IHRyYW5zZmVyIGFnZW50cyBoYWQgdGhlIGhpZ2hlc3QgYXZlcmFnZSB0cmFuc2ZlciBhbW91bnQuIA0KDQoNCg0KVGhpcyBuZXh0IHNlY3Rpb24gaGlnaGxpZ2h0cyBob3VzZWhvbGQgcGFja2FnZSB2YWx1ZXMgYnkgYWN0aXZpdHkgdHlwZToNCg0KYGBge3IgdGFibGUtdXNkLXZhbHVlcy1hY3Rpdml0eX0NCmF2Z190cmFuc2Zlcl92YWx1ZSA8LSBmc2MgJT4lIA0KICBmaWx0ZXIoZGVsaXZlcnlfbW9kYWxpdHkgJWluJSBjKCJDYXNoIiwgIkh5YnJpZCAoSW4ta2luZCAmIENhc2gpIiwgIlZvdWNoZXIiKSkgJT4lDQogIGZpbHRlcihuZXdfdmFsdWVfaGhkIDwgMTAwMCkgJT4lIA0KICBncm91cF9ieShhY3Rpdml0eSkgJT4lIA0KICBzdW1tYXJpc2UoaGhkX2ZyZXF1ZW5jaWVzID0gcm91bmQoc3VtKGhvdXNlaG9sZHMsIG5hLnJtID0gVFJVRSkpLA0KICAgICAgICAgICAgdG90YWxfdmFsdWVfdXNkID0gcm91bmQoc3VtKHRvdGFsX3ZhbHVlX3VzZCwgbmEucm0gPSBUUlVFKSkpICU+JSANCiAgbXV0YXRlKGF2Z190cmFuc2Zlcl92YWx1ZSA9IHJvdW5kKHRvdGFsX3ZhbHVlX3VzZCAvIGhoZF9mcmVxdWVuY2llcywgZGlnaXRzID0gMikpICU+JSANCiAgYXJyYW5nZShkZXNjKGF2Z190cmFuc2Zlcl92YWx1ZSkpIA0KDQphdmdfdHJhbnNmZXJfdmFsdWUgJT4lICANCiAga2FibGUoY2FwdGlvbiA9ICJBdmVyYWdlIHZhbHVlIChVU0QpIG9mIGhvdXNlaG9sZCBwYWNrYWdlIHZhbHVlcyBwZXIgYWN0aXZpdHkiLCANCiAgICAgICAgZm9ybWF0LmFyZ3MgPSBsaXN0KGJpZy5tYXJrID0gIiwiKSkgJT4lIA0KICBrYWJsZV9jbGFzc2ljXzIobGlnaHRhYmxlX29wdGlvbnMgPSAic3RyaXBlZCIpICU+JSANCiAgY29sdW1uX3NwZWMoNCwgY29sb3IgPSAid2hpdGUiLCBiYWNrZ3JvdW5kID0gc3BlY19jb2xvcihhdmdfdHJhbnNmZXJfdmFsdWUkYXZnX3RyYW5zZmVyX3ZhbHVlWzE6N10sIGVuZCA9IDAuOCwgZGlyZWN0aW9uID0gLTEpKSAlPiUNCiAgZm9vdG5vdGUoZ2VuZXJhbCA9ICJPbmx5IGhvdXNlaG9sZHMgd2hpY2ggd2VyZSByZWFjaGVkIGJ5IGNhc2gsIGh5YnJpZCBvciB2b3VjaGVyIG1vZGFsaXRpZXMgYXJlIGluY2x1ZGVkOyBleHRyZW1lIHZhbHVlcyBmaWx0ZXJlZCBvdXQiLCANCiAgICAgICAgICAgZ2VuZXJhbF90aXRsZSA9ICIiKQ0KIyBwYW5kZXIoY2FwdGlvbiA9ICJBdmVyYWdlIHZhbHVlIChVU0QpIG9mIGhvdXNlaG9sZCBwYWNrYWdlIHZhbHVlcyBwZXIgYWN0aXZpdHkiKQ0KICANCmBgYA0KDQo8YnI+DQoNCk92ZXJhbGwsIHRoZSBoaWdoZXN0IGF2ZXJhZ2UgY2FzaCB0cmFuc2ZlcnMgd2VyZSBmcm9tIHRoZSBwcm92aXNpb24gb2YgbGl2ZXN0b2NrIGtpdHMgYW5kIHRoZSBsb3dlc3QgYXZlcmFnZXMgZnJvbSBDYXNoIGZvciB3b3JrL2Zvb2QgZm9yIGFzc2V0cyBhY3Rpdml0aWVzIChhZnRlciBmaWx0ZXJpbmcgb3V0IGZvb2QgYmFza2V0cyByZXBvcnRlZCBhcyBjYXNoKS4gUGxlYXNlIGFsc28gbm90ZSB0aGF0IGZvciB0aGUgdGFibGUgYWJvdmUsIGFsbCBwZXItaG91c2Vob2xkIHZhbHVlcyBhYm92ZSBVU0QgMSwwMDAgcGVyIHRyYW5zZmVyIGhhdmUgYmVlbiBmaWx0ZXJlZCBvdXQgYXMgdGhleSBhcmUgbGlrZWx5IGVycm9ycyBhcyB0aGV5IG9ubHkgcGVydGFpbiB0byBjYXNoIGZvciB3b3JrIC8gZm9vZCBmb3IgYXNzZXRzIGFuZCBtb250aGx5IGNhc2gtYmFzZWQgdHJhbnNmZXJzLiANCg0KVGhlc2UgZXh0cmVtZSB2YWx1ZXMgaGF2ZSBub3QgYmVlbiBmaWx0ZXJlZCBvdXQgZm9yIHRoZSB0YWJsZSBiZWxvdyBvZiBzdW1tYXJ5IHN0YXRpc3RpY3MgZm9yIHRoZSBkaWZmZXJlbnQgcGFja2FnZSB2YWx1ZXMgcGVyIGFjdGl2aXR5LiBPZiBub3RlLCB0aGUgc3RhbmRhcmQgZGV2aWF0aW9ucyBmb3IgY2FzaCBmb3Igd29yay9mb29kIGZvciBhc3NldHMgYW5kIGluY29tZS1nZW5lcmF0aW5nIGFjdGl2aXRpZXMgYXJlIHZlcnkgaGlnaCBpbiBjb21wYXJpc29uIHRvIHRoZSBtZWFuOiBib3RoIG9mIHRoZXNlIGhhdmUgZXh0cmVtZSBvdXRsaWVycyBpbiB0ZXJtcyBvZiBwYWNrYWdlIHZhbHVlcy4gIA0KDQpgYGB7ciB0YWJsZS1zdW1tYXJ5LXN0YXRpc3RpY3MtbW9uZXRhcnkgdmFsdWVzfQ0KZnNjICU+JSANCiAgZmlsdGVyKCFpcy5uYShuZXdfdmFsdWVfaGhkKSkgJT4lIA0KICBmaWx0ZXIodW5pcXVlX2JlbmVmaWNpYXJpZXMgPT0gIlllcyIpICU+JQ0KICBmaWx0ZXIoZGVsaXZlcnlfbW9kYWxpdHkgJWluJSBjKCJDYXNoIiwgIkh5YnJpZCAoSW4ta2luZCAmIENhc2gpIiwgIlZvdWNoZXIiKSkgJT4lDQogIGdyb3VwX2J5KGFjdGl2aXR5KSAlPiUgDQogIHN1bW1hcmlzZShob3VzZWhvbGRzID0gc3VtKGhvdXNlaG9sZHMpLA0KICAgICAgICAgICAgbWVhbiA9IG1lYW4obmV3X3ZhbHVlX2hoZCksDQogICAgICAgICAgICBtZWRpYW4gPSBtZWRpYW4obmV3X3ZhbHVlX2hoZCksIA0KICAgICAgICAgICAgc2QgPSBzZChuZXdfdmFsdWVfaGhkKSwgDQogICAgICAgICAgICBhYWQgPSBtYWQobmV3X3ZhbHVlX2hoZCkpICU+JSANCiAgbXV0YXRlKGFjcm9zcyhjKG1lYW4sIG1lZGlhbiwgc2QsIGFhZCksIH4gcm91bmQoLiwgZGlnaXRzID0gMikpLA0KICAgICAgICAgaG91c2Vob2xkcyA9IHJvdW5kKGhvdXNlaG9sZHMpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhtZWFuKSkgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIlN1bW1hcnkgc3RhdGlzdGljcyBvZiBtb25ldGFyeSB2YWx1ZXMgYnkgYWN0aXZpdHk7XG5jb250YWlucyBvbmx5IGRhdGEgZnJvbSBhY3Rpdml0aWVzIHVzaW5nIGNhc2gsIGh5YnJpZCBvciB2b3VjaGVyIG1vZGFsaXRpZXMiLCBmb3JtYXQuYXJncyA9IGxpc3QoYmlnLm1hcmsgPSAiLCIpKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMigic3RyaXBlZCIpICU+JSANCiAgZm9vdG5vdGUoZ2VuZXJhbCA9ICJTRCAoc3RhbmRhcmQgZGV2aWF0aW9uKSwgQUFEIChhdmVyYWdlIGFic29sdXRlIGRldmlhdGlvbikiLCBnZW5lcmFsX3RpdGxlID0gIiIpDQpgYGANCg0KPGJyPg0KDQpCdXQgYXZlcmFnZSBwYWNrYWdlIHZhbHVlcyBhcmUgb25seSBwYXJ0IG9mIHRoZSBwaWN0dXJlIGFuZCBzaWduaWZpY2FudCB2YXJpYXRpb24gaW4gdHJhbnNmZXIgdmFsdWVzIGV4aXN0cyB3aXRoaW4gZWFjaCBhY3Rpdml0eS4gQ2xlYXIgbWFqb3JpdGllcyBvZiB0aGUgaG91c2Vob2xkcyB3aG8gYmVuZWZpdGVkIGZvcm0gY2FzaCB0cmFuc2ZlcnMgcmVjZWl2ZWQgdmFsdWVzIG9mIGJldHdlZW4gVVNEIDYwLTcwLCB3aGlsZSB0aG9zZSB3aG8gYmVuZWZpdGVkIGZyb20gY3JvcCBhbmQgdmVnZXRhYmxlIGtpdHMgcmVjZWl2ZWQgdmFsdWVzIGJldHdlZW4gVVNEIDUwLTYwLiBUaGlzIHN1Z2dlc3RzIHRoYXQgdGhlc2UgYWN0aXZpdGllcyBjb3VsZCByZWxhdGl2ZWx5IHN0YW5kYXJkaXNlZC4gDQoNCjxicj4NCg0KYGBge3IgYmFycGxvdC1mYWNldC11c2QtaGhkLWJpbi1hY3Rpdml0eSwgZmlnLmhlaWdodD03fQ0KZnNjICU+JSANCiAgZmlsdGVyKCFpcy5uYSh1c2RfaGhkX2JpbikgJiB1bmlxdWVfYmVuZWZpY2lhcmllcyA9PSAiWWVzIikgJT4lIA0KICBmaWx0ZXIoZGVsaXZlcnlfbW9kYWxpdHkgJWluJSBjKCJDYXNoIiwgIkh5YnJpZCAoSW4ta2luZCAmIENhc2gpIiwgIlZvdWNoZXIiKSkgJT4lDQogIGdyb3VwX2J5KGFjdGl2aXR5LCB1c2RfaGhkX2JpbikgJT4lIA0KICBzdW1tYXJpc2UoaG91c2Vob2xkcyA9IHN1bShob3VzZWhvbGRzKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSB1c2RfaGhkX2JpbiwgeSA9IGhvdXNlaG9sZHMsIGZpbGwgPSBhY3Rpdml0eSkpICsNCiAgZ2VvbV9jb2woKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBjb21tYSkgKw0KICBsYWJzKHggPSAiIikgKw0KICBsYWJzKHRpdGxlID0gIlZhcmlhdGlvbiBpbiB0aGUgcGVyIGhvdXNlaG9sZCB2YWx1ZXMgb2YgaW50ZXJ2ZW50aW9uIHBhY2thZ2VzIGluIFVTRCIsIA0KICAgICAgIHN1YnRpdGxlID0gIkZhY2V0ZWQgYnkgYWN0aXZpdHk7IGNvbnRhaW5zIG9ubHkgZGF0YSBmcm9tIGFjdGl2aXRpZXMgdXNpbmcgY2FzaCwgaHlicmlkIG9yIHZvdWNoZXIgbW9kYWxpdGllcyIpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLCANCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgdmp1c3QgPSAwLjUpLCANCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpKSArDQogIGZhY2V0X3dyYXAofiBhY3Rpdml0eSwgc2NhbGVzID0gImZyZWVfeSIpDQoNCmBgYA0KDQo8YnI+DQoNCkluIHRoaXMgc2VjdGlvbiwgdGhlIEZTQyBoYXMgdHJpZWQgdG8gd29yayBhcm91bmQgc2V2ZXJhbCBkYXRhIGVudHJ5IGVycm9ycyBpbiB0aGUgNVcgcmVwb3J0aW5nIC0tIHRoZSBwZXIgaG91c2Vob2xkIHZhbHVlcyBvZiBjYXNoIHRyYW5zZmVycyBoYXZlIGJlZW4gcmVjYWxjdWxhdGVkIHVzaW5nIHRoZSBudW1iZXIgb2YgaG91c2Vob2xkcyByZWFjaGVkIGFuZCB0aGUgdG90YWwgdmFsdWUgKGluIFVTRCkgb2YgdGhlIGNhc2ggdHJhbnNmZXJzIHByb3ZpZGVkLiBHb2luZyBmb3J3YXJkLCBpdCBpcyBuZWNlc3NhcnkgdG8gcmV2aWV3IGFuZCBjb25maXJtIHRoZXNlIGVycm9ycyB3aXRoIHBhcnRuZXJzIGFuZCBjbGVhbiB0aGUgNVcgZGF0YXNldCBhcyBtYW55IG9mIHRoZW0gaGF2ZSByZWNvcmRlZCBjYXNoIHRyYW5zZmVyIHZhbHVlcyBvZiBhcm91bmQgVVNEIDEwLjUwIHBlciBob3VzZWhvbGQgYXMgb3Bwb3NlZCB0byBvdXIgcmVjYWxjdWxhdGVkIHZhbHVlIHdoaWNoIGF2ZXJhZ2VzIG91dCBhdCBVU0QgYHIgcm91bmQoZnNjICU+JSBmaWx0ZXIodmFsdWVfcGVyX2hvdXNlaG9sZF91c2QgPT0gMTAuNSkgJT4lIHttZWRpYW4oLiRuZXdfdmFsdWVfaGhkKX0sIGRpZ2l0cyA9IDIpYDsgaXQgaXMgc3VzcGVjdGVkIHRoYXQgdGhlIHBlciBiZW5lZmljaWFyeSB2YWx1ZSBtYXkgaGF2ZSBiZWVuIGVudGVyZWQgYXMgb3Bwb3NlZCB0byB0aGUgdmFsdWUgcGVyIGhvdXNlaG9sZC4gDQoNClRoZXNlIHJlY2FsY3VsYXRlZCB2YWx1ZXMgaGF2ZSBiZWVuIHVzZWQgaW4gdGhlIHBsb3QgYmVsb3csIHdoaWNoIHN1bW1hcmlzZXMgdGhlIHBlciBob3VzZWhvbGQgcGVyIG1vbnRoIHZhbHVlIG9mIHRoZSB0b3AgNSBpbXBsZW1lbnRpbmcgKGJ5IGJlbmVmaWNpYXJpZXMgcmVhY2hlZCkgcGFydG5lcnMgYnkgYWN0aXZpdHksIGV4Y2x1ZGluZyBsaXZlc3RvY2sgYW5kIGZpc2hlcnkga2l0cywgd2hpY2gsIGFzIG1lbnRpb25lZCwgZG8gbm90IGhhdmUgYXMgbXVjaCB2YXJpYXRpb24gYXMgdGhlIG90aGVyIGFjdGl2aXRpZXM6DQoNCjxicj4NCg0KYGBge3IgZmFjZXQtdXNkLXBhY2thZ2UtYnktYWN0aXZpdHl9DQpmc2MgJT4lIA0KICBmaWx0ZXIodW5pcXVlX2JlbmVmaWNpYXJpZXMgPT0gIlllcyIgJiAhaXMubmEodXNkX2hoZF9iaW4pKSAlPiUNCiAgZmlsdGVyKGRlbGl2ZXJ5X21vZGFsaXR5ICVpbiUgYygiQ2FzaCIsICJIeWJyaWQgKEluLWtpbmQgJiBDYXNoKSIsICJWb3VjaGVyIikpICU+JQ0KICBmaWx0ZXIoYWN0aXZpdHkgJW91dCUgYygiUHJvdmlkZSBmaXNoZXJ5IGtpdHMiLCAiUHJvdmlkZSBsaXZlc3RvY2sga2l0cyIpKSAlPiUgDQogIGZpbHRlcihuZXdfdmFsdWVfaGhkIDwgNzAwICYgYWN0aXZpdHkgIT0gIlByb3ZpZGUgbW9udGhseSBmb29kIGJhc2tldHMiKSAlPiUgDQogIGdyb3VwX2J5KGFjdGl2aXR5LCBpbXBsZW1lbnRpbmdfcGFydG5lcnMpICU+JSANCiAgc3VtbWFyaXNlKG1lYW5fdXNkID0gbWVhbihuZXdfdmFsdWVfaGhkKSwgDQogICAgICAgICAgICBiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpLCANCiAgICAgICAgICAgIGhvdXNlaG9sZHMgPSBzdW0oaG91c2Vob2xkcykpICU+JSANCiAgYXJyYW5nZShkZXNjKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIG11dGF0ZShtZWFuX3VzZCA9IGlmZWxzZShhY3Rpdml0eSA9PSAiUHJvdmlkZSBtb250aGx5IGNhc2gtYmFzZWQgdHJhbnNmZXJzIiwgbWVhbl91c2QgLyAoYmVuZWZpY2lhcmllcyAvIGhvdXNlaG9sZHMpLCBtZWFuX3VzZAkpKSAlPiUgDQogIHRvcF9uKDUpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gbWVhbl91c2QsIHkgPSBpbXBsZW1lbnRpbmdfcGFydG5lcnMsIGZpbGwgPSBhY3Rpdml0eSkpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hX2Zvcm1hdChhY2N1cmFjeSA9IDEpKSArDQogIGdlb21fY29sKCkgKyANCiAgZmFjZXRfd3JhcCh+IGFjdGl2aXR5LCBzY2FsZXMgPSAiZnJlZSIsIG5jb2wgPSAyKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSkgKw0KICBsYWJzKHggPSAiQXZlcmFnZSBVU0QgdmFsdWUgb2YgcGFja2FnZSBwZXIgdHJhbnNmZXIiLCANCiAgICAgICB5ID0gIkltcGxlbWVudGluZyBwYXJ0bmVyIiwgDQogICAgICAgdGl0bGUgPSAiVG9wIDUgcGFydG5lcnMgKGJ5IGJlbmVmaWNpYXJpZXMpIGFuZCB0aGVpciBwYWNrYWdlcyBieSBhY3Rpdml0eSB0eXBlIiwgDQogICAgICAgc3VidGl0bGUgPSAiT25seSBpbmNsdWRlcyBhY3Rpdml0aWVzIHJlcG9ydGVkIHVuZGVyIGNhc2gsIGh5YnJpZCBhbmQgdm91Y2hlciBtb2RhbGl0aWVzO1xuQWxsIHZhbHVlcyBhcmUgcGVyIG1vbnRoIHBlciBob3VzZWhvbGQsIGV4Y2VwdCBjYXNoIHRyYW5zZmVycyB3aGljaCBhcmUgcGVyIHBlcnNvbiIpDQoNCg0KYGBgDQoNCjxicj4NCg0KVGhlIHRhYmxlIGJlbG93IGNvbXBhcmVzIHRoZSBkaWZmZXJlbnQgYmlucyBmb3IgY2FzaC10cmFuc2ZlciB2YWx1ZXMgdG8gdGhlIG1pbmltdW0gZXhwZW5kaXR1cmUgYmFza2V0IGZvciBmb29kIGVzdGFibGlzaGVkIGJ5IHRoZSBDYXNoIFdvcmtpbmcgR3JvdXAgKENXRykgLS0gdGhleSBoYXZlIHNldCBhIGZsb29yIG9mIE1NSyAxOTAsNTU1IChvciBVU0QgMTE0LjU1KSBwZXIgaG91c2Vob2xkIHBlciBtb250aDoNCg0KDQpgYGB7ciB0YWJsZS1tZWItdXNkLWhoZC1iaW59DQpjYnRfYmlucyA8LSBmc2MgJT4lIGZpbHRlcihhY3Rpdml0eSA9PSAiUHJvdmlkZSBtb250aGx5IGNhc2gtYmFzZWQgdHJhbnNmZXJzIiAmICFpcy5uYSh1c2RfaGhkX2JpbikpICU+JQ0KICBjb3VudCh1c2RfaGhkX2Jpbiwgd3QgPSBob3VzZWhvbGRzKSAlPiUgDQogIG11dGF0ZShwY19vZl90b3RhbCA9IHJvdW5kKG4gLyBzdW0obikgKiAxMDAsIGRpZ2l0cyA9IDIpKQ0KDQpmc2MgJT4lIA0KICBmaWx0ZXIodW5pcXVlX2JlbmVmaWNpYXJpZXMgPT0gIlllcyIgJiBhY3Rpdml0eSA9PSAiUHJvdmlkZSBtb250aGx5IGNhc2gtYmFzZWQgdHJhbnNmZXJzIikgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKG5ld192YWx1ZV9oaGQpKSAlPiUgDQogIG11dGF0ZShwY19tZWIgPSBuZXdfdmFsdWVfaGhkIC8gMTE0LjU1KSAlPiUgDQogIGdyb3VwX2J5KHVzZF9oaGRfYmluKSAlPiUgDQogIHN1bW1hcmlzZShhdmdfcGNfb2ZfbWViID0gcm91bmQobWVkaWFuKHBjX21lYikgKiAxMDAsIGRpZ2l0cyA9IDIpLA0KICAgICAgICAgICAgYXZnX3VzZF9tb250aCA9IHJvdW5kKG1lZGlhbihuZXdfdmFsdWVfaGhkLCBuYS5ybSA9IFRSVUUpLCBkaWdpdHMgPSAyKSwNCiAgICAgICAgICAgIGhvdXNlaG9sZHMgPSByb3VuZChzdW0oaG91c2Vob2xkcykpKSAlPiUgDQogIG11dGF0ZShwY19vZl9oaGQgPSByb3VuZChob3VzZWhvbGRzIC8gc3VtKGhvdXNlaG9sZHMpICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIk1vbnRobHkgY2FzaC1iYXNlZCB0cmFuc2ZlciB2YWx1ZXMgYnkgcGVyY2VudGFnZSBvZiBNRUIgcmVjZWl2ZWQiLCBmb3JtYXQuYXJncyA9IGxpc3QoYmlnLm1hcmsgPSAiLCIpKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMigic3RyaXBlZCIpICU+JSANCiAgY29sdW1uX3NwZWMoNSwgY29sb3IgPSAid2hpdGUiLCBiYWNrZ3JvdW5kID0gc3BlY19jb2xvcihjYnRfYmlucyRwY19vZl90b3RhbFsxOjExXSwgZW5kID0gMC45LCBkaXJlY3Rpb24gPSAtMSkpICU+JQ0KICBmb290bm90ZShnZW5lcmFsID0gIk9ubHkgaG91c2Vob2xkcyByZWFjaGVkIHRocm91Z2ggbW9udGhseSBjYXNoLWJhc2VkIHRyYW5zZmVycyBhcmUgaW5jbHVkZWQiLA0KICAgICAgICAgICBnZW5lcmFsX3RpdGxlID0gIiIpDQojIHBhbmRlcihjYXB0aW9uID0gIk1vbnRobHkgY2FzaC1iYXNlZCB0cmFuc2ZlciB2YWx1ZXMgYnkgcGVyY2VudGFnZSBvZiBNRUIgcmVjZWl2ZWQiKQ0KDQpgYGANCg0KPGJyPg0KDQpPdmVyYWxsLCBgciByb3VuZChmaWx0ZXIoZnNjLCBuZXdfdmFsdWVfaGhkID4gKDExNC41NS8yKSAmIHVuaXF1ZV9iZW5lZmljaWFyaWVzID09ICJZZXMiICYgYWN0aXZpdHkgPT0gIlByb3ZpZGUgbW9udGhseSBjYXNoLWJhc2VkIHRyYW5zZmVycyIpICU+JSB7c3VtKC4kYmVuZWZpY2lhcmllcyl9IC8gZmlsdGVyKGZzYywgIWlzLm5hKG5ld192YWx1ZV9oaGQpICYgdW5pcXVlX2JlbmVmaWNpYXJpZXMgPT0gIlllcyIgJiBhY3Rpdml0eSA9PSAiUHJvdmlkZSBtb250aGx5IGNhc2gtYmFzZWQgdHJhbnNmZXJzIikgJT4lIHtzdW0oLiRiZW5lZmljaWFyaWVzKX0gKiAxMDAsIGRpZ2l0cyA9IDIpYCUgb2YgYmVuZWZpY2lhcnkgaG91c2Vob2xkcyBvZiBjYXNoLWJhc2VkIHRyYW5zZmVycyBoYXZlIHJlY2VpdmVkIDUwJSBvciBtb3JlIG9mIHRoZSBNRUIgZm9yIHRoZSBtb250aHMgdGhleSB3ZXJlIGNvdmVyZWQuIA0KDQpJdCBpcyBpbXBvcnRhbnQgdG8ga2VlcCBpbiBtaW5kIHRoYXQgaHVtYW5pdGFyaWFuIGFzc2lzdGFuY2UgYWltcyB0byBjb3ZlciBhY3V0ZSBuZWVkcyBhbmQgdGhhdCBmdWxsL2hhbGYgcmF0aW9ucyBhcmUgbm90IG5lY2Vzc2FyaWx5IGludGVuZGVkIHRvIGNvdmVyIHRoZSBmdWxsIE1FQiBhbmQgYXJlIGluc3RlYWQgZm9jdXNlZCBvbiBwcm92aWRpbmcsIHRvdGFsbHkgb3IgcGFydGlhbGx5LCAyLDEwMCBrY2FsL2RheSBwZXIgcGVyc29uIGVhY2ggbW9udGguIEhvd2V2ZXIsIGl0IGlzIGJlbmVmaWNpYWwgZm9yIHRoZSBGU0MgdG8gY29sbGVjdCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGVyY2VudGFnZSBvZiB0aGUgTUVCIHRoYXQgY2FzaCB0cmFuc2ZlcnMgYW5kIGZvb2QgYmFza2V0IGRpc3RyaWJ1dGlvbnMgYXJlIGludGVuZGVkIHRvIGFjaGlldmUuIA0KDQo8YnI+PGJyPjxicj4NCg0KIyMgMy4gUGFydG5lcnMNCg0KVGhlIHRvdGFsIG51bWJlciBvZiBGU0MgcGFydG5lcnMgaXMgNzEsIHdpdGggdGhlIGZvbGxvd2luZyBicmVha2Rvd246IA0KDQpgYGB7ciB0YWJsZS1hbGwtZnNjLXBhcnRuZXJzfQ0KdHJpYmJsZSgNCiAgfnR5cGUsIH5jb3VudCwgDQogICJVTiAoaW5jbHVkaW5nIE9DSEEpIiwgMywNCiAgIklOR08iLCAyNSwNCiAgIk5OR08sIENTTyBhbmQgUHJpdmF0ZSBzZWN0b3IiLCA0MSwgDQogICJSZXNlYXJjaCBpbnN0aXR1dGVzIiwgMiwgDQogICJUb3RhbCBGU0MgcGFydG5lcnMiLCA3MQ0KKSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiRlNDIHBhcnRuZXJzIGJ5IHR5cGUiKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMihwb3NpdGlvbiA9ICJsZWZ0IiwgZnVsbF93aWR0aCA9IEZBTFNFKSAlPiUgDQogIHJvd19zcGVjKDUsIGJvbGQgPSBUUlVFKQ0KYGBgDQoNCjxicj4NCg0KVG8gZm9sbG93LXVwIG9uIHRoZSBmb29kIHNlY3VyaXR5IHNpdHVhdGlvbiBpbiBNeWFubWFyIGFuZCB0byBwcm92aWRlIHZhbHVhYmxlIGRhdGEgYW5kIGFuYWx5c2lzIHRvIGluZm9ybSBwYXJ0bmVycycgZm9vZCBzZWN1cml0eSBzdHJhdGVnaWVzIGFuZCBwcm9ncmFtbWluZywgdGhlIEZTQyBpcyBkaXZlcnNpZnlpbmcgaXRzIG5ldHdvcmsgb2YgcGFydG5lcnMuIEV2ZW4gdGhvdWdoIG5vdCBhbGwgb2YgdGhlbSBhcmUgcmVwb3J0aW5nIGFjaGlldmVtZW50cyBpbiB0aGUgNVdzLiANCg0KQSB0b3RhbCBvZiBgciBmc2MgJT4lIHNlbGVjdChpbXBsZW1lbnRpbmdfcGFydG5lcnMpICU+JSBkaXN0aW5jdCgpICU+JSBucm93KClgIEZTQyBwYXJ0bmVycyBjbGFzc2lmaWVkIHRoZW1zZWx2ZXMgYXMgaW1wbGVtZW50aW5nIHBhcnRuZXJzIHdpdGhpbiB0aGUgNVdzLiBUaGV5IGFyZSBmYWlybHkgZXZlbmx5IHNwbGl0IHRoZW1zZWx2ZXMgYmV0d2VlbiBIUlAgaW5kaWNhdG9ycywgd2l0aCBgciBmc2MgJT4lIGZpbHRlcihzdHJfZGV0ZWN0KGhycF9pbmRpY2F0b3IsICIxLiIpKSAlPiUgc2VsZWN0KGltcGxlbWVudGluZ19wYXJ0bmVycykgJT4lIGRpc3RpbmN0KCkgJT4lIG5yb3coKWAgY29udHJpYnV0aW5nIHRvd2FyZHMgZm9vZCBhbmQgY2FzaCBhc3Npc3RhbmNlIGFuZCBgciBmc2MgJT4lIGZpbHRlcihzdHJfZGV0ZWN0KGhycF9pbmRpY2F0b3IsICIyLiIpKSAlPiUgc2VsZWN0KGltcGxlbWVudGluZ19wYXJ0bmVycykgJT4lIGRpc3RpbmN0KCkgJT4lIG5yb3coKWAgY29udHJpYnV0aW5nIHRvd2FyZHMgYWdyaWN1bHR1cmUgYW5kIG90aGVyIGxpdmVsaWhvb2Qgc3VwcG9ydC4gYHIgYmVuICU+JSBzdW1fYmVuKGltcGxlbWVudGluZ19wYXJ0bmVycykgJT4lIGZpbHRlcihiZW5lZmljaWFyaWVzIDwgMTAwMDApICU+JSBucm93KClgIHBhcnRuZXJzIGhhdmUgcmVhY2hlZCBsZXNzIHRoYW4gMTAsMDAwIHVuaXF1ZSBiZW5lZmljaWFyaWVzIGFuZCB0aGUgbWVkaWFuIHVuaXF1ZSBiZW5lZmljaWFyaWVzIHJlYWNoZWQgYnkgcGFydG5lcnMgaXMgYHIgYmVuICU+JSBzdW1fYmVuKGltcGxlbWVudGluZ19wYXJ0bmVycykgJT4lIHttZWRpYW4oLiRiZW5lZmljaWFyaWVzKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgLiBCZWxvdyBhcmUgdGhlIHRvcCAxMCBwYXJ0bmVycyBieSBIUlAgaW5kaWNhdG9yLg0KDQpgYGB7ciB0YWJsZS10b3AtcGFydG5lcnMtYnktaHJwLWluZGljYXRvcn0NCg0KIyByZW1pbmRlciB0byByZWRvIHRoZSBudW1iZXJzIHdoZW4geW91IHJlcnVuIHRoaXMgd2l0aCBmcmVzaCBkYXRhIA0KDQpjYmluZCgNCiAgDQogIGZzYyAlPiUgDQogICAgZmlsdGVyKGhycF9pbmRpY2F0b3IgPT0gIjEuTnVtYmVyIG9mIHBlb3BsZSB3aG8gcmVjZWl2ZWQgZm9vZCBhbmQvb3IgY2FzaCBhc3Npc3RhbmNlIiAmDQogICAgICAgICAgICAgYmVuZWZpY2lhcmllc19yZWN1cnJlbmN5ICVpbiUgYygiRmlyc3QiLCAiT25lLW9mZiIpKSAlPiUgDQogICAgZ3JvdXBfYnkoaW1wbGVtZW50aW5nX3BhcnRuZXJzKSAlPiUgDQogICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpICU+JSANCiAgICBhcnJhbmdlKGRlc2MoYmVuZWZpY2lhcmllcykpICU+JSANCiAgICByZW5hbWUoYDEuIE51bWJlciBvZiBwZW9wbGUgd2hvIHJlY2VpdmVkIGZvb2QgYW5kL29yIGNhc2ggYXNzaXN0YW5jZWAgPSBiZW5lZmljaWFyaWVzLA0KICAgICAgICAgICBgUGFydG5lcnMgSFJQIGluZGljYXRvcjFgID0gaW1wbGVtZW50aW5nX3BhcnRuZXJzKSAlPiUgDQogICAgaGVhZCgxMCksDQogIA0KICBmc2MgJT4lIA0KICAgIGZpbHRlcihocnBfaW5kaWNhdG9yID09ICIyLk51bWJlciBvZiBwZW9wbGUgd2hvIHJlY2VpdmVkIGFncmljdWx0dXJlIGFuZCBvdGhlciBsaXZlbGlob29kIHN1cHBvcnQiICYNCiAgICAgICAgICAgICBiZW5lZmljaWFyaWVzX3JlY3VycmVuY3kgJWluJSBjKCJGaXJzdCIsICJPbmUtb2ZmIikpICU+JSANCiAgICBncm91cF9ieShpbXBsZW1lbnRpbmdfcGFydG5lcnMpICU+JSANCiAgICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSkgJT4lIA0KICAgIGFycmFuZ2UoZGVzYyhiZW5lZmljaWFyaWVzKSkgJT4lIA0KICAgIHJlbmFtZShgMi4gTnVtYmVyIG9mIHBlb3BsZSB3aG8gcmVjZWl2ZWQgYWdyaWN1bHR1cmUgYW5kIG90aGVyIGxpdmVsaWhvb2Qgc3VwcG9ydGAgPSBiZW5lZmljaWFyaWVzLA0KICAgICAgICAgICBgUGFydG5lcnMgSFJQIGluZGljYXRvcjJgID0gaW1wbGVtZW50aW5nX3BhcnRuZXJzKSAlPiUgDQogICAgaGVhZCgxMCkNCiAgDQopICU+JSANCiAgYWRkX2NvbHVtbihgIGAgPSAiICIpICU+JSANCiAgcmVsb2NhdGUoYCBgLCAuYWZ0ZXIgPSBgMS4gTnVtYmVyIG9mIHBlb3BsZSB3aG8gcmVjZWl2ZWQgZm9vZCBhbmQvb3IgY2FzaCBhc3Npc3RhbmNlYCkgJT4lIA0KICANCiAga2FibGUoY2FwdGlvbiA9ICJUb3AgMTAgaW1wbGVtZW50aW5nIHBhcnRuZXJzIGJ5IGJlbmVmaWNpYXJpZXMgcmVhY2hlZCwgYnkgSFJQIGluZGljYXRvciIsIGZvcm1hdC5hcmdzID0gbGlzdChiaWcubWFyayA9ICIsIikpICU+JSANCiAga2FibGVfY2xhc3NpY18yKCJzdHJpcGVkIikgJT4lICANCiAgZm9vdG5vdGUoZ2VuZXJhbCA9ICJGaWd1cmVzIHJlZmxlY3QgYmVuZWZpY2lhcmllcyByZWFjaGVkIHRocm91Z2ggZGlyZWN0IGltcGxlbWVudGF0aW9uIiwNCiAgICAgICAgICAgZ2VuZXJhbF90aXRsZSA9ICIiKQ0KIyBwYW5kZXIoY2FwdGlvbiA9ICJUb3AgMTAgcGFydG5lcnMgYnkgYmVuZWZpY2lhcmllcyByZWFjaGVkLCBieSBIUlAgaW5kaWNhdG9yIikNCg0KYGBgDQoNCjxicj48YnI+DQoNCiMjIyAzLjEgRGlzdHJpYnV0aW9uIG9mIHBhcnRuZXJzIGJ5IGJlbmVmaWNpYXJpZXMgYW5kIGdlb2dyYXBoaWMgcmVhY2gNCg0KV2hpbHN0IHRoZXJlIGlzIHF1aXRlIGEgYml0IG9mIHZhcmlhdGlvbiBpbiB0aGUgbnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCwgRlNDIHBhcnRuZXJzJyBnZW9ncmFwaGljIGZvb3RwcmludHMgYXJlIHF1aXRlIGxpbWl0ZWQuIE9ubHkgYHIgYmVuICU+JSBncm91cF9ieShpbXBsZW1lbnRpbmdfcGFydG5lcnMpICU+JSBzdW1tYXJpc2UodG93bnNoaXBzID0gbl9kaXN0aW5jdChhZG1pbjNfcGNvZGUpKSAlPiUgZmlsdGVyKHRvd25zaGlwcyA+IDEwKSAlPiUgbnJvdygpYCBwYXJ0bmVycyBoYXZlIGEgcHJlc2VuY2UgaW4gbW9yZSB0aGFuIDEwIHRvd25zaGlwcywgYW5kIG9ubHkgYHIgYmVuICU+JSBncm91cF9ieShpbXBsZW1lbnRpbmdfcGFydG5lcnMpICU+JSBzdW1tYXJpc2UodG93bnNoaXBzID0gbl9kaXN0aW5jdChhZG1pbjNfcGNvZGUpKSAlPiUgZmlsdGVyKHRvd25zaGlwcyA+IDUpICU+JSBucm93KClgIGFyZSBwcmVzZW50IGluIG1vcmUgdGhhbiA1IHRvd25zaGlwcy4gNzglIG9mIEZTQyBwYXJ0bmVycyAoY2x1c3RlcmVkIGFsb25nIHRoZSBib3R0b20gb2YgdGhlIGNoYXJ0KSBhcmUgcHJlc2VudCBpbiA1IG9yIGxlc3MgdG93bnNoaXBzLiBUaGlzIGRpc3RyaWJ1dGlvbiBvZiBwYXJ0bmVycyBpcyBhbiBpbXBlZGltZW50IHRvIGEgY291bnRyeXdpZGUgcmVzcG9uc2UgYW5kIGl0IGlzIGltcGVyYXRpdmUgdG8gdW5kZXJzdGFuZCBob3c6DQoNCiogVG8gaW5jZW50aXZpc2UgcGFydG5lcnMgdG8gZXhwYW5kIHRoZWlyIGZvb3RwcmludHMNCg0KKiB0aGUgRlNDIGNhbiBpZGVudGlmeSBuZXcgcGFydG5lcnMgdG8gcmVhY2ggdnVsbmVyYWJsZSBwZXJzb25zIGluIGFyZWFzIHJlY2VudGx5IGFmZmVjdGVkIGJ5IGNvbmZsaWN0DQoNCiogVG8gZW5jb3VyYWdlIGRvbm9ycyB0byBzdXBwb3J0IGV4cGFuc2lvbiBvZiBGb29kIFNlY3VyaXR5IGFjdGl2aXRpZXMgaW4gYXJlYXMgcmVjZW50bHkgYWZmZWN0ZWQgYnkgY29uZmxpY3QgKHdpdGggc3VmZmljaWVudCBzdXBwb3J0IGNvc3RzKQ0KDQo8YnI+DQoNCmBgYHtyIHBsb3RseS1zY2F0dGVyLXBhcnRuZXJzLXJlYWNofQ0KIyByZW1pbmRlciB0byByZWNhbGN1bGF0ZSB0aGUgNzglIGFib3ZlIGlmIHlvdSByZXJ1biB0aGUgZGF0YSANCnBhcnRuZXJfc2NhdHRlciA8LSBiZW4gJT4lIA0KICBncm91cF9ieShpbXBsZW1lbnRpbmdfcGFydG5lcnMpICU+JSANCiAgc3VtbWFyaXNlKHN0YXRlcyA9IG5fZGlzdGluY3QoYWRtaW4xX3Bjb2RlKSwNCiAgICAgICAgICAgIHRvd25zaGlwcyA9IG5fZGlzdGluY3QoYWRtaW4zX3Bjb2RlKSwNCiAgICAgICAgICAgIGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpICU+JSANCiAgYXJyYW5nZShkZXNjKHN0YXRlcykpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gYmVuZWZpY2lhcmllcywgeSA9IHRvd25zaGlwcywgdGV4dCA9IGltcGxlbWVudGluZ19wYXJ0bmVycykpICsgIA0KICBnZW9tX3BvaW50KGFlcyhzaXplID0gYmVuZWZpY2lhcmllcykpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKHRyYW5zID0gImxvZyIsIGxhYmVscyA9IGNvbW1hLCBicmVha3MgPSBjKDAsIDEwMCwgMTAwMCwgMTAwMDAsIDEwMDAwMCwgMzAwMDAwKSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDMwLCA1KSkgKw0KICBsYWJzKHggPSAiTnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMiLA0KICAgICAgIHkgPSAiTnVtYmVyIG9mIHRvd25zaGlwcyIsDQogICAgICAgdGl0bGUgPSAiUGxvdCBvZiBiZW5lZmljaWFyaWVzIGFuZCB0b3duc2hpcHMgcmVhY2hlZCwgYnkgaW1wbGVtZW50aW5nIHBhcnRuZXIiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikNCiMgZm9yIHNvbWUgcmVhc29uLCByZW1vdmluZyB0aGlzIG1lc3NlcyB3aXRoIHRoZSBhbGlnbm1lbnQgb2YgdGhlIHBsb3QNCg0KZ2dwbG90bHkocGFydG5lcl9zY2F0dGVyKSAlPiUNCiAgY29uZmlnKGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpICU+JSANCiAgbGF5b3V0KHRpdGxlID0gbGlzdCh0ZXh0ID0gcGFzdGUwKCJQbG90IG9mIGJlbmVmaWNpYXJpZXMgYW5kIHRvd25zaGlwcyByZWFjaGVkLCBieSBpbXBsZW1lbnRpbmcgcGFydG5lciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxzdXA+IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtb3VzZSBvdmVyIGZvciBkZXRhaWxzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8L3N1cD4iKSkpDQoNCiMgZ2dzYXZlKCJwYXJ0bmVyc19zY2F0dGVycGxvdC5wbmciLCBoZWlnaHQgPSA3LCB3aWR0aCA9IDExLCB1bml0cyA9ICJpbiIsIGRwaSA9IDMwMCkNCmBgYA0KDQo8YnI+DQoNCmBgYHtyIGRmLWFjdC1udW19DQphY3RfbnVtIDwtIGZzYyAlPiUgDQogIGdyb3VwX2J5KGltcGxlbWVudGluZ19wYXJ0bmVycykgJT4lIA0KICBzdW1tYXJpc2UobnVtYmVyX29mX2FjdGl2aXRpZXMgPSBuX2Rpc3RpbmN0KGFjdGl2aXR5KSwgDQogICAgICAgICAgICBiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXNbdW5pcXVlX2JlbmVmaWNpYXJpZXMgPT0gIlllcyJdLCBuYS5ybSA9IFRSVUUpKSAlPiUgIA0KICBncm91cF9ieShudW1iZXJfb2ZfYWN0aXZpdGllcykgJT4lIA0KICBzdW1tYXJpc2UocGFydG5lcnMgPSBuX2Rpc3RpbmN0KGltcGxlbWVudGluZ19wYXJ0bmVycyksDQogICAgICAgICAgICBiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIG11dGF0ZShwY19vZl9iZW5lZmljaWFyaWVzID0gcm91bmQoYmVuZWZpY2lhcmllcyAvIHN1bShiZW5lZmljaWFyaWVzKSAqIDEwMCwgZGlnaXRzID0gMikpDQoNCmBgYA0KDQpJbiB0ZXJtcyBvZiBhY3Rpdml0aWVzLCBgciBmaWx0ZXIoYWN0X251bSwgbnVtYmVyX29mX2FjdGl2aXRpZXMgPT0gMSkgJT4lIHB1bGwocGFydG5lcnMpYCBwYXJ0bmVycyAoYHIgcm91bmQoZmlsdGVyKGFjdF9udW0sIG51bWJlcl9vZl9hY3Rpdml0aWVzID09IDEpICU+JSBwdWxsKHBhcnRuZXJzKSAvIGRpc3RpbmN0KGZzYywgaW1wbGVtZW50aW5nX3BhcnRuZXJzKSAlPiUgbnJvdygpICogMTAwKWAlIG9mIHBhcnRuZXJzIHJlcG9ydGluZyBpbiA1V3MpIGFyZSBpbXBsZW1lbnRpbmcgb25seSBvbmUgdHlwZSBvZiBhY3Rpdml0eS4gT25seSBvbmUgcGFydG5lciAoV29ybGQgVmlzaW9uIE15YW5tYXIpIGlzIHJlc3BvbmRpbmcgYWNyb3NzIDYgYWN0aXZpdGllcy4gVGhpcyAgaW5kaWNhdGVzIHRoYXQgdGhlIGZvb2Qgc2VjdXJpdHkgc3VwcG9ydCBwcm92aWRlZCB0byBiZW5lZmljaWFyaWVzIGlzIGZhciBmcm9tIGNvbXByZWhlbnNpdmUgYW5kIGRvZXMgbm90IGhlbHAgYmVuZWZpY2lhcmllcyBhY2hpZXZlIGEgc3VzdGFpbmFibGUgYW5kIGNsZWFyIHBvc2l0aXZlIGZvb2Qgc2VjdXJpdHkgc3RhdHVzLiANCg0KDQpgYGB7ciB0YWJsZS1hY3QtbnVtfQ0KYWN0X251bSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiTnVtYmVyIG9mIGltcGxlbWVudGluZyBwYXJ0bmVycyBieSBudW1iZXIgb2YgZGlzdGluY3QgYWN0aXZpdGllcyBiZWluZyBpbXBsZW1lbnRlZCIsDQogICAgICAgIGZvcm1hdC5hcmdzID0gbGlzdChiaWcubWFyayA9ICIsIikNCiAgICAgICAgIyx0YWJsZS5hdHRyID0gInN0eWxlPSd3aWR0aDo1MCU7JyINCiAgICAgICAgKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMihwb3NpdGlvbiA9ICJsZWZ0IiwgZnVsbF93aWR0aCA9IEZBTFNFKQ0KIyBwYW5kZXIoY2FwdGlvbiA9ICJOdW1iZXIgb2YgaW1wbGVtZW50aW5nIHBhcnRuZXJzIGJ5IG51bWJlciBvZiBkaXN0aW5jdCBhY3Rpdml0aWVzIGJlaW5nIGltcGxlbWVudGVkIikNCmBgYA0KDQo8YnI+PGJyPg0KDQojIyMgMy4yIE1vbnRobHkgcHJvZ3Jlc3MgYnkgcGFydG5lcg0KDQo8YnI+DQoNCmBgYHtyIHBhcnRuZXJzLXByb2dyZXNzLW92ZXItdGltZS1mYWNldH0NCnBhcnRuZXJfdG9wIDwtIGJlbiAlPiUgIA0KICBzdW1fYmVuKGltcGxlbWVudGluZ19wYXJ0bmVycykgJT4lIGFycmFuZ2UoZGVzYyhiZW5lZmljaWFyaWVzKSkgJT4lIHB1bGwoaW1wbGVtZW50aW5nX3BhcnRuZXJzKSAlPiUgaGVhZCgyMCkNCg0KYmVuICU+JSANCiAgZmlsdGVyKGltcGxlbWVudGluZ19wYXJ0bmVycyAlaW4lIHBhcnRuZXJfdG9wKSAlPiUgDQogIGdyb3VwX2J5KGltcGxlbWVudGluZ19wYXJ0bmVycykgJT4lIA0KICBhcnJhbmdlKGRhdGUpICU+JSANCiAgbXV0YXRlKGN1bV9iZW4gPSBjdW1zdW0oYmVuZWZpY2lhcmllcykpICU+JQ0KICBtdXRhdGUoaW1wbGVtZW50aW5nX3BhcnRuZXJzID0gZmN0X3Jlb3JkZXIoaW1wbGVtZW50aW5nX3BhcnRuZXJzLCBjdW1fYmVuLCBtYXgsIC5kZXNjID0gVFJVRSkpICU+JSAgDQogIGdncGxvdChhZXMoeCA9IGRhdGUsIHkgPSBjdW1fYmVuKSkgKw0KICBnZW9tX2xpbmUoc2l6ZSA9IDAuNSkgKyANCiAgc2NhbGVfeF9kYXRlKGRhdGVfYnJlYWtzID0gIjEgbW9udGgiLCBkYXRlX2xhYmVscyA9ICIlYiIpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArDQogIGdlb21fdmxpbmUoY29sb3VyID0gInJlZCIsIGx0eSA9IDIsIHhpbnRlcmNlcHQgPSBhcy5udW1lcmljKGFzLkRhdGUoIjIwMjEtMDYtMDEiKSkpICsNCiAgZmFjZXRfd3JhcCh+IGltcGxlbWVudGluZ19wYXJ0bmVycywgc2NhbGVzID0gImZyZWVfeSIpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMy41KSwNCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDQpLA0KICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA0LjUsIGZhY2UgPSAiYm9sZCIpKSArICMgc2VlIGlmIHRoaXMgd29ya3Mgd2hlbiB5b3Uga25pdCwgdGhlbiBkbyBpdCBmb3IgdGhlIG90aGVyIHBsb3RzIA0KICBsYWJzKHggPSAiTW9udGgiLCANCiAgICAgICB5ID0gIkN1bXVsYXRpdmUgYmVuZWZpY2lhcmllcyIsIA0KICAgICAgIHRpdGxlID0gIk1vbnRobHkgcHJvZ3Jlc3Mgb2YgdG9wIDIwIGltcGxlbWVudGluZyBwYXJ0bmVycywgMjAyMSIsIA0KICAgICAgIHN1YnRpdGxlID0gIkZpZ3VyZXMgc2hvdyBjdW11bGF0aXZlIHVuaXF1ZSBiZW5lZmljaWFyaWVzIikgKyANCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTEpKQ0KYGBgDQoNCiA8YnI+DQogDQpUaGUgcGxvdCBhYm92ZSBzaG93cyB0aGUgdG9wIDIwIHBhcnRuZXJzIGJ5IG51bWJlciBvZiBiZW5lZmljaWFyaWVzIHJlYWNoZWQgaW4gMjAyMSwgd2l0aCB0aGUgcmVkIGxpbmUgaW5kaWNhdGluZyBKdW5lIDIwMjEsIHdoZW4gdGhlIElFUlAgd2FzIGFwcHJvdmVkIGFuZCBwdWJsaXNoZWQuIE92ZXJhbGwsIHRoZSBJRVJQIGhhZCBhIHZlcnkgbGFyZ2UgZWZmZWN0IG9uIHRoZSBudW1iZXIgb2YgYmVuZWZpY2lhcmllcyByZWFjaGVkLiBNb3N0IHBhcnRuZXJzIGVuYWN0ZWQgYSBzaWduaWZpY2FudCByYW1wIHVwIGFuZCByZWFjaGVkIHRoZSBtYWpvcml0eSBvZiBiZW5lZmljaWFyaWVzIGFmdGVyIGl0IHdhcyBwdWJsaXNoZWQuIEV4Y2VwdGlvbnMgdG8gdGhpcyBpbmNsdWRlIG9yZ2FuaXNhdGlvbnMgc3VjaCBhcyBDRVNWSSwgSGVsZW4gS2VsbGVyIEludGVybmF0aW9uYWwsIFNhdmUgdGhlIENoaWxkcmVuIGFuZCBNeWFubWFyIEhlYXJ0IERldmVsb3BtZW50IE9yZ2FuaXNhdGlvbiwgd2hvIGVzdGFibGlzaGVkIG1vc3Qgb2YgdGhlaXIgY2FzZWxvYWQgcHJpb3IgdG8gSnVseSAyMDIxLiANCg0KQXMgYSBub3RlLCBpdCB3YXMgZGlmZmljdWx0IHRvIGRldGVybWluZSB3aGljaCBhY3Rpb25zIGltcGxlbWVudGVkIHdlcmUgbGlua2VkIHRvIGZ1bmRzIHNlY3VyZWQgYWZ0ZXIgdGhlIHB1YmxpY2F0aW9uIG9mIHRoZSBJRVJQLiBUaGUgbmV4dCBjaGFwdGVyIHdpbGwgZXhwbG9yZSB0aGUgZWZmZWN0IHRoZSBJRVJQIGhhZCBvbiBwZXJzb25zIHJlYWNoZWQgYnkgYmVuZWZpY2lhcnkgdHlwZS4gUHJvZ3Jlc3MgaXMgYWxzbyBzdWJqZWN0IHRvIHRoZSBhdmFpbGFiaWxpdHkgb2YgZnVuZHMgYW5kIGFyZSBhbHNvIGxpbmtlZCB0byBzZWFzb25hbCBjYWxlbmRhcnMgKGUuZy4gYWdyaWN1bHR1cmUpLiANCg0KDQo8YnI+PGJyPg0KDQojIyMgMy4zIFR5cGVzIG9mIGltcGxlbWVudGluZyBwYXJ0bmVycw0KDQpgYGB7ciB0YWJsZS1pbXBsZW1lbnRpbmctcGFydG5lci10eXBlLCB3YXJuaW5nPUZBTFNFfQ0KZnNjICU+JSANCiAgZmlsdGVyKHVuaXF1ZV9iZW5lZmljaWFyaWVzID09ICJZZXMiKSAlPiUgDQogIGdyb3VwX2J5KGltcGxlbWVudGluZ19wYXJ0bmVyX3R5cGUsIGltcGxlbWVudGluZ19wYXJ0bmVycykgJT4lICANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcyksIA0KICAgICAgICAgICAgdG93bnNoaXBzID0gbl9kaXN0aW5jdChhZG1pbjNfcGNvZGUpLA0KICAgICAgICAgICAgc3RhdGVzID0gbl9kaXN0aW5jdChhZG1pbjFfcGNvZGUpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUgDQogIGdyb3VwX2J5KGltcGxlbWVudGluZ19wYXJ0bmVyX3R5cGUpICU+JSANCiAgc3VtbWFyaXNlKGF2Z19iZW5lZmljaWFyaWVzID0gcm91bmQobWVhbihiZW5lZmljaWFyaWVzKSksDQogICAgICAgICAgICBhdmdfdG93bnNoaXBzID0gcm91bmQobWVhbih0b3duc2hpcHMpLCBkaWdpdHMgPSAyKSwgDQogICAgICAgICAgICBhdmdfc3RhdGVzID0gcm91bmQobWVhbihzdGF0ZXMpLCBkaWdpdHMgPSAyKSwgDQogICAgICAgICAgICAuZ3JvdXBzID0gImRyb3AiKSAlPiUgIA0KICBtdXRhdGUoaW1wbGVtZW50aW5nX3BhcnRuZXJfdHlwZSA9IGZjdF9yZWxldmVsKGltcGxlbWVudGluZ19wYXJ0bmVyX3R5cGUsIGxldmVscyA9IGMoIklOR08iLCAiTk5HTyIsICJVTiIsICJvdGhlciIpKSkgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIkF2ZXJhZ2UgcmVhY2ggYnkgaW1wbGVtZW50aW5nIHBhcnRuZXIgdHlwZSIsIGZvcm1hdC5hcmdzID0gbGlzdChiaWcubWFyayA9ICIsIikpICU+JSANCiAga2FibGVfY2xhc3NpY18yKCkgJT4lIA0KICBmb290bm90ZShnZW5lcmFsID0gIkZpZ3VyZXMgYXJlIGF2ZXJhZ2VzIHJlYWNoZWQgYnkgZGlyZWN0IGltcGxlbWVudGF0aW9uIiwgZ2VuZXJhbF90aXRsZSA9ICIiKQ0KICAjIHBhbmRlcihjYXB0aW9uID0gIkF2ZXJhZ2UgcmVhY2ggYnkgaW1wbGVtZW50aW5nIHBhcnRuZXIgdHlwZSIpDQoNCmBgYA0KDQo8YnI+DQpOTkdPcywgb24gYXZlcmFnZSwgdGVuZGVkIHRvIHJlYWNoIG1vcmUgYmVuZWZpY2lhcmllcyB0aGFuIElOR09zLCB0aG91Z2ggSU5HT3MgdGVuZGVkIHRvIGhhdmUgYSBtdWNoIHdpZGVyIGdlb2dyYXBoaWMgcmVhY2ggdGhhbiBOTkdPcywgcGVyaGFwcyBkdWUgdG8gdGhlbSBoYXZpbmcgbW9yZSBzdWItb2ZmaWNlcy4gVGhlcmUgaXMgb25seSBvbmUgYWdlbmN5IG1lbnRpb25lZCB1bmRlciB0aGUgIlVOIiBjYXRlZ29yeSAtLSBXRlAuIFRoZSAib3RoZXIiIGNhdGVnb3J5IHJlZmVycyB0byB0d28gcHJpdmF0ZSBsaW1pdGVkIGNvbXBhbmllcyB3aGljaCBhbHNvIGltcGxlbWVudGVkIGZvb2Qgc2VjdXJpdHkgYWN0aXZpdGllcy4NCg0KPGJyPjxicj4NCg0KIyMjIDMuNCBSZXBvcnRpbmcgb3JnYW5pc2F0aW9ucw0KDQpPbmNlIHRoZSBpbnN0YW5jZXMgd2hlcmUgdGhlIHJlcG9ydGluZyBvcmdhbmlzYXRpb24gYW5kIHRoZSBpbXBsZW1lbnRpbmcgcGFydG5lciB3ZXJlIHRoZSBzYW1lIG9yZ2FuaXNhdGlvbiB3ZXJlIGZpbHRlcmVkIG91dCwgYWxsIHRoZSByZW1haW5pbmcgaW1wbGVtZW50aW5nIHBhcnRuZXJzIGNvcnJlc3BvbmQgdG8ganVzdCBgciBmc2MgJT4lIGZpbHRlcihyZXBvcnRpbmdfb3JnYW5pemF0aW9uICE9IGltcGxlbWVudGluZ19wYXJ0bmVycykgJT4lIGRpc3RpbmN0KHJlcG9ydGluZ19vcmdhbml6YXRpb24pICU+JSBucm93KClgIHJlcG9ydGluZyBvcmdhbmlzYXRpb25zOg0KDQpgYGB7ciB0YWJsZS1yZXBvcnRpbmctb3JnYW5pc2F0aW9ufQ0KZnNjICU+JSANCiAgZmlsdGVyKHJlcG9ydGluZ19vcmdhbml6YXRpb24gIT0gaW1wbGVtZW50aW5nX3BhcnRuZXJzKSAlPiUgDQogIGdyb3VwX2J5KHJlcG9ydGluZ19vcmdhbml6YXRpb24pICU+JSANCiAgc3VtbWFyaXNlKGltcGxlbWVudGluZ19wYXJ0bmVycyA9IG5fZGlzdGluY3QoaW1wbGVtZW50aW5nX3BhcnRuZXJzKSkgJT4lIA0KICBhcnJhbmdlKGRlc2MoaW1wbGVtZW50aW5nX3BhcnRuZXJzKSkgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIk51bWJlciBvZiBpbXBsZW1lbnRpbmcgcGFydG5lcnMgYnkgcmVwb3J0aW5nIG9yZ2FuaXNhdGlvbiIpICU+JSANCiAga2FibGVfY2xhc3NpY18yKCJzdHJpcGVkIiwgZnVsbF93aWR0aCA9IEZBTFNFLCBwb3NpdGlvbiA9ICJsZWZ0IikNCiMgcGFuZGVyKGNhcHRpb24gPSAiTnVtYmVyIG9mIGltcGxlbWVudGluZyBwYXJ0bmVycyBieSByZXBvcnRpbmcgb3JnYW5pc2F0aW9uIikNCmBgYA0KDQo8YnI+DQoNClRoaXMgcmVwb3J0IGhhcyB1c2VkIGBpbXBsZW1lbnRpbmdfcGFydG5lcnNgIGZvciBtb3N0IG9mIHRoZSBhbmFseXNpcyBhcywgYnkgdGhlaXIgbmF0dXJlLCByZXBvcnRpbmcgb3JnYW5pc2F0aW9ucyBkbyBub3QgbmVjZXNzYXJpbHkgaGF2ZSBhIGZpZWxkIHByZXNlbmNlLiBBcyBhIHNpZGUgbm90ZSwgRkFPIGhhcyBub3QgYmVlbiBjbGFzc2lmaWVkIGFzIGFuIGltcGxlbWVudGluZyBwYXJ0bmVyLiBObyBkaXJlY3QgaW1wbGVtZW50YXRpb24gd2FzIHJlcG9ydGVkIGJ5IHRoZW0uIA0KDQo8YnI+PGJyPg0KDQoNCiMjIyAzLjUgRG9ub3JzDQoNCmByIHJvdW5kKHN1bSgoIWlzLm5hKGZzYyRkb25vcikpKSAvIG5yb3coZnNjKSAqIDEwMCwgZGlnaXRzID0gMClgJSBvZiB0aGUgcm93cyBoYWQgdGhlIGBkb25vcmAgY29sdW1uIGZpbGxlZC4gSG93ZXZlciwgdGhpcyBvbmx5IHJlcHJlc2VudHMgYWN0aXZpdGllcyByZWFjaGluZyAyMyUgb2YgYWxsIGJlbmVmaWNpYXJpZXMuIEJlbG93IGlzIGEgdGFibGUgb2YgdGhlIDEwIGRvbm9ycyAoYWZ0ZXIgb3JnYW5pc2F0aW9ucyB1c2luZyB0aGVpciBvd24gcmVzb3VyY2VzKSB3aG9zZSBmdW5kaW5nICBoYXMgcmVhY2hlZCB0aGUgbW9zdCBiZW5lZmljaWFyaWVzIGFuZCB0aGUgbnVtYmVyIG9mIHRvd25zaGlwcyB0aGVpciBmdW5kaW5nIGhhcyBiZWVuIHVzZWQgaW46DQoNCmBgYHtyIGRvbm9yLXRhYmxlfQ0KZnNjICU+JSANCiAgZmlsdGVyKHVuaXF1ZV9iZW5lZmljaWFyaWVzID09ICJZZXMiKSAlPiUgDQogIGdyb3VwX2J5KGRvbm9yKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpLA0KICAgICAgICAgICAgdG93bnNoaXBzID0gbl9kaXN0aW5jdChhZG1pbjNfcGNvZGUpKSAlPiUgDQogIG11dGF0ZShwY19vZl9iZW4gPSByb3VuZChiZW5lZmljaWFyaWVzIC8gc3VtKGJlbmVmaWNpYXJpZXMpICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICByZWxvY2F0ZShwY19vZl9iZW4sIC5hZnRlciA9IGJlbmVmaWNpYXJpZXMpICU+JSANCiAgZmlsdGVyKCFpcy5uYShkb25vcikpICU+JSANCiAgYXJyYW5nZShkZXNjKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIGhlYWQoMTEpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJUb3AgMTAgZG9ub3JzIGJ5IG51bWJlciBvZiBiZW5lZmljaWFyaWVzIHJlYWNoZWQgd2l0aCB0aGVpciBmdW5kaW5nIiwgZm9ybWF0LmFyZ3MgPSBsaXN0KGJpZy5tYXJrID0gIiwiKSkgJT4lIA0KICBrYWJsZV9jbGFzc2ljXzIobGlnaHRhYmxlX29wdGlvbnMgPSBjKCJzdHJpcGVkIikpICU+JSANCiAgZm9vdG5vdGUoZ2VuZXJhbCA9ICI3NyUgb2YgYWxsIGJlbmVmaWNpYXJpZXMgKDIsNTEzLDAyNiBwZXJzb25zKSB3ZXJlIHJlcG9ydGVkIHdpdGggdGhlIGBkb25vcmAgY29sdW1uIGxlZnQgYmxhbmsiLCBnZW5lcmFsX3RpdGxlID0gIiIpDQojIHBhbmRlcihjYXB0aW9uID0gIlRvcCAxMCBkb25vcnMgYnkgbnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCB3aXRoIHRoZWlyIGZ1bmRpbmciKQ0KYGBgDQoNCjxicj4NCg0KQWRkaXRpb25hbGx5LCBudW1lcm91cyBlcnJvcnMgaGF2ZSBhbHNvIGJlZW4gb2JzZXJ2ZWQsIGluY2x1ZGluZyBjYXNlcyB3aGVyZSBtdWx0aXBsZSBkb25vcnMgaGF2ZSBiZWVuIGNvbWJpbmVkIGludG8gb25lIHJvdyBhcyB3ZWxsIGFzIG51bWVyb3VzIGluc3RhbmNlcyB3aGVyZSBVTkRQLCBXRlAsIEZBTyBhbmQgVU4gV09NRU4gd2VyZSBjbGFzc2lmaWVkIGFzIGRvbm9ycyBhcyBvcHBvc2VkIHRvIHJlcG9ydGluZyBvcmdhbmlzYXRpb25zLiBIZWx2ZXRhcyBzaG91bGQgYWxzbyBwcm9iYWJseSBoYXZlIHJlcG9ydGVkIHVuZGVyICJvcmdhbmlzYXRpb25zIHVzaW5nIHRoZWlyIG93biBmdW5kcyIuIA0KDQo8YnI+PGJyPjxicj4NCg0KIyMgNC4gQmVuZWZpY2lhcmllcw0KDQojIyMgNC4xIEJlbmVmaWNpYXJ5IGRpc2FnZ3JlZ2F0aW9uDQoNCkN1cnJlbnRseSwgaW4gdGhlIDVXcywgdGhlIHZhc3QgbWFqb3JpdHkgb2YgYmVuZWZpY2lhcnkgZGlhc2FnZ3JlZ2F0aW9ucyBoYXZlIGJlZW4gYmFja2ZpbGxlZCBmcm9tIGNlbnN1cyBkYXRhIGFuZCBkbyBub3QsIGNvbnNlcXVlbnRseSwgcHJvdmlkZSBhbiBhY2N1cmF0ZSBwaWN0dXJlIG9mIHRoZSBwb3B1bGF0aW9uIHRoYXQgaGF2ZSBiZWVuIHJlYWNoZWQgYnkgRm9vZCBTZWN1cml0eSBpbnRlcnZlbnRpb25zLiBJdCBpcyBub3QgcG9zc2libGUgdG8gZGV0ZXJtaW5lIGhvdyBmYXIgcmVhbGl0eSBkaXZlcmdlcyBmcm9tIHdoYXQgaGFzIGJlZW4gcmVwb3J0ZWQgc28gZmFyIC0tIG1lYW5pbmcgdGhhdCBpdCBjYW5ub3QgYmUgZGV0ZXJtaW5lZCBpZiB0aGVyZSBoYXMgYmVlbiBhbnkgYmlhcyBpbiBiZW5lZmljaWFyeSBzZWxlY3Rpb24gYW5kIHRhcmdldGluZy4gSXQgaXMgaW1wZXJhdGl2ZSB0byBiZWdpbiBjb2xsZWN0aW5nIGRpc2FnZ3JlZ2F0ZWQgYmVuZWZpY2lhcnkgZGF0YSBmcm9tIHBhcnRuZXJzLg0KDQpNb3N0IEZTQyBwYXJ0bmVycyBvbmx5IHJlcG9ydCB0aGUgYWdlIGFuZCBzZXggb2YgdGhlIHNwZWNpZmljIHBlcnNvbiByZWNlaXZpbmcgdGhlIGFzc2lzdGFuY2UgKG5vdCBuZWNlc3NhcmlseSB0aGUgaGVhZCBvZiBob3VzZWhvbGQpLiBUaGUgRlNDIGFuZCBkb25vcnMgZXhwZWN0IGNvbXBsZXRlIHJlcG9ydGluZyBvZiBnZW5kZXIgYW5kIGFnZSBjb21wb3NpdGlvbnMgb2YgYmVuZWZpY2lhcnkgaG91c2Vob2xkcy4gDQoNCkl0IGlzIHBvc3NpYmxlIHRoYXQgcGFydG5lcnMgYXJlIGNvbGxlY3RpbmcgdGhpcyBkYXRhLiBEaXNhZ2dyZWdhdGVkIGJlbmVmaWNpYXJ5IGRhdGEgaXMgY29tbW9ubHkgbmVlZGVkIGZvciBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgcmVwb3J0aW5nLiBUaGUgRlNDIHdpbGwgd29yayB3aXRoIGl0cyBwYXJ0bmVycyB0byBzdHJlbmd0aGVuIHRoZWlyIGRhdGEgY29sbGVjdGlvbiBzeXN0ZW0gdG8gZW5zdXJlIHRoYXQgcmVwb3J0ZWQgZGF0YSBtZWV0cyBpbnRlcm5hdGlvbmFsIHN0YW5kYXJkcy4gDQoNCmBgYHtyIGRmLWZzYy1kaXNhZ2d9DQojIHRyaWJibGUgZm9yIHRoZSBkaXNhZ2dyZWdhdGlvbiBwcm9wb3J0aW9ucyB1c2VkIC0tIG1vdmVkIGJlbG93IHNvIEkgZG9uJ3QgcmVhZCBhbm90aGVyIHRoaW5nIGludG8gdGhlIGVudmlyb25tZW50IA0KIyBmdWxsX2Rpc2FnZyA8LSB0cmliYmxlKA0KIyAgIH5hZ2UsIH5zZXgsIH5kaXNhZ2csIH52YWx1ZSwgDQojICAgImNoaWxkIiwgIm1hbGUiLCAiY2hpbGRfbWFsZSIsIDAuMTYyOTg5OTg5LA0KIyAgICJjaGlsZCIsICJmZW1hbGUiLCAiY2hpbGRfZmVtYWxlIiwgMC4xNTg5MDA4ODMsDQojICAgImFkdWx0IiwgIm1hbGUiLCAiYWR1bHRfbWFsZSIsIDAuMjcxNDUwODMxLA0KIyAgICJhZHVsdCIsICJmZW1hbGUiLCAiYWR1bHRfZmVtYWxlIiwgMC4zMDA0NDQ1ODUsDQojICAgImVsZGVybHkiLCAibWFsZSIsICJlbGRlcmx5X21hbGUiLCAwLjA0NDAyOTQyMywNCiMgICAiZWxkZXJseSIsICJmZW1hbGUiLCAiZWxkZXJseV9mZW1hbGUiLCAwLjA2MjE4NDI5DQojICkNCg0KIyBoZWxwZXJfZGlzYWdnIDwtIHRyaWJibGUoDQojICAgfmRpc2FnZywgfnZhbHVlLA0KIyAgICJjaGlsZCIsIDAuMzIxODkwODcyLA0KIyAgICJhZHVsdCIsIDAuNTcxODk1NDE2LA0KIyAgICJvbGRlciIsIDAuMTA2MjEzNzEyLCANCiMgICAiaGVscGVyX21hbGUiLCAwLjQ3ODQ3MDI0MiwNCiMgICAiaGVscGVyX2ZlbWFsZSIsIDAuNTIxNTI5NzU4DQojICkNCg0KZnNjX2Rpc2FnZyA8LSBmc2MgJT4lIA0KICBwaXZvdF9sb25nZXIoY29scyA9IGMoY2hpbGRfbWFsZTplbGRlcmx5X2ZlbWFsZSksIG5hbWVzX3RvID0gImRpc2FnZyIsIHZhbHVlc190byA9ICJiZW5fc3ViIikgJT4lIA0KICBsZWZ0X2pvaW4odHJpYmJsZSgNCiAgICB+YWdlLCB+c2V4LCB+ZGlzYWdnLCB+dmFsdWUsIA0KICAgICJjaGlsZCIsICJtYWxlIiwgImNoaWxkX21hbGUiLCAwLjE2Mjk4OTk4OSwNCiAgICAiY2hpbGQiLCAiZmVtYWxlIiwgImNoaWxkX2ZlbWFsZSIsIDAuMTU4OTAwODgzLA0KICAgICJhZHVsdCIsICJtYWxlIiwgImFkdWx0X21hbGUiLCAwLjI3MTQ1MDgzMSwNCiAgICAiYWR1bHQiLCAiZmVtYWxlIiwgImFkdWx0X2ZlbWFsZSIsIDAuMzAwNDQ0NTg1LA0KICAgICJlbGRlcmx5IiwgIm1hbGUiLCAiZWxkZXJseV9tYWxlIiwgMC4wNDQwMjk0MjMsDQogICAgImVsZGVybHkiLCAiZmVtYWxlIiwgImVsZGVybHlfZmVtYWxlIiwgMC4wNjIxODQyOQ0KICAgICkgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoZGlzYWdnLCBjZW5zdXNfcHJvcCA9IHZhbHVlKSwgYnkgPSAiZGlzYWdnIikgJT4lDQogIGZpbHRlcihiZW5fc3ViICE9IDApICU+JSANCiAgbXV0YXRlKGJlbl9wcm9wID0gYmVuX3N1YiAvIGJlbmVmaWNpYXJpZXMsIA0KICAgICAgICAgYmVuX3Byb3BfY29tcGFyZSA9IGFicyhjZW5zdXNfcHJvcCAtIGJlbl9wcm9wKSwNCiAgICAgICAgIHNhbWVfYXNfY2Vuc3VzID0gaWZlbHNlKGJlbl9wcm9wX2NvbXBhcmUgPCAwLjA1LCAiYmFja2ZpbGxlZCIsICJyZWFsIikpDQoNCmZzY19kaXNhZ2dfdmFsdWVzIDwtIGZzY19kaXNhZ2cgJT4lIA0KICBmaWx0ZXIodW5pcXVlX2JlbmVmaWNpYXJpZXMgPT0gIlllcyIpICU+JSANCiAgZ3JvdXBfYnkoc2FtZV9hc19jZW5zdXMpICU+JSANCiAgc3VtbWFyaXNlKGJlbl9zdWIgPSBzdW0oYmVuX3N1YikpICU+JSANCiAgYWRvcm5fcGVyY2VudGFnZXMoImNvbCIpICU+JSANCiAgbXV0YXRlKGJlbl9zdWIgPSByb3VuZChiZW5fc3ViICogMTAwLCBkaWdpdHMgPSAyKSkNCg0KYGBgDQoNCg0KSXQgaXMgZXN0aW1hdGVkIHRoYXQgYHIgZmlsdGVyKGZzY19kaXNhZ2dfdmFsdWVzLCBzYW1lX2FzX2NlbnN1cyA9PSAiYmFja2ZpbGxlZCIpICU+JSBwdWxsKGJlbl9zdWIpYCUgb2YgYmVuZWZpY2lhcmllcyByZXBvcnRlZCBpbiB0aGUgNVdzIGhhdmUgYmVlbiAiZGlzYWdncmVnYXRlZCIgYnkgYmFja2ZpbGxpbmcgdmFsdWVzIGZyb20gdGhlIGNlbnN1cy4gVGhpcyBoYXMgYmVlbiBjYWxjdWxhdGVkIGJ5IGNvbXBhcmluZyB0aGUgcHJvcG9ydGlvbnMgb2YgYWdlIGFuZCBzZXggZGlzYWdncmVnYXRpb25zIHRvIHRoZSBuYXRpb25hbCB2YWx1ZXMgc2V0IG91dCBpbiB0aGUgMjAyMSBwb3B1bGF0aW9uIHByb2plY3Rpb25zIC0tIHZhbHVlcyB3aXRoaW4gNSUgb2YgdGhlIG5hdGlvbmFsIHByb3BvcnRpb25zIGhhdmUgYmVlbiBjb25zaWRlcmVkIGFzIGJhY2tmaWxsZWQgZnJvbSB0aGUgY2Vuc3VzLiANCg0KVGhlIHBsb3QgYmVsb3cgc2hvd3MgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIGJyZWFrZG93biBvZiBiZW5lZmljaWFyaWVzIGJ5IGRpc2FnZ3JlZ2F0aW9uIGdyb3VwIHdoZW4gb25seSBjb25zaWRlcmluZyB2YWx1ZXMgdGhhdCBoYXZlIG5vdCBiZWVuIGJhY2tmaWxsZWQgZnJvbSB0aGUgY2Vuc3VzIGFnYWluc3QgYWxsIHZhbHVlcyByZXBvcnRlZCBpbiB0aGUgNVcgZGF0YXNldC4gVGhpcyBjb3JyZXNwb25kcyB0byBgciBmaWx0ZXIoZnNjX2Rpc2FnZ192YWx1ZXMsIHNhbWVfYXNfY2Vuc3VzID09ICJyZWFsIikgJT4lIHB1bGwoYmVuX3N1YilgJSBvZiByZXBvcnRlZCBiZW5lZmljaWFyaWVzLiBJdCBjYW4gYmUgb2JzZXJ2ZWQgdGhhdCBhZHVsdCBmZW1hbGVzIGFyZSBhY3R1YWxseSB0aGUgbGFyZ2VzdCBncm91cCBvZiBiZW5lZmljaWFyaWVzIHdoZW4gbG9va2luZyBhdCAiYWN0dWFsIiB2YWx1ZXMuIEFkZGl0aW9uYWxseSwgdGhlIHByb3BvcnRpb25zIG9mIHRoZSBiZW5lZmljaWFyeSBwb3B1bGF0aW9uIHdobyBhcmUgZWxkZXJseSBhcmUgZmFyIGxvd2VyIHRoYW4gd2hhdCBoYXMgYmVlbiByZWZsZWN0ZWQgaW4gdGhlIG1ham9yaXR5IG9mIGRhdGEgcmVwb3J0ZWQgaW4gdGhlIDVXcy4gDQoNCjxicj4NCg0KYGBge3IgYmFycGxvdC1yZWFsLWRpc2FnZy1icmVha2Rvd259DQpmc2NfZGlzYWdnICU+JQ0KICBmaWx0ZXIodW5pcXVlX2JlbmVmaWNpYXJpZXMgPT0gIlllcyIpICU+JSANCiAgZmlsdGVyKHNhbWVfYXNfY2Vuc3VzID09ICJyZWFsIikgJT4lIA0KICBncm91cF9ieShkaXNhZ2cpICU+JSANCiAgc3VtbWFyaXNlKGJlbl9mcmVxID0gc3VtKGJlbl9zdWIpKSAlPiUgDQogIG11dGF0ZShkaXNhZ2cgPSBmY3RfcmVsZXZlbChkaXNhZ2csIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiY2hpbGRfbWFsZSIsICJjaGlsZF9mZW1hbGUiLCAiYWR1bHRfbWFsZSIsICJhZHVsdF9mZW1hbGUiLCAiZWxkZXJseV9tYWxlIiwgImVsZGVybHlfZmVtYWxlIikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYygiZWxkZXJseV9mZW1hbGUiLCAiZWxkZXJseV9tYWxlIiwgImFkdWx0X2ZlbWFsZSIsICJhZHVsdF9tYWxlIiwgImNoaWxkX2ZlbWFsZSIsICJjaGlsZF9tYWxlIikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpICU+JSANCiAgYWRvcm5fcGVyY2VudGFnZXMoImNvbCIpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gZGlzYWdnLCB5ID0gYmVuX2ZyZXEsIGZpbGwgPSBkaXNhZ2cpKSArIA0KICBnZW9tX2NvbCgpICsgDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSByb3VuZChiZW5fZnJlcSAqIDEwMCwgZGlnaXRzID0gMSkpLCBzaXplID0gMywgdmp1c3QgPSAtMC4zKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBwZXJjZW50LCBicmVha3MgPSBzZXEoMCwgMC40LCBieSA9IDAuMSkpICsNCiAgbGFicyh4ID0gIkRpc2FnZ3JlZ2F0aW9uIGdyb3VwIiwgDQogICAgICAgeSA9ICJQZXJjZW50YWdlIG9mIGJlbmVmaWNpYXJpZXMiLA0KICAgICAgIHRpdGxlID0gIiUgb2YgYmVuZWZpY2lhcmllcyBieSBkaXNhZ2dyZWdhdGlvbiBncm91cCIsIA0KICAgICAgIHN1YnRpdGxlID0gIk9ubHkgY29udGFpbnMgcmVhbCogdmFsdWVzOyA0NCUgb2YgYmVuZWZpY2lhcmllcyIpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLCANCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2MCwgaGp1c3QgPSAxKSkgKyANCiAgDQpmc2NfZGlzYWdnICU+JSANCiAgZmlsdGVyKHVuaXF1ZV9iZW5lZmljaWFyaWVzID09ICJZZXMiKSAlPiUgDQogICMgZmlsdGVyKHNhbWVfYXNfY2Vuc3VzID09ICJiYWNrZmlsbGVkIikgJT4lIA0KICBncm91cF9ieShkaXNhZ2cpICU+JSANCiAgc3VtbWFyaXNlKGJlbl9mcmVxID0gc3VtKGJlbl9zdWIpKSAlPiUgDQogIG11dGF0ZShkaXNhZ2cgPSBmY3RfcmVsZXZlbChkaXNhZ2csIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiY2hpbGRfbWFsZSIsICJjaGlsZF9mZW1hbGUiLCAiYWR1bHRfbWFsZSIsICJhZHVsdF9mZW1hbGUiLCAiZWxkZXJseV9tYWxlIiwgImVsZGVybHlfZmVtYWxlIikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYygiZWxkZXJseV9mZW1hbGUiLCAiZWxkZXJseV9tYWxlIiwgImFkdWx0X2ZlbWFsZSIsICJhZHVsdF9tYWxlIiwgImNoaWxkX2ZlbWFsZSIsICJjaGlsZF9tYWxlIikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpICU+JSANCiAgYWRvcm5fcGVyY2VudGFnZXMoImNvbCIpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gZGlzYWdnLCB5ID0gYmVuX2ZyZXEsIGZpbGwgPSBkaXNhZ2cpKSArIA0KICBnZW9tX2NvbCgpICsgDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSByb3VuZChiZW5fZnJlcSAqIDEwMCwgZGlnaXRzID0gMSkpLCBzaXplID0gMywgdmp1c3QgPSAtMC4zKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBwZXJjZW50LCBicmVha3MgPSBzZXEoMCwgMC40LCBieSA9IDAuMSkpICsNCiAgbGFicyh4ID0gIkRpc2FnZ3JlZ2F0aW9uIGdyb3VwIiwgDQogICAgICAgeSA9ICJQZXJjZW50YWdlIG9mIGJlbmVmaWNpYXJpZXMiLA0KICAgICAgIHRpdGxlID0gIiUgb2YgYmVuZWZpY2lhcmllcyBieSBkaXNhZ2dyZWdhdGlvbiBncm91cCIsIA0KICAgICAgIHN1YnRpdGxlID0gIkNvbnRhaW5zIGFsbCB2YWx1ZXMsIGluY2x1ZGluZyBiYWNrZmlsbGVkIHZhbHVlcyIpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLCANCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2MCwgaGp1c3QgPSAxKSkNCiAgDQpgYGANCiANCiA8YnI+DQogDQpUaGlzIHdhcyBjb25maXJtZWQgYnkgZXhhbWluaW5nIHRoZSBkaXN0cmlidXRpb25zIG9mIGJlbmVmaWNpYXJ5IGRpc2FnZ3JlZ2F0aW9ucyBieSBpbXBsZW1lbnRpbmcgcGFydG5lci4gRnJvbSB0aGUgcGxvdCBiZWxvdywgaXQgaXMgb2JzZXJ2ZWQgdGhhdCB0aGUgbWFqb3JpdHkgb2YgZGlzYWdncmVnYXRlZCB2YWx1ZXMgd2VyZSB2ZXJ5IGNsb3NlIHRvIHRoZSBtZWFuIGZvciB0aGUgZW50aXJlIGdyb3VwLiBUbyBleHBsYWluOiBpZiBwYXJ0bmVyIEEgcmVwb3J0ZWQgdGhhdCA0MCUgb2YgdGhlIGJlbmVmaWNpYXJpZXMgb2YgYW4gYWN0aXZpdHkgd2VyZSBhZHVsdCBmZW1hbGVzLCB0aGlzIHBlcmNlbnRhZ2Ugd2FzIHRoZW4gY29tcGFyZWQgdG8gdGhlIG1lYW4gcGVyY2VudGFnZSBvZiBiZW5lZmljaWFyaWVzIGZvcm1lZCBieSBhZHVsdCBmZW1hbGVzIGZvciBhbGwgdGhlIG90aGVyIGFjdGl2aXRpZXMgcmVwb3J0ZWQgYnkgdGhhdCBwYXJ0bmVyLiBUaGlzIG1lYXN1cmVzIHdoZXRoZXIgb3Igbm90IHRoZSBzYW1lIHByb3BvcnRpb25zIHdlcmUganVzdCBjb3BpZWQgYW5kIHBhc3RlZCB0aHJvdWdob3V0IHRoZSA1VyBiZW5lZmljaWFyeSBkaXNhZ2dyZWdhdGlvbiBjb2x1bW5zIC0tIGl0IGlzIGV4dHJlbWVseSB1bmxpa2VseSB0aGF0IHRoZXNlIHBlcmNlbnRhZ2VzIHdvdWxkIGJlIHNpbWlsYXIgYWNyb3NzIGFjdGl2aXRpZXMgYXMgaW1wbGVtZW50aW5nIHBhcnRuZXJzIHdvcmtlZCBpbiBhbiBhdmVyYWdlIG9mIGByIHJvdW5kKGZzYyAlPiUgZ3JvdXBfYnkoaW1wbGVtZW50aW5nX3BhcnRuZXJzKSAlPiUgc3VtbWFyaXNlKGxvY2F0aW9ucyA9IG5fZGlzdGluY3QobG9jYXRpb24pKSAlPiUge21lYW4oLiRsb2NhdGlvbnMpfSwgZGlnaXRzID0gMilgIGxvY2F0aW9ucy4gVGhpcyBsZXZlbCBvZiB2YXJpYWJpbGl0eSBpcyBtdWNoIGxvd2VyIHRoYW4gd2hhdCBleGlzdHMgaW4gdGhlIGdlbmVyYWwgcG9wdWxhdGlvbi4gDQoNCjxicj4NCg0KYGBge3IgZGVuc2l0eS1wbG90LWRpc2FnZ3JlZ2F0aW9ufQ0KZnNjX2Rpc2FnZyAlPiUgDQogIGZpbHRlcih1bmlxdWVfYmVuZWZpY2lhcmllcyA9PSAiWWVzIikgJT4lIA0KICBtdXRhdGUocGNfZGlzYWdnID0gYmVuX3N1YiAvIGJlbmVmaWNpYXJpZXMpICU+JSANCiAgZ3JvdXBfYnkoaW1wbGVtZW50aW5nX3BhcnRuZXJzLCBkaXNhZ2cpICU+JSANCiAgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKHBjX2Rpc2FnZyksIA0KICAgICAgICAgICAgc2QgPSBzZChwY19kaXNhZ2csIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICBiZW5fc3ViID0gc3VtKGJlbl9zdWIsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gc2QsIGZpbGwgPSBkaXNhZ2cpKSArDQogIGdlb21fZGVuc2l0eShwb3NpdGlvbiA9ICJzdGFjayIsIGFkanVzdCA9IDAuNSkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjMDBCRkM0IiwgIiMwMEJBMzgiLCAiI0I3OUYwMCIsICIjRjg3NjZEIiwgIiM2MTlDRkYiLCAiI0Y1NjRFMyIpKSArIA0KICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gcGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSkgKw0KICBsYWJzKHggPSAiUGVyY2VudGFnZSBkaWZmZXJlbmNlIGZyb20gZ3JvdXAgbWVhbiIsDQogICAgICAgdGl0bGUgPSAiRGVuc2l0eSBwbG90IG9mIHN0YW5kYXJkIGRldmlhdGlvbnMgYWNyb3NzIGJlbmVmaWNpYXJ5IGRpc2FnZ3JlZ2F0aW9ucyIsDQogICAgICAgc3VidGl0bGUgPSAiVGhlIGxvd2VyIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24sIHRoZSBjbG9zZXIgdGhlIHZhbHVlIHRvIHRoZSBncm91cCBtZWFuIiwNCiAgICAgICBmaWxsID0gIiIpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gYygwLjksIDAuNzUpKQ0KIA0KYGBgDQoNCg0KPGJyPjxicj4NCg0KIyMjIDQuMiBUeXBlcyBvZiBiZW5lZmljaWFyaWVzDQoNCmBgYHtyIGJlbmVmaWNpYXJ5LXR5cGUtZGF0YXNldH0NCmJlbl90eXBlIDwtIGZzYyAlPiUgDQogIGZpbHRlcighaXMubmEoYmVuZWZpY2lhcnlfdHlwZSkgJiB1bmlxdWVfYmVuZWZpY2lhcmllcyA9PSAiWWVzIikgJT4lIA0KICBncm91cF9ieShiZW5lZmljaWFyeV90eXBlKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUNCiAgYWRvcm5fcGVyY2VudGFnZXMoZGVub21pbmF0b3IgPSAiY29sIiwgbmEucm0gPSBUUlVFKSAlPiUgDQogIG11dGF0ZShiZW5lZmljaWFyaWVzID0gcm91bmQoYmVuZWZpY2lhcmllcyAqIDEwMCwgZGlnaXRzID0gMikpDQpgYGANCg0KT3ZlcmFsbCwgYHIgYmVuX3R5cGUgJT4lIGZpbHRlcihiZW5lZmljaWFyeV90eXBlID09ICJIb3N0L2xvY2FsIENvbW11bml0eSIpICU+JSBwdWxsKGJlbmVmaWNpYXJpZXMpYCUgb2YgYmVuZWZpY2lhcmllcyBhcmUgZnJvbSB0aGUgaG9zdC9sb2NhbCBjb21tdW5pdHksIGByIGJlbl90eXBlICU+JSBmaWx0ZXIoYmVuZWZpY2lhcnlfdHlwZSA9PSAiUmFraGluZSBzdGF0ZWxlc3MiKSAlPiUgcHVsbChiZW5lZmljaWFyaWVzKWAlIGFyZSBzdGF0ZWxlc3MgcGVyc29ucyBmcm9tIFJha2hpbmUgYW5kIGByIGJlbl90eXBlICU+JSBmaWx0ZXIoYmVuZWZpY2lhcnlfdHlwZSA9PSAiSW50ZXJuYWxseSBEaXNwbGFjZWQiKSAlPiUgcHVsbChiZW5lZmljaWFyaWVzKWAlIGFyZSBJRFBzLiBSZXR1cm5lZXMgYXJlIHRoZSByYXJlc3QgdHlwZSBvZiBiZW5lZmljaWFyeSByZWFjaGVkLCBmb3JtaW5nIG9ubHkgYHIgYmVuX3R5cGUgJT4lIGZpbHRlcihiZW5lZmljaWFyeV90eXBlID09ICJSZXR1cm5lZXMiKSAlPiUgcHVsbChiZW5lZmljaWFyaWVzKWAlIG9mIGFsbCBiZW5lZmljaWFyaWVzIHJlYWNoZWQuDQoNCmBgYHtyIHRhYmxlLWJlbi10eXBlfQ0KZnNjICU+JSAgDQogIGZpbHRlcighaXMubmEoYmVuZWZpY2lhcnlfdHlwZSkgJiB1bmlxdWVfYmVuZWZpY2lhcmllcyA9PSAiWWVzIikgJT4lIA0KICBncm91cF9ieShocnBfaWVycCwgYmVuZWZpY2lhcnlfdHlwZSkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lIA0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gaHJwX2llcnAsIHZhbHVlc19mcm9tID0gYmVuZWZpY2lhcmllcykgICU+JSANCiAgYWRvcm5fdG90YWxzKCJjb2wiKSAlPiUgDQogIG11dGF0ZShwY19vZl9iZW4gPSByb3VuZChUb3RhbCAvIHN1bShUb3RhbCkgKiAxMDAsIGRpZ2l0cyA9IDIpKSAlPiUgDQogIHJlbmFtZSh0b3RhbF9iZW5lZmljaWFyaWVzID0gVG90YWwpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJCcmVha2Rvd24gb2YgYmVuZWZpY2lhcnkgdHlwZXMgYnkgcmVzcG9uc2UgcGxhbiIsIGZvcm1hdC5hcmdzID0gbGlzdChiaWcubWFyayA9ICIsIikpICU+JSANCiAga2FibGVfY2xhc3NpY18yKCkNCiAgDQpgYGANCg0KDQoNCjxicj4NCg0KVGhlIHN0YXRlcyBhbmQgcmVnaW9ucyBpbiB3aGljaCB0aGUgRlNDIGlzIHdvcmtpbmcgdGhlIG1vc3Qgd2l0aCBJRFBzIGFyZSBDaGluLCBLYWNoaW4sIFNhZ2FpbmcgYW5kIFNoYW4gKE5vcnRoKSBhbmQgS2F5YWg6ICANCg0KYGBge3IgdGFibGUtYmVuZWZpY2lhcnktdHlwZXMtc3RhdGV9DQpmc2MgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGJlbmVmaWNpYXJ5X3R5cGUpICYgdW5pcXVlX2JlbmVmaWNpYXJpZXMgPT0gIlllcyIpICU+JSANCiAgZ3JvdXBfYnkoc3RhdGUsIGJlbmVmaWNpYXJ5X3R5cGUpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcyksIC5ncm91cHMgPSAiZHJvcCIpICU+JSAgDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBiZW5lZmljaWFyeV90eXBlLCB2YWx1ZXNfZnJvbSA9IGJlbmVmaWNpYXJpZXMpICU+JSANCiAgYWRvcm5fdG90YWxzKHdoZXJlID0gInJvdyIsIG5hLnJtID0gVFJVRSkgJT4lIA0KICBhZG9ybl9wZXJjZW50YWdlcyhkZW5vbWluYXRvciA9ICJyb3ciLCBuYS5ybSA9IFRSVUUpICU+JSANCiAgbXV0YXRlKGFjcm9zcygtc3RhdGUsIH4gcm91bmQoLiAqIDEwMCwgZGlnaXRzID0gMikpKSAlPiUgDQogIGxlZnRfam9pbihmc2MgJT4lIA0KICAgICAgICAgICAgICBmaWx0ZXIoIWlzLm5hKGJlbmVmaWNpYXJ5X3R5cGUpICYgdW5pcXVlX2JlbmVmaWNpYXJpZXMgPT0gIlllcyIpICU+JQ0KICAgICAgICAgICAgICBzdW1fYmVuKHN0YXRlKSwgYnkgPSAic3RhdGUiKSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiUGVyY2VudGFnZSBicmVha2Rvd24gb2YgYmVuZWZpY2lhcnkgdHlwZXMgYnkgc3RhdGUvcmVnaW9uIiwgZm9ybWF0LmFyZ3MgPSBsaXN0KGJpZy5tYXJrID0gIiwiKSkgJT4lIA0KICBrYWJsZV9jbGFzc2ljXzIobGlnaHRhYmxlX29wdGlvbnMgPSAic3RyaXBlZCIpICU+JSAgDQogIGZvb3Rub3RlKCJFYWNoIHJvdyBpbiB0aGUgdGFibGUgc2hvd3MgdGhlIHBlcmNlbnRhZ2Ugb2YgZWFjaCBiZW5lZmljaWFyeSB0eXBlIHdpdGhpbiBlYWNoIHN0YXRlL3JlZ2lvbiIsDQogICAgICAgICAgIGdlbmVyYWxfdGl0bGUgPSAiIikNCiMgcGFuZGVyKGNhcHRpb24gPSAiUGVyY2VudGFnZSBicmVha2Rvd24gb2YgYmVuZWZpY2lhcnkgdHlwZXMgYnkgc3RhdGUvcmVnaW9uIikNCg0KYGBgDQoNCjxicj4NCg0KQ29tcGFyZWQgdG8gb25seSB0aGUgMjAyMSBIUlAgdGFyZ2V0cyAoYXMgdGhlIElFUlAgZG9lcyBub3QgaGF2ZSBicmVha2Rvd25zIG9mIHRoZSB0YXJnZXQgYnkgYmVuZWZpY2lhcnkgdHlwZSksIGJlZW5maWNpYXJ5IHR5cGUgdGFyZ2V0cyBoYXZlIGJlZW4gbW9zdGx5IGV4Y2VlZGVkLCBuZWl0aGVyIHRoZSB0YXJnZXRzIGZvciByZXR1cm5lZXMvcmVzZXR0bGVkIGluIEthY2hpbiBvciBTaGFuIChOb3J0aCkgbm9yIHRhcmdldHMgZm9yIElEUHMgaW4gUmFraGluZSBoYXZlIGJlZW4gbWV0LiBJbnRlcmVzdGluZ2x5LCBmb3IgUmFraGluZSwgdGhlIHRhcmdldHMgZm9yIHRoZSBob3N0L2xvY2FsIHBvcHVsYXRpb24gaGF2ZSBiZWVuIGdyZWF0bHkgZXhjZWVkZWQgYW5kIHZhcmlvdXMgYXNzdW1wdGlvbnMgY2FuIGJlIGZvcm11bGF0ZWQgcmVnYXJkaW5nIHRoaXM6DQoNCiogVGhlcmUgd2FzIGJldHRlciBpbnRlZ3JhdGlvbiBvZiB0aGUgaG9zdCBwb3B1bGF0aW9uIGludG8gcmVsaWVmIHByb2dyYW1taW5nDQoqIFRoZXJlIHdhcyBzdWZmaWNpZW50IGF2YWlsYWJpbGl0eSBvZiBmdW5kcyB0byBjb3ZlciB0aGUgZm9vZCBuZWVkcyBvZiBJRFBzDQoqIFRoZSByZWxhdGl2ZSBzdGFiaWxpdHkgb2YgdGhlIFJha2hpbmUgc3RhdGUgY29udGV4dCBkaXNjb3VyYWdlcyBkb25vcnMgZnJvbSBzdXBwb3J0aW5nIGVtZXJnZW5jeSByZWxpZWYgYWN0aXZpdGllcyBmb3IgdGhlIHN0YXRlbGVzcyBwb3B1bGF0aW9uIHRoZXJlIA0KKiBGdW5kcyBmcm9tIGRldmVsb3BtZW50IGRvbm9ycyBhcmUgYWxzbyBhdmFpbGFibGUgaW4gUmFraGluZSBzdGF0ZQ0KDQpJbiBCYWdvIChFYXN0KSwgQ2hpbiwgS2F5aW4gYW5kIHBhcnRpY3VsYXJseSBTaGFuIChOb3J0aCksIHRoZSB0YXJnZXRzIGZvciBJRFBzIGhhdmUgYmVlbiBncmVhdGx5IGV4Y2VlZGVkLCBpbiBjb21wYXJpc29uIHRvIHRoZSAyMDIxIEhSUCB0YXJnZXRzLg0KDQpgYGB7ciB0YWJsZS1iZW5lZmljaWFyeS10eXBlLXJlYWNoZWQtaHJwLXRhcmdldH0NCiMgcmVtaW5kZXIgdG8gY2hlY2sgdGhlIHRleHQgaW4gdGhlIHBhcmFncmFwaCBhYm92ZSB3aGVuIHlvdSByZXJ1biB0aGUgcmVwb3J0IHdpdGggZGF0YQ0KcGluICU+JQ0KICBmaWx0ZXIoaHJwX3RhcmdldF90b3RhbCA+IDApICU+JSANCiAgc2VsZWN0KHN0YXRlLCBhZG1pbjNfcGNvZGUsIGhycF90YXJnZXRfaWRwc18yMDIxLCBocnBfdGFyZ2V0X3JldHVybmVlc18yMDIxLCBocnBfdGFyZ2V0X3N0YXRlbGVzc19yYWtoaW5lXzIwMjEsIA0KICAgICAgICAgICAgICAgICAgICAgaHJwX3RhcmdldF9vdGhlcl92dWxuZXJhYmxlXzIwMjEsIGhycF90YXJnZXRfdG90YWwpICU+JSANCiAgbGVmdF9qb2luKGZzYyAlPiUgDQogICAgICAgICAgICBmaWx0ZXIoIWlzLm5hKGJlbmVmaWNpYXJ5X3R5cGUpICYgdW5pcXVlX2JlbmVmaWNpYXJpZXMgPT0gIlllcyIgJiBocnBfaWVycCAhPSAibm9uX2hycCIpICU+JSANCiAgZ3JvdXBfYnkoYWRtaW4zX3Bjb2RlLCBiZW5lZmljaWFyeV90eXBlKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUNCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGJlbmVmaWNpYXJ5X3R5cGUsIHZhbHVlc19mcm9tID0gYmVuZWZpY2lhcmllcykgJT4lIA0KICBtdXRhdGUodG90YWxfYmVuZWZpY2lhcmllcyA9IHJvd1N1bXMoYWNyb3NzKHdoZXJlKGlzLm51bWVyaWMpKSwgbmEucm0gPSBUUlVFKSksIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgY2xlYW5fbmFtZXMoKSAlPiUNCiAgcmVwbGFjZShpcy5uYSguKSwgMCkgJT4lIA0KICBncm91cF9ieShzdGF0ZSkgJT4lIA0KICBzdW1tYXJpc2VfYXQodmFycyhocnBfdGFyZ2V0X2lkcHNfMjAyMTp0b3RhbF9iZW5lZmljaWFyaWVzKSwgfnN1bSguKSkgJT4lIA0KICBtdXRhdGUoaG9zdF9sb2NhbF9wYyA9IGhvc3RfbG9jYWxfY29tbXVuaXR5IC8gaHJwX3RhcmdldF9vdGhlcl92dWxuZXJhYmxlXzIwMjEgKiAxMDAsIA0KICAgICAgICAgaWRwX3BjID0gaW50ZXJuYWxseV9kaXNwbGFjZWQgLyBocnBfdGFyZ2V0X2lkcHNfMjAyMSAqIDEwMCwNCiAgICAgICAgIHJldHVybmVlc19wYyA9IHJldHVybmVlcyAvIGhycF90YXJnZXRfcmV0dXJuZWVzXzIwMjEgKiAxMDAsDQogICAgICAgICByYWtoaW5lX3N0YXRlbGVzc19wYyA9IHJha2hpbmVfc3RhdGVsZXNzIC8gaHJwX3RhcmdldF9zdGF0ZWxlc3NfcmFraGluZV8yMDIxICogMTAwLA0KICAgICAgICAgdG90YWxfcGMgPSB0b3RhbF9iZW5lZmljaWFyaWVzIC8gaHJwX3RhcmdldF90b3RhbCAqIDEwMCkgJT4lIA0KICBzZWxlY3Qoc3RhdGUsIGhvc3RfbG9jYWxfcGMsIGlkcF9wYywgcmV0dXJuZWVzX3BjLCByYWtoaW5lX3N0YXRlbGVzc19wYywgdG90YWxfcGMpICU+JQ0KICBtdXRhdGVfYXQodmFycyhob3N0X2xvY2FsX3BjLCBpZHBfcGMsIHJldHVybmVlc19wYywgcmFraGluZV9zdGF0ZWxlc3NfcGMsIHRvdGFsX3BjKSwgfiByZXBsYWNlKC4sIGlzLm5hbiguKSwgTkEpKSAlPiUNCiAgbXV0YXRlX2F0KHZhcnMoaG9zdF9sb2NhbF9wYywgaWRwX3BjLCByZXR1cm5lZXNfcGMsIHJha2hpbmVfc3RhdGVsZXNzX3BjLCB0b3RhbF9wYyksIH4gcmVwbGFjZSguLCBpcy5pbmZpbml0ZSguKSwgTkEpKSAlPiUNCiAgbXV0YXRlX2F0KHZhcnMoaG9zdF9sb2NhbF9wYywgaWRwX3BjLCByZXR1cm5lZXNfcGMsIHJha2hpbmVfc3RhdGVsZXNzX3BjLCB0b3RhbF9wYyksIH4gcm91bmQoLiwgZGlnaXRzID0gMikpICU+JQ0KICByZW5hbWUoYGhvc3RfbG9jYWwlYCA9IGhvc3RfbG9jYWxfcGMsDQogICAgICAgICBgaWRwJWAgPSBpZHBfcGMsDQogICAgICAgICBgcmV0dXJuZWVzJWAgPSByZXR1cm5lZXNfcGMsDQogICAgICAgICBgcmFraGluZV9zdGF0ZWxlc3MlYCA9IHJha2hpbmVfc3RhdGVsZXNzX3BjLA0KICAgICAgICAgYHRvdGFsJWAgPSB0b3RhbF9wYykgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIlBlcmNlbnRhZ2Ugb2YgMjAyMSBIUlAgdGFyZ2V0IHJlYWNoZWQgYnkgYmVuZWZpY2lhcnkgdHlwZSIpICU+JSANCiAga2FibGVfY2xhc3NpY18yKCJzdHJpcGVkIikgJT4lICANCiAgZm9vdG5vdGUoIk9ubHkgSFJQL0lFUlAgYmVuZWZpY2lhcmllcyBoYXZlIGJlbiBpbmNsdWRlZCIsDQogICAgICAgICAgIGdlbmVyYWxfdGl0bGUgPSAiIikNCiAgIyBwYW5kZXIoY2FwdGlvbiA9ICJQZXJjZW50YWdlIG9mIDIwMjEgSFJQIHRhcmdldCByZWFjaGVkIGJ5IGJlbmVmaWNpYXJ5IHR5cGUiKQ0KDQogIA0KYGBgDQoNCjxicj4NCg0KVW5mb3J0dW5hdGVseSwgdGhlIEZTQyBtb25pdG9yaW5nIHN5c3RlbSBkb2VzIG5vdCBhbGxvdyBmb3IgdGhlIGNhdGVnb3Jpc2F0aW9uIG9mIEZTQyBiZW5lZmljaWFyaWVzIGFjY29yZGluZyB0byB0aGVpciBmb29kIHNlY3VyaXR5IHN0YXR1cyAobW9kZXJhdGVseSBvciBzZXZlcmVseSBmb29kIGluc2VjdXJlKS4gVGhpcyBsaW1pdGF0aW9uIGRvZXMgbm90IGFsbG93IHRoZSBGU0MgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIG1vc3QgdnVsbmVyYWJsZSBob3VzZWhvbGRzIHdlcmUgcmVhY2hlZCBieSBmb29kIHNlY3VyaXR5IGFzc2lzdGFuY2UuIFRoZSBGU0Mgd2lsbCBzdHJpdmUgdG8gYnJpZGdlIHRoaXMgZ2FwIGluIDIwMjIgYnk6IA0KDQoqIEVucXVpcmluZyBhYm91dCBGU0MgcGFydG5lcnMnIGJlbmVmaWNpYXJ5IHNlbGVjdGlvbiBjcml0ZXJpYSBhbmQgZm9vZCBzZWN1cml0eSBzdGF0dXMgYXNzZXNzbWVudHMNCiogRGV2ZWxvcGluZyBhIGNvbW1vbiBmb29kIHNlY3VyaXR5IGRhdGEgY29sbGVjdGlvbiBzeXN0ZW0gDQoqIEV4cGxvcmluZyBuZXcgb3B0aW9ucyBmb3IgZm9vZCBzZWN1cml0eSBhc3Nlc3NtZW50cyAoc2F0ZWxsaXRlIHBob3Rvcywgb3V0c291cmNpbmcgYXNzZXNzbWVudHMgdG8gZXh0ZXJuYWwgcGFydG5lcnMsIHRoaXJkLXBhcnR5IG1vbmlvcmluZywgZXRjLikNCg0KPGJyPjxicj4NCg0KIyMjIDQuMyBNb250aGx5IHByb2dyZXNzIGJ5IGJlbmVmaWNpYXJ5IHR5cGUNCg0KPGJyPg0KDQpgYGB7ciBiZW5lZmljaWFyeS10eXBlcy1wcm9ncmVzcy1vdmVyLXRpbWUtZmFjZXR9DQpiZW4gJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGJlbmVmaWNpYXJ5X3R5cGUpKSAlPiUgDQogIGdyb3VwX2J5KGJlbmVmaWNpYXJ5X3R5cGUpICU+JSANCiAgYXJyYW5nZShkYXRlKSAlPiUgDQogIG11dGF0ZShjdW1fYmVuID0gY3Vtc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUNCiAgbXV0YXRlKGJlbmVmaWNpYXJ5X3R5cGUgPSBmY3RfcmVvcmRlcihiZW5lZmljaWFyeV90eXBlLCBjdW1fYmVuLCBtYXgsIC5kZXNjID0gVFJVRSkpICU+JSAgDQogIGdncGxvdChhZXMoeCA9IGRhdGUsIHkgPSBjdW1fYmVuKSkgKw0KICBnZW9tX2xpbmUoc2l6ZSA9IDAuNykgKyANCiAgc2NhbGVfeF9kYXRlKGRhdGVfYnJlYWtzID0gIjEgbW9udGgiLCBkYXRlX2xhYmVscyA9ICIlYiIpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArDQogIGdlb21fdmxpbmUoY29sb3VyID0gInJlZCIsIGx0eSA9IDIsIHhpbnRlcmNlcHQgPSBhcy5udW1lcmljKGFzLkRhdGUoIjIwMjEtMDYtMDEiKSkpICsNCiAgZmFjZXRfd3JhcCh+IGJlbmVmaWNpYXJ5X3R5cGUsIHNjYWxlcyA9ICJmcmVlX3kiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpKSArICMgc2VlIGlmIHRoaXMgd29ya3Mgd2hlbiB5b3Uga25pdCwgdGhlbiBkbyBpdCBmb3IgdGhlIG90aGVyIHBsb3RzIA0KICBsYWJzKHggPSAiTW9udGgiLCANCiAgICAgICB5ID0gIkN1bXVsYXRpdmUgYmVuZWZpY2lhcmllcyIsIA0KICAgICAgIHRpdGxlID0gIk1vbnRobHkgcHJvZ3Jlc3MgYnkgYmVuZWZpY2lhcnkgdHlwZSwgMjAyMSIpICsgDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSkNCg0KYGBgDQoNCjxicj4NCg0KQSBzaWduaWZpY2FudCBpbmNyZWFzZSBpbiB0aGUgbnVtYmVycyBvZiBwZXJzb25zIGluIHRoZSBob3N0L2xvY2FsIGNvbW11bml0eSByZWFjaGVkIGFmdGVyIEp1bmUgMjAyMSBoYXMgYmVlbiBub3RlZC4gQWxtb3N0IGFsbCBob3N0L2xvY2FsIGNvbW11bml0eSBiZW5lZmljaWFyaWVzIHdlcmUgcmVhY2hlZCBhZnRlciB0aGUgcHVibGljYXRpb24gb2YgdGhlIEhSUCBhZGRlbmR1bS4gQ29udmVyc2VseSwgdGhlIHByb2dyZXNzIGFtb25nc3Qgc3RhdGVsZXNzIHBlcnNvbnMgaW4gUmFraGluZSBzbG93ZWQgc3Vic3RhbnRpYWxseSBhZnRlciB0aGUgcHVibGljYXRpb24gb2YgdGhlIGFkZGVuZHVtLiBUaGUgSUVSUCByZXNwb25zZSBtYWlubHkgZm9jdXNlZCBvbiBwZXJpLXVyYmFuIGFyZWFzIGluIFlhbmdvbiBhbmQgTWFuZGFsYXk6IHRoZXNlIGJlbmVmaWNpYXJpZXMgcmVwcmVzZW50ZWQgYWxtb3N0IDIuMSBtaWxsaW9uIG91dCBvZiB0aGUgMi44IG1pbGxpb24gcGVyc29ucyByZWFjaGVkIGluIDIwMjEuIA0KDQpUaGUgY29udGV4dCBpbiBSYWtoaW5lIHN0YXRlIGhhcyByZW1haW5lZCBzdGFibGUgc2luY2UgdGhlIGNvdXAsIHdpdGggbm8gbWFqb3IgaW5jcmVhc2UgaW4gY29uZmxpY3QgZXZlbnRzLiBDb25zZXF1ZW50bHksIGZvb2Qgc2VjdXJpdHkgYXNzaXN0YW5jZSBpbiBSYWtoaW5lIGhhcyBmb2xsb3dlZCB0aGUgb3JpZ2luYWwgZm9vZCBzZWN1cml0eSBwcm9ncmFtbWluZywgYXMgbGFpZCBvdXQgaW4gdGhlIDIwMjEgSFJQLiBSZWdhcmRpbmcgSURQcyAoOCUgb2YgdGhlIGNhc2Vsb2FkKSBhbmQgUmV0dXJuZWVzICgwLjA3JSBvZiB0aGUgY2FzZWxvYWQpLCBpdCBpcyBkaWZmaWN1bHQgdG8gbWVhc3VyZSB0aGUgaW1wYWN0IG9mIHRoZSBJRVJQIG9uIHJlYWNoaW5nIHRoZXNlIHZ1bG5lcmFibGUgZ3JvdXBzLiANCg0KSW4gU2VwdGVtYmVyIDIwMjEsIGR1cmluZyB0aGUgcHJlcGFyYXRpb24gb2YgdGhlIEh1bWFuaXRhcmlhbiBOZWVkcyBPdmVydmlldywgT0NIQSBjYWxjdWxhdGVkIHRoZSBudW1iZXIgb2YgSURQcyBpbiBNeWFubWFyIGF0IDU0OCwwNzAgcGVyc29ucy4gRm9yIDIwMjIsIHRoaXMgcG9wdWxhdGlvbiBoYXMgYmVlbiBjbGFzc2lmaWVkIGFzIHNldmVyZWx5IGZvb2QgaW5zZWN1cmUuIFRoaXMgbWVhbnMgdGhhdCB0aGUgRlNDIG11c3Qgc3RyaXZlIHRvIHJlYWNoIHRoaXMgdnVsbmVyYWJsZSBncm91cC4gSW4gMjAyMSwgb25seSA0OSUgb2YgSURQcyB3ZXJlIHJlYWNoZWQuIA0KDQpCZW5lZmljaWFyaWVzIGZyb20gdGhlIGhvc3QvbG9jYWwgY29tbXVuaXR5IGZvcm1lZCAyOCUgb2YgdGhlIGJlbmVmaWNpYXJpZXMgdW5kZXIgdGhlIEhSUCwgYnV0IDk3JSBvZiBJRVJQIGJlbmVmaWNpYXJpZXMuIElEUHMgZm9ybWVkIDI5LjUlIG9mIEhSUCBiZW5lZmljaWFyaWVzLCBidXQgb25seSAzJSBvZiBJRVJQIGJlbmVmaWNpYXJpZXMuIFN0YXRlbGVzcyBwZXJzb25zIGluIFJha2hpbmUgd2VyZSBvbmx5IHN1cHBvcnRlZCB1bmRlciB0aGUgSFJQIGFzIHRoZSBJRVJQIGRpZCBub3QgdGFyZ2V0IFJha2hpbmUgc3RhdGUuIA0KDQo8YnI+DQoNCmBgYHtyIHRhYmxlLWJlbi10eXBlLWJlZm9yZS1hZnRlci1pZXJwfQ0KZnNjICU+JSANCiAgZmlsdGVyKHVuaXF1ZV9iZW5lZmljaWFyaWVzID09ICJZZXMiKSAlPiUgDQogIGZpbHRlcighaXMubmEoYmVuZWZpY2lhcnlfdHlwZSkpICU+JSANCiAgc3VtX2JlbjIoaHJwX2llcnAsIGJlbmVmaWNpYXJ5X3R5cGUpICU+JSANCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGhycF9pZXJwLCB2YWx1ZXNfZnJvbSA9IGJlbmVmaWNpYXJpZXMpICU+JSANCiAgbXV0YXRlKGAlX29mX0hSUGAgPSByb3VuZChocnAgLyBzdW0oaHJwKSAqIDEwMCwgZGlnaXRzID0gMiksDQogICAgICAgICBgJV9vZl9JRVJQYCA9IHJvdW5kKGllcnAgLyBzdW0oaWVycCwgbmEucm0gPSBUUlVFKSAqIDEwMCwgZGlnaXRzID0gMiksIA0KICAgICAgICAgYCVfb2Zfbm9uSFJQYCA9IHJvdW5kKG5vbl9ocnAgLyBzdW0obm9uX2hycCwgbmEucm0gPSBUUlVFKSAqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAgcmVsb2NhdGUoaHJwLCAuYWZ0ZXIgPSBiZW5lZmljaWFyeV90eXBlKSAlPiUgDQogIHJlbmFtZShIUlAgPSBocnAsDQogICAgICAgICBJRVJQID0gaWVycCwNCiAgICAgICAgIG5vbl9IUlAgPSBub25faHJwKSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiQmVuZWZpY2lhcmllcyByZWFjaGVkIGJ5IHR5cGUsIGJ5IHJlc3BvbnNlIHBsYW4iLCBmb3JtYXQuYXJncyA9IGxpc3QoYmlnLm1hcmsgPSAiLCIpKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMigpIA0KIyBwYW5kZXIoY2FwdGlvbiA9ICJCZW5lZmljaWFyaWVzIHJlYWNoZWQgYnkgdHlwZSwgYnkgcmVzcG9uc2UgcGxhbiIpDQogIA0KYGBgDQoNCg0KDQo8YnI+PGJyPg0KDQojIyMgNC40IEdhcHMgaW4gbW9udGhseSBwcm9ncmFtbWluZw0KDQpgYGB7ciB0YWJsZS1nYXBzLW1vbnRoc30NCiMgSSBmZWVsIGxpa2UgdGhpcyBpcyB0aGUgbW9zdCBpbmVmZmljaWVudCB3YXkgdG8gZG8gdGhpczsgc3RpbGwgd29ya3MsIHRob3VnaCANCiMgeW91J3JlIGdvaW5nIHRvIG5lZWQgdG8gcmV3cml0ZSB0aGlzIHdoZW4geW91IGhhdmUgUTQgZGF0YSANCmdhcF9tb250aHMgPC0gZnNjICU+JSANCiAgZmlsdGVyKGZyZXF1ZW5jeSA9PSAiTW9udGhseSIgJiBiZW5lZmljaWFyaWVzID4gMCkgJT4lIA0KICBncm91cF9ieShkYXRlLCBpbXBsZW1lbnRpbmdfcGFydG5lcnMsIGFjdGl2aXR5LCBzdGF0ZSwgdG93bnNoaXAsIGxvY2F0aW9uKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBkYXRlLCB2YWx1ZXNfZnJvbSA9IGJlbmVmaWNpYXJpZXMpICU+JSANCiAgdW5uZXN0KCkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBtdXRhdGUocmVjdXJyZW5jZXMgPSByb3dTdW1zKCFpcy5uYShzZWxlY3QoLiwgLWltcGxlbWVudGluZ19wYXJ0bmVycywgLWFjdGl2aXR5LCAtc3RhdGUsIC10b3duc2hpcCwgLWxvY2F0aW9uKSkpLA0KICAgICAgICAgYmVuX21heCA9IHBtYXgoYDIwMjEtMDEtMDFgLCBgMjAyMS0wMi0wMWAsIGAyMDIxLTAzLTAxYCwgYDIwMjEtMDQtMDFgLCBgMjAyMS0wNS0wMWAsIGAyMDIxLTA2LTAxYCwNCiAgICAgICAgICAgICAgICAgICAgICAgIGAyMDIxLTA3LTAxYCwgYDIwMjEtMDgtMDFgLCBgMjAyMS0wOS0wMWAsIGAyMDIxLTEwLTAxYCwgYDIwMjEtMTEtMDFgLCBgMjAyMS0xMi0wMWAsIG5hLnJtID0gVFJVRSkpICU+JQ0KICBwaXZvdF9sb25nZXIoY29scyA9IGMoYDIwMjEtMDEtMDFgLCBgMjAyMS0wMi0wMWAsIGAyMDIxLTAzLTAxYCwgYDIwMjEtMDQtMDFgLCBgMjAyMS0wNS0wMWAsIGAyMDIxLTA2LTAxYCwNCiAgICAgICAgICAgICAgICAgICAgICAgIGAyMDIxLTA3LTAxYCwgYDIwMjEtMDgtMDFgLCBgMjAyMS0wOS0wMWAsIGAyMDIxLTEwLTAxYCwgYDIwMjEtMTEtMDFgLCBgMjAyMS0xMi0wMWApLCANCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gImRhdGUiLCB2YWx1ZXNfdG8gPSAiYmVuZWZpY2lhcmllcyIpICU+JSANCiAgbXV0YXRlKGRpc3RyaWJ1dGlvbiA9IGlmZWxzZShpcy5uYShiZW5lZmljaWFyaWVzKSwgIm4iLCAieSIpKSAlPiUgDQogIHNlbGVjdCgtYmVuZWZpY2lhcmllcykgJT4lIA0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gZGF0ZSwgdmFsdWVzX2Zyb20gPSBkaXN0cmlidXRpb24pICU+JSANCiAgbXV0YXRlKGdhcHMgPSBwYXN0ZTAoYDIwMjEtMDEtMDFgLCBgMjAyMS0wMi0wMWAsIGAyMDIxLTAzLTAxYCwgYDIwMjEtMDQtMDFgLCBgMjAyMS0wNS0wMWAsIGAyMDIxLTA2LTAxYCwNCiAgICAgICAgICAgICAgICAgICAgICAgIGAyMDIxLTA3LTAxYCwgYDIwMjEtMDgtMDFgLCBgMjAyMS0wOS0wMWAsIGAyMDIxLTEwLTAxYCwgYDIwMjEtMTEtMDFgLCBgMjAyMS0xMi0wMWApKSAlPiUgDQogIG11dGF0ZShnYXBfbW9udGhzID0gY2FzZV93aGVuKHN0cl9kZXRlY3QoZ2FwcywgInlubm5ubm5ubm5ubnkiKSB+IDExLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGdhcHMsICJ5bm5ubm5ubm5ubnkiKSB+IDEwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGdhcHMsICJ5bm5ubm5ubm5ueSIpIH4gOSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChnYXBzLCAieW5ubm5ubm5ueSIpIH4gOCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChnYXBzLCAieW5ubm5ubm55IikgfiA3LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGdhcHMsICJ5bm5ubm5ueSIpIH4gNiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChnYXBzLCAieW5ubm5ueSIpIH4gNSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChnYXBzLCAieW5ubm55IikgfiA0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGdhcHMsICJ5bm5ueSIpIH4gMywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChnYXBzLCAieW5ueSIpIH4gMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChnYXBzLCAieW55IikgfiAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gMCkpIA0KDQojIyBjb21tZW50ZWQgb3V0LCBidXQgdGhpcyB3YXMganVzdCB0byBnZXQgdGhlIG51bWJlciBvZiB0b3duc2hpcHMgd2l0aCBnYXBzIHBlciBzdGF0ZQ0KIyBnYXBfbW9udGhzICU+JSANCiMgICBmaWx0ZXIocmVjdXJyZW5jZXMgPiAxKSAlPiUgDQojICAgZ3JvdXBfYnkoc3RhdGUsIHRvd25zaGlwKSAlPiUgDQojICAgc3VtbWFyaXNlKGF2Z19nYXAgPSBtZWFuKGdhcF9tb250aHMpLCANCiMgICAgICAgICAgICAgYmVuZWZpY2lhcmllcyA9IHN1bShiZW5fbWF4KSkgJT4lIA0KIyAgIGFycmFuZ2UoZGVzYyhhdmdfZ2FwKSkgJT4lDQojICAgZmlsdGVyKGF2Z19nYXAgPiAwKSAlPiUgDQojICAgZ3JvdXBfYnkoc3RhdGUpICU+JQ0KIyAgIHN1bW1hcmlzZSh0b3duc2hpcHMgPSBuX2Rpc3RpbmN0KHRvd25zaGlwKSkNCg0KZ2FwX21vbnRocyAlPiUgDQogIGZpbHRlcihyZWN1cnJlbmNlcyA+IDEpICU+JSANCiAgZ3JvdXBfYnkoZ2FwX21vbnRocykgJT4lIA0KICBzdW1tYXJpc2UobG9jYXRpb25zID0gbl9kaXN0aW5jdChsb2NhdGlvbiksDQogICAgICAgICAgICB0b3duc2hpcHMgPSBuX2Rpc3RpbmN0KHRvd25zaGlwKSwNCiAgICAgICAgICAgIGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuX21heCkpICU+JSANCiAgbXV0YXRlKHBjX29mX2JlbiA9IHJvdW5kKGJlbmVmaWNpYXJpZXMgLyBzdW0oYmVuZWZpY2lhcmllcykgKiAxMDAsIGRpZ2l0cyA9IDIpKSAlPiUNCiAga2FibGUoY2FwdGlvbiA9ICJOdW1iZXIgb2YgYmVuZWZpY2lhcmllcyBhbmQgbG9jYXRpb25zIGJ5IGR1cmF0aW9uIG9mIGdhcHMgaW4gaW1wbGVtZW50YXRpb24iLCBmb3JtYXQuYXJncyA9IGxpc3QoYmlnLm1hcmsgPSAiLCIpKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMigic3RyaXBlZCIpICU+JSAgDQogIGZvb3Rub3RlKCJPbmx5IGJlbmVmaWNpYXJpZXMgb2YgbW9udGhseSBhY3Rpdml0aWVzIHRoYXQgcmVjdXJyZWQgYXQgbGVhc3Qgb25jZSBhcmUgaW5jbHVkZWQiLA0KICAgICAgICAgICBnZW5lcmFsX3RpdGxlID0gIiIpDQogICMgcGFuZGVyKGNhcHRpb24gPSAiTnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMgYW5kIGxvY2F0aW9ucyBieSBkdXJhdGlvbiBvZiBnYXBzIGluIGltcGxlbWVudGF0aW9uIikNCg0KIyByZW1pbmRlciB0byBjaGVjayB0aGUgcGFyYWdyYXBoIGJlbG93IHdoZW4geW91IHJlcnVuIHRoZSByZXBvcnQNCg0KYGBgDQogDQogPGJyPg0KIA0KYHIgcm91bmQoZmlsdGVyKGdhcF9tb250aHMsIHJlY3VycmVuY2VzID4gMSAmIGdhcF9tb250aHMgPiAwICkgJT4lIHtzdW0oLiRiZW5fbWF4KX0gLyBmaWx0ZXIoZ2FwX21vbnRocywgcmVjdXJyZW5jZXMgPiAxKSAlPiUge3N1bSguJGJlbl9tYXgpfSAqIDEwMCwgZGlnaXRzID0gMSlgJSBvZiBiZW5lZmljaWFyaWVzIG9mIG1vbnRobHkgYWN0aXZpdGllcyBleHBlcmllbmNlZCBnYXBzIG9yIGRlbGF5cyBpbiBtb250aGx5IHByb2dyYW1taW5nLCB3aXRoIHRoZSBtb3N0IGNvbW1vbiBkZWxheSBiZWluZyAzIG1vbnRocy4gVGhlIDgtbW9udGggZGVsYXkgd2FzIHRoZSBwcm92aXNpb24gb2YgbW9udGhseSBmb29kIGJhc2tldHMgaW4gQnV0aGlkYXVuZywgd2hlcmUgZGlzdHJpYnV0aW9ucyBvbmx5IG9jY3VycmVkIGluIEZlYnJ1YXJ5IGFuZCBOb3ZlbWJlciAyMDIxLiBUaGUgNS1tb250aCBkZWxheXMgd2VyZSBhbGwgZnJvbSBsb2NhdGlvbnMgaW4gUmFraGluZSBhbmQgS2FjaGluLiBPdmVyYWxsLCBnYXBzIGluIG1vbnRobHkgcHJvZ3JhbW1pbmcgd2VyZSBleHBlcmllbmNlZCBpbiAzOSB0b3duc2hpcHMsIHdpdGggdGhlIG1ham9yaXR5IG9yaWdpbmF0aW5nIGZyb20gS2FjaGluLCBBeWV5YXJ3YWR5IGFuZCBSYWtoaW5lLg0KDQpHZXR0aW5nIGFwcHJvdmFscyBmb3IgaW50ZXJ2ZW50aW9ucyBhbmQgdHJhdmVsIGF1dGhvcmlzYXRpb25zIGhhdmUgc2lnbmlmaWNhbnRseSBpbXBlZGVkIHRoZSBwcm92aXNpb24gb2YgYXNzaXN0YW5jZSB0byB2dWxuZXJhYmxlIHBlcnNvbnMgaW4gTXlhbm1hci4gDQoNClRoZXJlIGFyZSBgciBmaWx0ZXIoZ2FwX21vbnRocywgcmVjdXJyZW5jZXMgPT0gMSkgJT4lIG5yb3coKWAgZW50cmllcyBjb2RlZCBhcyBiZWluZyBpbXBsZW1lbnRlZCBvbiBhIG1vbnRobHkgYmFzaXMgdGhhdCBoYXZlIG5vdCByZWN1cnJlZCAtLSB0aGF0IGlzLCB0aGV5IGhhdmUgb25seSBiZWVuIGltcGxlbWVudGVkIG9uY2UgYWNjb3JkaW5nIHRvIHdoYXQgaGFzIGJlZW4gcmVwb3J0ZWQgaW4gdGhlIDVXcy4gVGhlIEZTQyBuZWVkcyB0byBjaGVjayB3aXRoIHBhcnRuZXJzIGlmIHRoZXNlIGFyZSBtZXJlbHkgdGhlIGZpcnN0IGluc3RhbmNlcyBvZiB0aGVzZSBhY3Rpdml0aWVzLCBvciBpZiB0aGVyZSBoYXZlIGJlZW4gaXNzdWVzIHdpdGggYWNjZXNzLCBzZWN1cml0eSBvciBmdW5kaW5nIG9yIGlmIHRoZXkgYXJlIGVycm9ycyBpbiBkYXRhIGVudHJ5IC4NCg0KPGJyPjxicj4NCg0KIyMjIDQuNSBQb3RlbnRpYWwgZm9yIHBvc3QtZGlzdHJpYnV0aW9uIG1vbml0b3JpbmcNCg0KVGhlIHRhYmxlIGJlbG93IHNob3dzIGFjdGl2aXRpZXMgd2hpY2ggaGF2ZSBiZWVuIGltcGxlbWVudGVkIGZvciA2IG1vbnRocyBvciBtb3JlLCB0aGUgbnVtYmVyIG9mIGxvY2F0aW9ucyB0aGV5IHdlcmUgaW1wbGVtZW50ZWQgaW4gYW5kIHRoZSBudW1iZXIgb2YgdW5pcXVlIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCBieSBhY3Rpdml0aWVzIG1lZXRpbmcgdGhlc2UgY3JpdGVyaWEuIFRoZSBwb3NzaWJpbGl0eSBvZiBqb2ludCBtb25pdG9yaW5nIC0tIG9yIGF0IGxlYXN0IHRoZSBqb2ludCByZXZpZXcgYW5kIGFuYWx5c2lzIG9mIG1vbml0b3JpbmcgZGF0YSAtLSBzaG91bGQgYmUgZXhwbG9yZWQsIGluIGNvbnN1bHRhdGlvbiB3aXRoIHRoZXNlIHBhcnRuZXJzLiBUaGUgcmF0aW9uYWxlIGJlaW5nIHRoYXQgNiBtb250aHMgb2YgaW1wbGVtZW50YXRpb24gc2hvdWxkIGJlIGEgbG9uZyBlbm91Z2ggcGVyaW9kIG9mIHRpbWUgdG8gbWFrZSBpbXBhY3QgbW9uaXRvcmluZyBmZWFzaWJsZS4gQWRkaXRpb25hbGx5LCBqb2ludCBtb25pdG9yaW5nIHdpbGwgYmUgZnVydGhlciBmYWNpbGl0YXRlZCBieSB0aGUgc2ltaWxhcml0eSBvZiB0aGVzZSBhY3Rpdml0aWVzLCBhbG1vc3QgYWxsIG9mIHdoaWNoIGFyZSByZWN1cnJlbnQgY2FzaCB0cmFuc2ZlcnMgb3IgZGlzdHJpYnV0aW9ucyBvZiBmb29kIGJhc2tldHMuDQoNCmBgYHtyIHRhYmxlLW1vbnRobHktYWN0aXZpdGllcy02LTktbW9udGhzLCB3YXJuaW5nPUZBTFNFfQ0KDQpnYXBfbW9udGhzICU+JSAgDQogIGZpbHRlcihyZWN1cnJlbmNlcyA+IDUpICU+JSANCiAgZ3JvdXBfYnkoYWN0aXZpdHkpICU+JSANCiAgc3VtbWFyaXNlKHBhcnRuZXJzID0gbl9kaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lcnMpLA0KICAgICAgICAgICAgbG9jYXRpb25zID0gbigpLA0KICAgICAgICAgICAgYmVuZWZpY2lhcmllcyA9IHN1bShiZW5fbWF4KSkgJT4lIA0KICBhcnJhbmdlKGRlc2MoYmVuZWZpY2lhcmllcykpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJOdW1iZXIgb2YgYmVuZWZpY2lhcmllcywgYnkgYWN0aXZpdHksIHdobyBoYXZlIHJlY2VpdmVkIGF0IGxlYXN0IDYgbW9udGhzIG9mIHJlY3VycmVudCBmb29kIHNlY3VyaXR5IHN1cHBvcnQiLA0KICAgICAgICBmb3JtYXQuYXJncyA9IGxpc3QoYmlnLm1hcmsgPSAiLCIpKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMigpICU+JSAgDQogIGZvb3Rub3RlKCJPbmx5IGluY2x1ZGVzIGJlbmVmaWNpYXJpZXMgKG5vdCB1bmlxdWUgYnV0IG1heGltdW0gYnkgbG9jYXRpb24gYnkgYWN0aXZpdHkpIHdobyBoYXZlIHJlY2VpdmVkIG1vcmUgdGhhbiA2IG1vbnRocyBvZiBzdXBwb3J0IiwNCiAgICAgICAgICAgZ2VuZXJhbF90aXRsZSA9ICIiKQ0KICAjIHBhbmRlcihjYXB0aW9uID0gIk51bWJlciBvZiBiZW5lZmljaWFyaWVzLCBieSBhY3Rpdml0eSwgd2hvIGhhdmUgcmVjZWl2ZWQgYXQgbGVhc3QgNiBtb250aHMgb2YgcmVjdXJyZW50IGZvb2Qgc2VjdXJpdHkgc3VwcG9ydCIpDQoNCmBgYA0KDQo8YnI+DQoNClRoZXNlIGFyZSB0aGUgcGFydG5lcnMgd2hvIGhhdmUgaW1wbGVtZW50ZWQgbW9udGhseSBmb29kIGJhc2tldHMgYW5kIG1vbnRobHkgY2FzaC1iYXNlZCB0cmFuc2ZlcnMgZm9yIG1vcmUgdGhhbiA2IG1vbnRoczoNCg0KYGBge3IgdGFibGUtcGFydG5lcnMtNi1tb250aHN9DQpnYXBfbW9udGhzICU+JSAgDQogIGZpbHRlcihyZWN1cnJlbmNlcyA+IDUpICU+JSANCiAgZ3JvdXBfYnkoYWN0aXZpdHksIGltcGxlbWVudGluZ19wYXJ0bmVycykgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5fbWF4KSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lICANCiAgZmlsdGVyKGFjdGl2aXR5ID09ICJQcm92aWRlIG1vbnRobHkgZm9vZCBiYXNrZXRzIiB8IGFjdGl2aXR5ID09ICJQcm92aWRlIG1vbnRobHkgY2FzaC1iYXNlZCB0cmFuc2ZlcnMiKSAlPiUgDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBhY3Rpdml0eSwgdmFsdWVzX2Zyb20gPSBiZW5lZmljaWFyaWVzKSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiUGFydG5lcnMgd2hvIGhhdmUgaW1wbGVtZW50ZWQgY2FzaCB0cmFuc2ZlcnMgYW5kIGZvb2QgYmFza2V0cyBmb3IgYXQgbGVhc3QgNiBtb250aHMiLCANCiAgICAgICAgZm9ybWF0LmFyZ3MgPSBsaXN0KGJpZy5tYXJrID0gIiwiKSkgJT4lIA0KICBrYWJsZV9jbGFzc2ljXzIoInN0cmlwZWQiKSAlPiUgIA0KICBmb290bm90ZSgiT25seSBpbmNsdWRlcyBiZW5lZmljaWFyaWVzIChub3QgdW5pcXVlIGJ1dCBtYXhpbXVtIGJ5IGxvY2F0aW9uIGJ5IGFjdGl2aXR5KSB3aG8gaGF2ZSByZWNlaXZlZCBtb3JlIHRoYW4gNiBtb250aHMgb2Ygc3VwcG9ydCIsDQogICAgICAgICAgIGdlbmVyYWxfdGl0bGUgPSAiIikNCiMgcGFuZGVyKGNhcHRpb24gPSAiUGFydG5lcnMgd2hvIGhhdmUgaW1wbGVtZW50ZWQgY2FzaCB0cmFuc2ZlcnMgYW5kIGZvb2QgYmFza2V0cyBmb3IgYXQgbGVhc3QgNiBtb250aHMiKQ0KYGBgDQoNCg0KDQo8YnI+PGJyPjxicj4NCg0KIyMgNS4gQ29vcmRpbmF0aW9uIGNoYWxsZW5nZXMgYW5kIGxvY2FsaXNhdGlvbiANCg0KIyMjIDUuMSBDb29yZGluYXRpb24gY2hhbGxlbmdlcw0KDQpUaGUgRlNDIGNvb3JkaW5hdGlvbiBhcmNoaXRlY3R1cmUsIGFsb25nIHdpdGggdGhvc2Ugb2YgdGhlIG90aGVyIGNsdXN0ZXJzLCBoYXMgYmVlbiBkZXNpZ25lZCB0byBzdXBwb3J0IHRoZSBkZXBsb3ltZW50IG9mIGh1bWFuaXRhcmlhbiBhc3Npc3RhbmNlIGluIGEgbGltaXRlZCBudW1iZXIgb2Ygc3RhdGVzIGFuZCByZWdpb25zLiBUaHJvdWdob3V0IDIwMjEsIGluIHNwaXRlIG9mIHRoZSBleHBhbnNpb24gb2YgY29uZmxpY3QgYWZ0ZXIgdGhlIGNvdXAsIGh1bWFuaXRhcmlhbiBhY3Rpb24gcmVtYWluZWQgbGFyZ2VseSBsaW1pdGVkIHRvIGh1YnMgY2VudHJlZCBhcm91bmQgUmFraGluZSAoQ2VudHJhbCBhbmQgbm9ydGhlcm4gUmFraGluZSksIEthY2hpbiBhbmQgbm9ydGhlcm4gU2hhbiwgd2hpbHN0IGh1bWFuaXRhcmlhbiBuZWVkcyBlbWVyZ2VkIGluIGNlbnRyYWwsIG5vcnRoLXdlc3Rlcm4gYW5kIHNvdXRoLWVhc3Rlcm4gTXlhbm1hci4gDQoNClRoZSBjdXJyZW50IHN1Yi1uYXRpb25hbCBjb29yZGluYXRpb24gYXJjaGl0ZWN0dXJlIGlzIGFuIGltcGVkaW1lbnQgdG8gdGhlIGRlcGxveW1lbnQgb2YgaHVtYW5pdGFyaWFuIGFzc2lzdGFuY2UgaW4gYXJlYXMgbmV3bHkgYWZmZWN0ZWQgYnkgY29uZmxpY3QuIENvb3JkaW5hdGlvbiBpbiB0aGVzZSBhcmVhcyBpcyBuZWNlc3NhcnkgdG8gY2xvc2VseSBtb25pdG9yIHRoZSBkZXRlcmlvcmF0aW9uIG9mIHRoZSBodW1hbml0YXJpYW4gc2l0dWF0aW9uIGFuZCBjb29yZGluYXRlIGFwcHJvcHJpYXRlIHJlc3BvbnNlcyB3aXRoIHNob3J0IG5vdGljZS4gQ29vcmRpbmF0aW9uIGluIHRoZXNlIGFyZWFzIG5ld2x5IGFmZmVjdGVkIGJ5IGNvbmZsaWN0IGlzIGFsc28gbmVjZXNzYXJ5IHRvIGlkZW50aWZ5IG5ldyBwYXJ0bmVyc2hpcHMsIGVzcGVjaWFsbHkgd2l0aCBOTkdPcyBhbmQgQ1NPcy4gDQoNCjxicj48YnI+DQoNCiMjIyA1LjIgTG9jYWxpc2F0aW9uDQoNClRoZSBsYWNrIG9mIG93bmVyc2hpcCBvZiBjb29yZGluYXRpb24gc3RydWN0dXJlcyBhbmQgcHJvY2Vzc2VzIGJ5IE5OR09zIGFuZCBDU09zIGlzIGEgc2VyaW91cyBjaGFsbGVuZ2UgYXQgdGhlIG5hdGlvbmFsIGxldmVsLiBNYW55IGxvY2FsIHBhcnRuZXJzIHByZWZlciB0byBjb29yZGluYXRlIG9ubHkgYXQgdGhlIHN1Yi1uYXRpb25hbCBsZXZlbC4gVGhlIHR3byBtYWluIGxpbWl0YXRpb25zIGFyZToNCg0KKiBFbmdsaXNoIGlzIHRoZSBtYWluIGxhbmd1YWdlIGR1cmluZyBGU0MgbmF0aW9uYWwgbWVldGluZ3MgDQoqIExvY2FsIHBhcnRuZXJzIHRlbmQgdG8gcHJlZmVyIG1haW50YWluaW5nIGEgbG93IHByb2ZpbGUNCg0KSXQgaXMgaW1wb3J0YW50IGZvciB0aGUgRlNDIHRvIGJldHRlciBpbnRlZ3JhdGUgbG9jYWwgcGFydG5lcnMgaW50byBpdHMgY29vcmRpbmF0aW9uIG1lY2hhbmlzbXMgYW5kIHN0cnVjdHVyZXMgYXMgdGhleSBhcmUgdGhlIGxhc3QtbWlsZSBzZXJ2aWNlIHByb3ZpZGVycyBpbiB0aGlzIGh1bWFuaXRhcmlhbiByZXNwb25zZS4gDQoNCkRlc3BpdGUgdGhlIEZTQyBwcm92aWRpbmcgYW4gaW50ZXJlcHJldGVyIGluIGl0cyBuYXRpb25hbCBjb29yZGluYXRpb24gbWVldGluZ3MsIHRoZSBwYXJ0aWNpcGF0aW9uIG9mIG5hdGlvbmFsIHBhcnRuZXJzIHJlbWFpbnMgbGltaXRlZC4gVGhlIEZTQyB3aWxsIGNvbnNpZGVyIHRoZSB0cmFuc2xhdGlvbiBvZiBrZXkgZG9jdW1lbnRzIGludG8gTXlhbm1hciBhbmQgb3RoZXIgbG9jYWwgbGFuZ3VhZ2VzLiANCg0KVGhlIEZTQyBpcyBhbHNvIGV4cGxvcmluZyB0aGUgYXBwb2ludG1lbnQgb2YgYSBuYXRpb25hbCBwYXJ0bmVyLCBhdCBuYXRpb25hbCBsZXZlbCwgd2hvIHdpbGwgYmUgdGhlIGZvY2FsIHBvaW50IGZvciBOTkdPcyBhbmQgQ1NPcy4gVGhpcyB3aWxsIGFsbG93IGZvciBtb3JlIGRpcmVjdCBjb21tdW5pY2F0aW9uIHdpdGggbG9jYWwgcGFydG5lcnMgdG86IA0KDQoqIGJldHRlciBtb25pdG9yIHRoZSBzaXR1YXRpb24gb24gdGhlIGdyb3VuZA0KKiBidWlsZCBsb2NhbCBwYXJ0bmVycycgb3duZXJzaGlwIG9mIG5hdGlvbmFsIEZTQyBjb29yZGluYXRpb24gcHJvY2Vzc2VzIGFuZCBzdHJ1Y3R1cmVzDQoNCjxicj48YnI+PGJyPg0KDQoNCiMjIDYuIFBlcnNwZWN0aXZlIGZvciAyMDIyDQoNCiMjIyA2LjEgUG9zaXRpb25pbmcgZm9yIDIwMjINCg0KVGhlIFBJTiBmb3IgMjAyMiBpcyBtdWNoIG1vcmUgZXZlbmx5IHNwcmVhZCBhY3Jvc3MgdGhlIGNvdW50cnkgdGhhbiBpdCB3YXMgaW4gMjAyMTogd2l0aCByZWZlcmVuY2UgdG8gdGhlIHBsb3QgYmVsb3csIE1hZ3dheSBhbmQgTWFuZGFsYXkgaGF2ZSBzb21lIG9mIHRoZSBsb3dlc3QgcHJvcG9ydGlvbnMgb2YgdnVsbmVyYWJsZSBwZXJzb25zIGluIHJlbGF0aW9uIHRvIHRoZSB0b3RhbCBzdGF0ZSBwb3B1bGF0aW9uLCBtZWFuaW5nIHRoYXQgY2FyZWZ1bCBiZW5lZmljaWFyeSBzZWxlY3Rpb24sIHRpZ2h0IHZ1bG5lcmFiaWxpdHkgY3JpdGVyaWEgYW5kIHRoZSBhbmFseXNpcyBvZiBmb29kIHNlY3VyaXR5IHN0YXR1cyB3aWxsIG5lY2Vzc2FyeSB0byBhdm9pZCBleGNlc3NpdmUgaW5jbHVzaW9uIGVycm9ycy4NCg0KSG93ZXZlciwgdGhlIFBJTiBhbmQgc2V2ZXJpdHkgc3RhdHVzIGhhcyBiZWVuIGVzdGltYXRlZCBiYXNlZCBvbiBkYXRhIGNvbGxlY3RlZCBpbiBBdWd1c3QgYW5kIFNlcHRlbWJlciB0aHJvdWdoIGEgV0ZQL0ZBTyBhc3Nlc3NtZW50LiBBcyB0aGUgc2l0dWF0aW9uIGluIHRoZSBmaWVsZCByZW1haW5zIHZvbGF0aWxlLCBpdCBpcyBuZWNlc3NhcnkgZm9yIEZTQyBwYXJ0bmVycyB0byBjb2xsZWN0IGV2aWRlbmNlIG9mIGFueSBjaGFuZ2VzIHRoYXQgbWF5IGFmZmVjdCB0aGUgZm9vZCBzZWN1cml0eSBvZiBhZmZlY3RlZCBwZXJzb25zLiANCg0KPGJyPg0KDQpgYGB7ciBiYXJwbG90LXBpbi12dWwtc3RhdGV9DQpwaW4gJT4lIA0KICBncm91cF9ieShzdGF0ZSkgJT4lIA0KICBmaWx0ZXIoc3RhdGUgIT0gIk5heSBQeWkgVGF3IikgJT4lIA0KICBzdW1tYXJpc2UocGluXzIwMjIgPSByb3VuZChzdW0ocGluXzIwMjIpKSwNCiAgICAgICAgICAgIHRvdGFsX3BvcCA9IHN1bSh0b3RhbF9wb3ApKSAlPiUgDQogIG11dGF0ZShgJV9vZl9wb3BfaW5fUElOYCA9IHJvdW5kKHBpbl8yMDIyIC8gdG90YWxfcG9wICogMTAwLCBkaWdpdHMgPSAyKSwNCiAgICAgICAgIHN0YXRlID0gcmVvcmRlcihzdGF0ZSwgLWAlX29mX3BvcF9pbl9QSU5gKSkgICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gc3RhdGUsIHkgPSBwaW5fMjAyMiwgZmlsbCA9IGAlX29mX3BvcF9pbl9QSU5gKSkgKw0KICBnZW9tX2NvbCgpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGAlX29mX3BvcF9pbl9QSU5gKSwgc2l6ZSA9IDIuNSwgdmp1c3QgPSAtMC41KSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNzAsIHZqdXN0ID0gMC41LCBoanVzdCA9IDAuNikpICsNCiAgbGFicyh4ID0gIiIsDQogICAgICAgeSA9ICJOdW1iZXIgb2YgcGVvcGxlIGluIG5lZWQiLCANCiAgICAgICBmaWxsID0gIiUgb2YgcG9wIFxuIGluIFBJTiIsDQogICAgICAgdGl0bGUgPSAiMjAyMiBQSU4gYW5kIGluY2lkZW5jZSBvZiBmb29kIGluc2VjdXJpdHkgYW5kIGRpc3BsYWNlbWVudCBieSBzdGF0ZSBhbmQgcmVnaW9uIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJUaGUgMjAyMiBmb29kIHNlY3VyaXR5IFBJTiBpcyB0aGUgbnVtYmVyIG9mIHBlcnNvbnMgd2hvIGFyZSBmb29kIGluc2VjdXJlIG9yIGFyZSBJRFBzIikgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDI0MDAwMDAsIGJ5ID0gMjAwMDAwKSwgbGFiZWxzID0gY29tbWEpICsNCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKHRyYW5zID0gInJldmVyc2UiKQ0KYGBgDQoNCjxicj4NCg0KYGBge3IgdmVjdG9yLWFuZC1kZi1mb3ItcGluLXN0YWNrZWR9DQpzcl9waW5fb3JkIDwtIGMoIkNoaW4iLCAiS2F5YWgiLCAiUmFraGluZSIsICJTaGFuIChTb3V0aCkiLCAiU2hhbiAoTm9ydGgpIiwgIlNoYW4gKEVhc3QpIiwgIktheWluIiwgIkF5ZXlhcndhZHkiLCAiS2FjaGluIiwgIlRhbmludGhhcnlpIiwNCiAgICAgICAgICAgICAgICAiTW9uIiwgIkJhZ28gKEVhc3QpIiwgIkJhZ28gKFdlc3QpIiwgIllhbmdvbiIsICJNYWd3YXkiLCAiU2FnYWluZyIsICJNYW5kYWxheSIpDQoNCnNyX3Bpbl9iYXIgPC0gcGluICU+JSANCiAgZmlsdGVyKHN0YXRlICE9ICJOYXkgUHlpIFRhdyIpICU+JQ0KICBncm91cF9ieShzdGF0ZSkgJT4lIA0KICBzdW1tYXJpc2UocGluXzIwMjIgPSByb3VuZChzdW0ocGluXzIwMjIpKSwNCiAgICAgICAgICAgIHRhcmdldF8yMDIyID0gcm91bmQoc3VtKHRhcmdldF9uZXcpKSkgJT4lIA0KICBtdXRhdGUobm9uX3RhcmdldCA9IHBpbl8yMDIyIC0gdGFyZ2V0XzIwMjIsIA0KICAgICAgICAgc3RhdGUgPSBmY3RfcmVsZXZlbChzdGF0ZSxzcl9waW5fb3JkKSkgJT4lDQogIHBpdm90X2xvbmdlcihjb2xzID0gYyh0YXJnZXRfMjAyMiwgbm9uX3RhcmdldCksIG5hbWVzX3RvID0gImlzX3RhcmdldCIsIHZhbHVlc190byA9ICJwaW4iKSAlPiUgDQogIG11dGF0ZShwY19vZl9waW4gPSByb3VuZChwaW4gLyBwaW5fMjAyMiAqIDEwMCwgZGlnaXRzID0gMikpIA0KDQpgYGANCg0KDQpUaGUgYXZlcmFnZSBwZXJjZW50YWdlIG9mIGEgc3RhdGUncyBQSU4gdGhhdCBpcyBpbmNsdWRlZCBpbiB0aGUgdGFyZ2V0IGlzIGByIHJvdW5kKHNyX3Bpbl9iYXIgJT4lIHN1bW1hcmlzZShtZWFuID0gbWVhbihwY19vZl9waW5baXNfdGFyZ2V0ID09ICJ0YXJnZXRfMjAyMiJdKSksIGRpZ2l0cyA9IDIpICU+JSBwdWxsKClgJS4gVGhvdWdoIHRoZXJlIGFyZSBzb21lIHZlcnkgbm90YWJsZSBleGNlcHRpb25zIGF0IGJvdGggdGhlIHN1cGVyaW9yIGFuZCBpbmZlcmlvciBlbmRzIG9mIHRoZSBzY2FsZToNCg0KPGJyPiANCg0KYGBge3Igc3RhY2tlZC1iYXJwbG90LXBpbi10YXJnZXR9DQpzcl9waW5fYmFyICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gc3RhdGUsIHkgPSBwaW4sIGZpbGwgPSBpc190YXJnZXQpKSArDQogIGdlb21fY29sKCkgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcGNfb2ZfcGluKSwgc2l6ZSA9IDIsIHZqdXN0ID0gMS4yLCBjb2xvdXIgPSAid2hpdGUiKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNzAsIHZqdXN0ID0gMC41LCBoanVzdCA9IDAuNiksIA0KICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNSkpICsNCiAgbGFicyh4ID0gIiIsDQogICAgICAgeSA9ICJOdW1iZXIgb2YgcGVvcGxlIGluIG5lZWQiLCANCiAgICAgICBmaWxsID0gIiIsDQogICAgICAgdGl0bGUgPSAiMjAyMiB0YXJnZXQgYXMgcGFydCBvZiBQSU4gYnkgc3RhdGUgYW5kIHJlZ2lvbiIsDQogICAgICAgc3VidGl0bGUgPSAiRmlndXJlcyBpbiBlYWNoIGJhciBzaG93IHRoZSBwZXJjZW50YWdlIG9mIFBJTiBpbiBhbmQgb3V0IG9mIHRoZSAyMDIyIHRhcmdldHMiKSArDQogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMjQwMDAwMCwgYnkgPSAyMDAwMDApLCBsYWJlbHMgPSBjb21tYSkNCg0KICAgICAgICAgIA0KYGBgDQoNCjxicj4gDQoNCmBgYHtyIGhhcy1wYXJ0bmVyLWRhdGFzZXR9DQpoYXNfcGFydG5lciA8LSBwaW4gJT4lIHNlbGVjdChzdGF0ZSwgYWRtaW4zX3Bjb2RlLCB0b3duc2hpcCwgcGluX25ldywgdGFyZ2V0XzIwMjIpICU+JSANCiAgbGVmdF9qb2luKGJlbiAlPiUgIA0KICAgICAgICAgICAgICBncm91cF9ieShhZG1pbjNfcGNvZGUpICU+JSANCiAgICAgICAgICAgICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcyksIA0KICAgICAgICAgICAgICAgICAgICAgICAgcGFydG5lcnMgPSBuX2Rpc3RpbmN0KGltcGxlbWVudGluZ19wYXJ0bmVycykpLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIHJlcGxhY2UoaXMubmEoLiksIDApICU+JSANCiAgbXV0YXRlKGhhc19wYXJ0bmVyID0gaWZlbHNlKHBhcnRuZXJzID09IDAsIEZBTFNFLCBUUlVFKSkgJT4lIA0KICBncm91cF9ieShoYXNfcGFydG5lcikgJT4lIA0KICBzdW1tYXJpc2UocGluXzIwMjIgPSBzdW0ocGluX25ldyksDQogICAgICAgICAgICB0YXJnZXRfMjAyMiA9IHN1bSh0YXJnZXRfMjAyMiksDQogICAgICAgICAgICB0b3duc2hpcHMgPSBuKCkpICU+JSANCiAgYWRvcm5fcGVyY2VudGFnZXMoImNvbCIpICU+JSANCiAgbXV0YXRlKHBpbl8yMDIyID0gcm91bmQocGluXzIwMjIgKiAxMDAsIGRpZ2l0cyA9IDIpLA0KICAgICAgICAgdGFyZ2V0XzIwMjIgPSByb3VuZCh0YXJnZXRfMjAyMiAqIDEwMCwgZGlnaXRzID0gMiksDQogICAgICAgICB0b3duc2hpcHMgPSByb3VuZCh0b3duc2hpcHMgKiAxMDAsIGRpZ2l0cyA9IDIpKSANCg0KYGBgDQoNCkZvb2QgU2VjdXJpdHkgQ2x1c3RlciBwYXJ0bmVycyBhcmUgbm90IHdlbGwtcG9zaXRpb25lZCB0byBjb3ZlciB0aGUgMjAyMiBwb3B1bGF0aW9uIGluIG5lZWQgYW5kIHRhcmdldHMuIFBhcnRuZXJzIGFyZSBsYXJnZWx5IGNvbmNlbnRyYXRlZCBpbiBLYWNoaW4sIFJha2hpbmUgYW5kIFlhbmdvbiwgd2l0aCBvbmx5IG9uZSBwYXJ0bmVyIHByZXNlbnQgaW4gU2hhbiAoRWFzdCkgYW5kIHR3byBpbiBUYW5pbnRoYXJ5aS4NCg0KT3ZlcmFsbCwgYHIgcm91bmQoaGFzX3BhcnRuZXIgJT4lIGZpbHRlcihoYXNfcGFydG5lciA9PSBGQUxTRSkgJT4lIHB1bGwodG93bnNoaXBzKSlgJSBvZiB0b3duc2hpcHMsIGNvbnRhaW5pbmcgYHIgcm91bmQoaGFzX3BhcnRuZXIgJT4lIGZpbHRlcihoYXNfcGFydG5lciA9PSBGQUxTRSkgJT4lIHB1bGwodGFyZ2V0XzIwMjIpKWAlIG9mIHRoZSAyMDIyIHRhcmdldCwgZG8gbm90IGhhdmUgYW55IHBhcnRuZXJzIHByZXNlbnQuIFRoaXMgbGFjayBvZiBuYXRpb253aWRlIGNvdmVyYWdlIHdpbGwgYmUgb25lIG9mIHRoZSBtb3N0IGltcG9ydGFudCBjb25zdHJhaW50cyB0aGF0IHRoZSBGU0Mgd2lsbCBmYWNlIGluIG1lZXRpbmcgdGhlIDIwMjIgbmVlZHMgb2YgdnVsbmVyYWJsZSwgZm9vZCBpbnNlY3VyZSBwZXJzb25zLCBpbmNsdWRpbmcgSURQcy4gUmVzb2x2aW5nIHRoaXMgd2lsbCBuZWNlc3NpdGF0ZSBib3RoIGluY3JlYXNpbmcgcGFydG5lciBjb3ZlcmFnZSwgZmluZGluZyBuZXcgcGFydG5lcnMgZm9yIHRoZSBjbHVzdGVyIGFzIHdlbGwgYXMgc2VjdXJpbmcgc3VmZmljaWVudCBmdW5kaW5nLiANCg0KYGBge3IgbWFwLXBhcnRuZXJzLXBpbi10b3duc2hpcCwgZmlnLmhlaWdodD0xMH0NCiMgcGxheSB3aXRoIGdlb21fbGluZSBmb3IgdGhlIGludGVyYWN0aXZlIHJlZmVyZW5jZSBtYXAgLS0gbWF5YmUgeW91IGNhbiBnZXQgdGhlIG91dGxpbmVzIHRvIGJlIGluIGRpZmZlcmVudCBjb2xvdXJzDQoNCmJlbiAlPiUgDQogIGdyb3VwX2J5KGFkbWluM19wY29kZSkgJT4lIA0KICBzdW1tYXJpc2UocGFydG5lcnMgPSBuX2Rpc3RpbmN0KGltcGxlbWVudGluZ19wYXJ0bmVycykpICU+JSANCiAgcmlnaHRfam9pbihwY29kZTNfc2hhcGUsIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgc3RfYXNfc2YoKSAlPiUgDQogIGdncGxvdCgpICsNCiAgZ2VvbV9zZihhZXMoZmlsbCA9IHBhcnRuZXJzKSwgc2l6ZSA9IDAuMSkgKw0KICAjIHNjYWxlX2ZpbGxfZ3JhZGllbnQodHJhbnMgPSAicmV2ZXJzZSIsIGJyZWFrcyA9IGMoMSwgMywgNSwgNywgOSwxMSkpICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzX2Mob3B0aW9uID0gIm1ha28iLCBkaXJlY3Rpb24gPSAtMSwgYnJlYWtzID0gYygxLCAzLCA1LCA3LCA5LCAxMSkpICsNCiAgdGhlbWVfdm9pZCgpICsgDQogIHRoZW1lKGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksDQogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLA0KICAgICAgICBsZWdlbmQua2V5LnNpemUgPSB1bml0KDAuNywgJ2NtJykpICsNCiAgbGFicyh0aXRsZSA9ICJNYXAgb2YgbnVtYmVyIG9mIHBhcnRuZXJzIGJ5IHRvd25zaGlwIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJ0b3duc2hpcHMgaW4gZ3JleSBkbyBub3QgaGF2ZSBhbnkgcGFydG5lcnMgcHJlc2VudCIsIA0KICAgICAgIGZpbGwgPSAiUGFydG5lcnMiKSArDQogIA0KcGluICU+JSAgICANCiAgICBncm91cF9ieShhZG1pbjNfcGNvZGUpICU+JSANCiAgICBzdW1tYXJpc2UocGluXzIwMjIgPSBzdW0ocGluXzIwMjIpKSAlPiUgDQogICAgbXV0YXRlKHBpbl8yMDIyID0gcm91bmQocGluXzIwMjIsIGRpZ2l0cyA9IDApLCANCiAgICAgICAgICAgcGluXzIwMjIgPSByZWNvZGUocGluXzIwMjIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMCcgPSBOQV9yZWFsXykpICU+JQ0KICAgIHJpZ2h0X2pvaW4ocGNvZGUzX3NoYXBlLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogICAgc3RfYXNfc2YoKSAlPiUgDQogICAgZ2dwbG90KCkgKw0KICAgIGdlb21fc2YoYWVzKGZpbGwgPSBwaW5fMjAyMiksIHNpemUgPSAwLjEpICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzX2Mob3B0aW9uID0gIm1ha28iLCB0cmFucyA9ICJsb2cxMCIsIGRpcmVjdGlvbiA9IC0xKSArDQogICAgIyBzY2FsZV9maWxsX2dyYWRpZW50KHRyYW5zID0gcmV2bG9nX3RyYW5zKDEwKSwgYnJlYWtzID0gYygxMDAsIDEwMDAsIDEwMDAwLCAxMDAwMDApKSArDQogICAgdGhlbWVfdm9pZCgpICsNCiAgICB0aGVtZShsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLA0KICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLA0KICAgICAgICAgIGxlZ2VuZC5rZXkuc2l6ZSA9IHVuaXQoMC43LCAnY20nKSkgKw0KICAgIGxhYnModGl0bGUgPSAiTWFwIG9mIDIwMjIgUElOIGJ5IHRvd25zaGlwIiwNCiAgICAgICAgIHN1YnRpdGxlID0gInRvd25zaGlwcyBpbiBncmV5IGRvIG5vdCBhIFBJTiBjYWxjdWxhdGVkIiwgDQogICAgICAgICBmaWxsID0gIlBJTiIpDQoNCmBgYA0KDQoNClRoaXMgbWlzbWF0Y2ggYmV0d2VlbiBleGlzdGluZyBwYXJ0bmVyIGZvb3RwcmludHMgYW5kIHRoZSBQSU4gZm9yIDIwMjIgaGlnaGxpZ2h0cyB0aGUgbmVlZCBmb3IgbW9yZSBkZWRpY2F0ZWQgZmllbGQtbGV2ZWwgY29vcmRpbmF0aW9uLiBUaGlzIHdpbGwgYmUgbmVjZXNzYXJ5IHRvIHJlYWNoIG91dCB0byBuZXcgcGFydG5lcnMgYW5kIGVuY291cmFnZSBleGlzdGluZyBwYXJ0bmVycyB0byBleHBhbmQgdGhlaXIgb3BlcmF0aW9ucy4gU3RyZW5ndGhlbmVkIGludGVyLWNsdXN0ZXIgY29vcmRpbmF0aW9uIHdpbGwgYWxzbyBiZSBrZXkgdG8gZW5zdXJlIHRoYXQgdGhlIG5lZWRzIG9mIHBlcnNvbnMgaW4gbmVlZCBhcmUgYmVpbmcgbWV0IGluIGEgY29tcHJlaGVuc2l2ZSBtYW5uZXIuIEZvcmUgcmVmZXJlbmNlLCBwbGVhc2UgYWxzbyBmaW5kIGJlbG93IG1hcHMgY29tcGFyaW5nIHRoZSBudW1iZXIgb2YgYmVuZWZpY2lhcmllcyByZWFjaGVkIGluIDIwMjEgYW5kIEZTQyB0YXJnZXRzIGZvciAyMDIyLiANCg0KYGBge3IgbWFwLWJlbmVmaWNpYXJpZXMtdGFyZ2V0LXRvd25zaGlwLCBmaWcuaGVpZ2h0PTEwfQ0KYmVuICU+JSANCiAgZ3JvdXBfYnkoYWRtaW4zX3Bjb2RlKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIHJpZ2h0X2pvaW4ocGNvZGUzX3NoYXBlLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIHN0X2FzX3NmKCkgJT4lIA0KICBnZ3Bsb3QoKSArDQogIGdlb21fc2YoYWVzKGZpbGwgPSBiZW5lZmljaWFyaWVzKSwgc2l6ZSA9IDAuMSkgKw0KICAjIHNjYWxlX2ZpbGxfZ3JhZGllbnQodHJhbnMgPSAicmV2ZXJzZSIsIGJyZWFrcyA9IGMoMSwgMywgNSwgNywgOSwxMSkpICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzX2Mob3B0aW9uID0gIm1ha28iLCBkaXJlY3Rpb24gPSAtMSwgdHJhbnMgPSAibG9nMTAiKSArDQogIHRoZW1lX3ZvaWQoKSArIA0KICB0aGVtZShsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLA0KICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwNCiAgICAgICAgbGVnZW5kLmtleS5zaXplID0gdW5pdCgwLjcsICdjbScpKSArDQogIGxhYnModGl0bGUgPSAiTWFwIG9mIG51bWJlciBvZiAyMDIxIGJlbmVmaWNpYXJpZXMgYnkgdG93bnNoaXAiLA0KICAgICAgIHN1YnRpdGxlID0gInRvd25zaGlwcyBpbiBncmV5IGhhdmUgbm90IGJlZW4gcmVhY2hlZCIsIA0KICAgICAgIGZpbGwgPSAiQmVuZWZpY2lhcmllcyIpICsNCiAgDQpwaW4gJT4lICAgIA0KICAgIGdyb3VwX2J5KGFkbWluM19wY29kZSkgJT4lIA0KICAgIHN1bW1hcmlzZSh0YXJnZXRfMjAyMiA9IHN1bSh0YXJnZXRfMjAyMikpICU+JSANCiAgICBtdXRhdGUodGFyZ2V0XzIwMjIgPSByb3VuZCh0YXJnZXRfMjAyMiwgZGlnaXRzID0gMCksIA0KICAgICAgICAgICB0YXJnZXRfMjAyMiA9IHJlY29kZSh0YXJnZXRfMjAyMiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcwJyA9IE5BX3JlYWxfKSkgJT4lDQogICAgcmlnaHRfam9pbihwY29kZTNfc2hhcGUsIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgICBzdF9hc19zZigpICU+JSANCiAgICBnZ3Bsb3QoKSArDQogICAgZ2VvbV9zZihhZXMoZmlsbCA9IHRhcmdldF8yMDIyKSwgc2l6ZSA9IDAuMSkgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhvcHRpb24gPSAibWFrbyIsIHRyYW5zID0gImxvZzEwIiwgZGlyZWN0aW9uID0gLTEpICsNCiAgICAjIHNjYWxlX2ZpbGxfZ3JhZGllbnQodHJhbnMgPSByZXZsb2dfdHJhbnMoMTApLCBicmVha3MgPSBjKDEwMCwgMTAwMCwgMTAwMDAsIDEwMDAwMCkpICsNCiAgICB0aGVtZV92b2lkKCkgKw0KICAgIHRoZW1lKGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksDQogICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksDQogICAgICAgICAgbGVnZW5kLmtleS5zaXplID0gdW5pdCgwLjcsICdjbScpKSArDQogICAgbGFicyh0aXRsZSA9ICJNYXAgb2YgMjAyMiB0YXJnZXRzIGJ5IHRvd25zaGlwIiwNCiAgICAgICAgIHN1YnRpdGxlID0gInRvd25zaGlwcyBpbiBncmV5IGRvIG5vdCBoYXZlIGFueSB0YXJnZXRzIiwgDQogICAgICAgICBmaWxsID0gIlRhcmdldHMiKQ0KYGBgDQoNCg0KPGJyPjxicj4NCg0KIyMjIDYuMiBOZXh0IHN0ZXBzDQoNCjEuICBDb21tdW5pY2F0ZSB0byBwYXJ0bmVycyB0aGF0IFlhbmdvbiBoYXMgYmVlbiBoZWF2aWx5IHN1cHBvcnRlZCBieSBodW1hbml0YXJpYW4gYXNzaXN0YW5jZSBpbiBjb21wYXJpc29uIHRvIHRoZSByZXN0IG9mIHRoZSBjb3VudHJ5LCB3aXRoIHRoaXMgY292ZXJhZ2UgYmVpbmcgcGFydGljdWxhcmx5IGhlYXZ5IGluIEhsYWluZ3RoYXJ5YSwgU2h3ZXB5aXRoYXIsIERhZ29uIE15b3RoaXQgKFNlaWtrYW4pLCBEYWxhIGFuZCBOb3J0aCBPa2thbGFwYSB0b3duc2hpcHMuDQoNCjIuICBEZXZlbG9wLCB3aXRoIEZTQyBwYXJ0bmVycywgc3RhbmRhcmRpc2VkIHBhY2thZ2VzIGZvciB0aGUgdmFyaW91cyB0eXBlcyBvZiBmb29kIHNlY3VyaXR5IGFzc2lzdGFuY2UuIFN1cHBvcnQgdGhlIHJldmlldyBvZiBmb29kIGJhc2tldHMgZm9yIHRoZSBjb21wbGlhbmNlIHdpdGggdGhlIHN0YW5kYXJkIG9mIDIsMTAwIGtjYWwvcGVyc29uL2RheS4gDQoNCjMuIFBlcmZvcm0gYWRkaXRpb25hbCBhbmFseXNpcyB0byB1bmRlcnN0YW5kIGlmIGJlbmVmaWNpYXJpZXMgaW4gY2xvc2UgcHJveGltaXR5IHRvIGVhY2ggb3RoZXIgaGF2ZSByZWNlaXZlZCB3aWRlbHkgZGl2ZXJnZW50IHBhY2thZ2UgdmFsdWVzIG9yIG5vdC4gDQoNCjQuIElkZW50aWZ5LCB3aXRoIEZTQyBwYXJ0bmVycywgd2h5IGNhc2ggdHJhbnNmZXIgdmFsdWVzIHZhcnkgZXZlbiB0aGUgc2FtZSBhY3Rpdml0eSBpbXBsZW1lbnRlZCBieSB0aGUgc2FtZSBwYXJ0bmVyLiANCg0KNS4gUmV2aWV3IGFyZWFzIHdoaWNoIGhhdmUgb25seSByZWNlaXZlZCBzbWFsbGVyIHN1cHBsZW1lbnRhcnkgdHJhbnNmZXJzLiBUcmFuc2ZlcnMgY292ZXJpbmcgYSBsb3cgcGVyY2VudGFnZSBvZiB0aGUgTUVCIGNhbm5vdCBiZSBjb25zaWRlcmVkIHRvIGhhdmUgbWV0IGZvb2Qgc2VjdXJpdHkgbmVlZHMgdW5sZXNzIHRoZXkgd2VyZSBwcm92aWRlZCBhbG9uZyB3aXRoIHN1ZmZpY2llbnQgaW4ta2luZCBzdXBwb3J0IG9yIGluIGNvb3JkaW5hdGlvbiB3aXRoIG90aGVyIHBhcnRuZXJzIHRvIGNvdmVyIHRoZSBnYXAuICANCg0KNi4gQWR2b2NhdGUgZm9yIHRoZSBleHBhbnNpb24gb2YgcGFydG5lcnMnIGdlb2dyYXBoaWMgZm9vdHByaW50cyB0byByZWFjaCB0aGUgcmVtYWluaW5nIDE3OSB0b3duc2hpcHMgd2hpY2ggaGF2ZSB5ZXQgdG8gYmVuZWZpdCBmcm9tIGFueSBGU0MgYWN0aXZpdGllcy4gRXZlbiB0aG91Z2ggZm9vZCBzZWN1cml0eSBuZWVkcyByZW1haW4gaGlnaCBpbiAidHJhZGl0aW9uYWwiIEhSUCBhcmVhcywgZm9vZCBzZWN1cml0eSBhc3Npc3RhbmNlIGluIHRoZSAibmV3bHkiIGFmZmVjdGVkIGFyZWFzIGFyZSBhbiB1cmdlbnQgbmVlZC4gRlNDIGhhcyBzdGFydGVkIGZsYWdnaW5nIHRoaXMgc2l0dWF0aW9uIHRvIHRoZSB0aGUgRlNDIGxlYWQgYWdlbmNpZXMsIEZTQyBwYXJ0bmVycywgT0NIQSBhbmQgZG9ub3JzLiANCg0KNy4gQ29sbGVjdCA1VyBkYXRhIGZyb20gb3RoZXIgY2x1c3RlcnMgc28gdGhhdCBtdWx0aS1zZWN0b3IgY292ZXJhZ2UgbWF5IGJlIHJldmlld2VkLiBDbGVhbiBhbmQgcHJvY2VzcyBjb25mbGljdCBkYXRhIHNvIHRoYXQgaXQgbWF5IGJlIGNyb3NzLXJlZmVyZW5jZWQgd2l0aCBwYXJ0bmVycycgY292ZXJhZ2UuIFNoYXJlIHJhdyBkYXRhIHdpdGggb3RoZXIgQ2x1c3RlcnMgdG8gaW1wcm92ZSBjb29yZGluYXRpb24uIA0KDQo4LiBXb3JrIHdpdGggcGFydG5lcnMgdG8gZGV0ZXJtaW5lIHRoZWlyIGN1cnJlbnQgY2FwYWNpdGllcyB0byBzdWJtaXQgYWdlIGFuZCBzZXgtZGlzYWdncmVnYXRlZCBiZW5lZmljaWFyeSBkYXRhIGF0IGEgaG91c2Vob2xkIGxldmVsLiBEZXZlbG9wIGEgd29ya3BsYW4gdG8gZW5zdXJlIHRoYXQgdGhleSBjYW4gbWVldCByZXBvcnRpbmcgcmVxdWlyZW1lbnRzLiANCg0KOS4gU29saWNpdCBtb25pdG9yaW5nIHJlcG9ydHMgZnJvbSBwYXJ0bmVycywgZXhwbG9yZSB0aGUgcG9zc2liaWxpdHkgb2Ygam9pbnQgbW9uaXRvcmluZyBhbmQgZGV0ZXJtaW5lIHRoZSBleHRlbnQgdG8gd2hpY2ggdGhlIGZvb2Qgc2VjdXJpdHkgc3RhdHVzIChtb2RlcmF0ZWx5IGFuZCBzZXZlcmVseSBmb29kIGluc2VjdXJlKSBvZiBiZW5lZmljaWFyaWVzIGNhbiBiZSBpZGVudGlmaWVkLiANCg0KMTAuIFJldmlzZSB0aGUgNVcgdGVtcGxhdGUgLS0gaW4gY29uc3VsdGF0aW9uIHdpdGggcGFydG5lcnMgLS0gaW4gb3JkZXIgdG8gYWRkcmVzcyB0aGUgZGF0YSBjb2xsZWN0aW9uIGlzc3VlcyBpZGVudGlmaWVkLiANCg0KMTEuIERldmVsb3AgdGhlIEZTQydzIGNvb3JkaW5hdGlvbiBjYXBhY2l0aWVzIGF0IHN1Yi1uYXRpb25hbCBsZXZlbC4gDQoNCjEyLiBEZXZlbG9wIGxvY2FsIHBhcnRuZXJzJyAoTk5HT3MsIENTT3MpIG93bmVyc2hpcCBvZiBGU0MgY29vcmRpbmF0aW9uIG1lY2hhbmlzbXMgYW5kIHN0cnVjdHVyZXMgYW5kIHByb3ZpZGUga2V5IEZTQyBkb2N1bWVudHMgaW4gQnVybWVzZSBhbmQgb3RoZXIgbG9jYWwgbGFuZ3VhZ2VzLiANCg0KDQoNCjxicj48YnI+PGJyPg0KDQojIyA3LiBSZWZlcmVuY2UgdGFibGUgLS0gdG93bnNoaXBzDQoNClRoZSByZWZlcmVuY2UgdGFibGUgYmVsb3cgbWF5IGJlIHNvcnRlZCBhbmQgZmlsdGVyZWQgYnkgYW55IG9mIHRoZSBjb2x1bW5zLiANCg0KYGBge3IgZGF0YXRhYmxlLXRvd25zaGlwcy1yZWZlcmVuY2V9DQojIGFkZCBpbiB0YXJnZXQNCnBpbiAlPiUgDQogIHNlbGVjdChzdGF0ZSwgdG93bnNoaXAsIGFkbWluM19wY29kZSwgdG90YWxfcG9wLCBQSU5fMjAyMiA9IHBpbl8yMDIyLCB0YXJnZXRfMjAyMiwgSURQcyA9IGlkcHMpICU+JSANCiAgbXV0YXRlKHRvdGFsX3BvcCA9IHJvdW5kKHRvdGFsX3BvcCwgZGlnaXRzID0gMCkpICU+JSANCiAgbGVmdF9qb2luKGZzYyAlPiUNCiAgICAgICAgICAgICAgc2VsZWN0KGFjdGl2aXR5LCBwYXJ0bmVycyA9IGltcGxlbWVudGluZ19wYXJ0bmVycywgYmVuZWZpY2lhcmllcyA9IHVfYmVuLCBiZW5lZmljaWFyeV9mcmVxdWVuY2llcyA9IGJlbmVmaWNpYXJpZXMsDQogICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiwgYWRtaW4zX3Bjb2RlKSAlPiUgDQogICAgICAgICAgICAgIGdyb3VwX2J5KGFkbWluM19wY29kZSkgJT4lIA0KICAgICAgICAgICAgICBzdW1tYXJpc2UocGFydG5lcnMgPSBuX2Rpc3RpbmN0KHBhcnRuZXJzKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcywgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGJlbmVmaWNpYXJ5X2ZyZXF1ZW5jaWVzID0gc3VtKGJlbmVmaWNpYXJ5X2ZyZXF1ZW5jaWVzLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25zID0gbl9kaXN0aW5jdChsb2NhdGlvbikpLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUNCiAgcmVwbGFjZV9uYShsaXN0KHBhcnRuZXJzID0gMCwgYmVuZWZpY2lhcmllcyA9IDAsIGJlbmVmaWNpYXJ5X2ZyZXF1ZW5jaWVzID0gMCwgbG9jYXRpb25zID0gMCkpICU+JSANCiAgcmVsb2NhdGUoYWRtaW4zX3Bjb2RlLCAuYWZ0ZXIgPSBsb2NhdGlvbnMpICU+JSANCiAgYXJyYW5nZShhZG1pbjNfcGNvZGUpICU+JSANCiAgZGF0YXRhYmxlKGZpbHRlciA9IGxpc3QocG9zaXRpb24gPSAidG9wIiwgY2xlYXIgPSBGQUxTRSksIA0KICAgICAgICAgICAgb3B0aW9ucyA9IGxpc3QocGFnZUxlbmd0aCA9IDEwLCBzY3JvbGxYID0gVFJVRQ0KICAjICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICwNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdENvbXBsZXRlID0gaHRtbHdpZGdldHM6OkpTKA0KICAjICAgICAgICAiZnVuY3Rpb24oc2V0dGluZ3MsIGpzb24pIHsiLA0KICAjICAgICAgICBwYXN0ZTAoIiQodGhpcy5hcGkoKS50YWJsZSgpLmNvbnRhaW5lcigpKS5jc3Moeydmb250LXNpemUnOiAnIiwgIjguNXB0IiwgIid9KTsiKSwNCiAgIyAgICAgICAgIn0iKQ0KICAgICAgICkgDQogICAgICkgJT4lIA0KICBmb3JtYXRSb3VuZChjKCJ0b3RhbF9wb3AiLCAiYmVuZWZpY2lhcmllcyIsICJJRFBzIiwgIlBJTl8yMDIyIiwgInRhcmdldF8yMDIyIiwgImJlbmVmaWNpYXJ5X2ZyZXF1ZW5jaWVzIiksIGRpZ2l0cyA9IDApDQpgYGANCg0KPGJyPjxicj48YnI+DQoNCiMjIDguIEludGVyYWN0aXZlIHJlZmVyZW5jZSBtYXBzDQoNCkNsaWNrICoqW2hlcmVdKGh0dHBzOi8vZm9vZC1zZWN1cml0eS1jbHVzdGVyLW15YW5tYXIuZ2l0aHViLmlvL21tcl81d19pbml0aWFsX29ic2VydmF0aW9uc19tYXBzLykqKiB0byBsb2FkIG1hcHMuIFRoaXMgbWlnaHQgdGFrZSBzb21lIHRpbWUgYXMgdGhlIGZpbGVzIGFyZSBxdWl0ZSBsYXJnZS4gIA0KDQoNCg0KDQoNCg0K