update analysis

update analysis

Comic Relief Tech for Good
applications analysis

David Kane, CAST
May 2017

This is an analysis of applications received by Comic Relief
and Paul Hamlyn Foundation to the Tech for Good funding stream in 2016/17.
The programme seeks to fund projects which use digital technology to address social challenges.

It was designed to include a simple first stage application process, which consisted of a publically
available video, 100 word summary and a visual presentation. This attracted 145 applications which
were reviewed by staff at both Comic Relief and Paul Hamlyn Foundation to create a long list of our
top 50 in November 2016 and to select our top 10 in March 2017.

The analysis aims to answer five key questions, including comparisons between the applications that
were successfully funded and those that were longlisted. The key questions are:

What types of technology are being developed?

What approaches are adopted?

What is the focus of the application? (Linking these to the key themes for Comic Relief
and Paul Hamlyn Foundation)

Who are the target audience for the projects?

What stage of development are the projects?

Additionally, the analysis presents data on the types of organisations applying for funding, the
size of those applicants, and geographical analysis of the locations of the applicants.

Key findings

Applications generally came from registered charities, but one in six applications came from
Community Interest Companies.

The majority of applicants had income greater than £1 million.

Two fifths of applicants are based in London.

Most applications aim to provide information or advice directly to beneficiaries.

The largest focus of applications was health and wellbeing.

Over half of applications were at the stage of having a minimum viable product or pilot product
for their project.

Methodology

Data on the applications received to the programme was available in a spreadsheet format. The data
was first supplemented with additional data from four sources:

Where the applicant supplied a YouTube video a transcription of the video was extracted. This
transcription was used for tagging the data (see below) with the technology types and beneficiaries
supported by the application, to supplement the summary description found.

The applicants were matched to charity numbers to allow charity registration data, such as the
organisations' income and location, to be used. Charity data was used from CharityBase.

Applicants were also matched to company numbers where a charity number was not available. Company
data was then attached using the Companies House information service.

Location data was added by geocoding the location field supplied with the data. Geocoding was
done using the Google Maps Geocoding API.

A small number of applicant organisations could not be reconciled either to companies or charities.
These organisations were manually examined to determine their organisation type, with a small number
where the type of organisation was not able to be discovered.

Additional data cleaning also included removing a duplicate application, and removing three ineligible
applications from the data. After cleaning, 141 applications were available for analysis.

Tagging applications

To answer the five key questions, tags were added to the application data. The tags were based on
manually examining each application as well as performing keyword searches. The tags would be based,
for example, on identifying particular types of technology used, or beneficiary groups. The tags to
be added were not decided in advance but were instead built up organically based on the content.
Additionally an assessment was made of the stage of development for the application project.

As organisations could be tagged multiple times in a single categories, totals in these charts and
tables may be greater than the total number of applications.

Analysis of applicants

Applications by status

Of the 141 organisations, 51 were longlisted for consideration and asked to
apply to the fund, with 90 unsuccessful.

Final status of applications

            <iframe src="data:text/html;base64,DQogICAgICAgIDwhLS0gTG9hZCBDaGFydHMuanMgLS0+DQogICAgICAgPHNjcmlwdCBzcmM9J2h0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL0NoYXJ0LmpzLzIuNS4wL0NoYXJ0LmJ1bmRsZS5taW4uanMnPjwvc2NyaXB0Pg0KICAgIA0KICAgICAgICA8Y2FudmFzIGlkPSdjaGFydF9zdGF0dXNfcGllJz48L2NhbnZhcz4NCiAgICAgICAgPHNjcmlwdD4NCiAgICAgICAgICAgIHZhciBjdHggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2hhcnRfc3RhdHVzX3BpZScpLmdldENvbnRleHQoJzJkJyk7DQogICAgICAgICAgICBjdHguY2FudmFzLndpZHRoICA9IDgwMCAtICguMSAqIDgwMCk7DQogICAgICAgICAgICBjdHguY2FudmFzLmhlaWdodCA9IDQyMCAtICguMTUgKiA0MjApOw0KICAgICAgICAgICAgdmFyIG15TmV3Q2hhcnQgPSBuZXcgQ2hhcnQoY3R4LHsgdHlwZTogJ3BpZScsIGRhdGE6IHsNCiAgICAnbGFiZWxzJzogWw0KICAgICAgICAnVW5zdWNjZXNzZnVsJywNCiAgICAgICAgJ1Vuc3VjY2Vzc2Z1bCAtIGxvbmdsaXN0ZWQnLA0KICAgICAgICAnRnVuZGVkJw0KICAgIF0sDQogICAgJ2RhdGFzZXRzJzogWw0KICAgICAgICB7DQogICAgICAgICAgICAnYmFja2dyb3VuZENvbG9yJzogWw0KICAgICAgICAgICAgICAgICdyZ2IoMjUyLCAxNTgsIDE4NSknLA0KICAgICAgICAgICAgICAgICdyZ2IoMCwgMTI4LCAxNTYpJywNCiAgICAgICAgICAgICAgICAncmdiKDIzNCw3Nyw5NCknDQogICAgICAgICAgICBdLA0KICAgICAgICAgICAgJ2RhdGEnOiBbDQogICAgICAgICAgICAgICAgOTAsDQogICAgICAgICAgICAgICAgNDEsDQogICAgICAgICAgICAgICAgMTANCiAgICAgICAgICAgIF0sDQogICAgICAgICAgICAnbGFiZWwnOiAnQXBwbGljYXRpb25zJw0KICAgICAgICB9DQogICAgXQ0KfSwgb3B0aW9uczogew0KICAgICdsZWdlbmQnOiB7DQogICAgICAgICdsYWJlbHMnOiB7DQogICAgICAgICAgICAnZm9udEZhbWlseSc6ICdcJ1JvYm90b1wnLHNhbnMtc2VyaWYnLA0KICAgICAgICAgICAgJ2ZvbnRTaXplJzogMTYNCiAgICAgICAgfSwNCiAgICAgICAgJ3Bvc2l0aW9uJzogJ2JvdHRvbScNCiAgICB9LA0KICAgICdyZXNwb25zaXZlJzogZmFsc2UNCn0gfSk7DQogICAgICAgIDwvc2NyaXB0Pg0KICAgIA=="
                  style="height:600px;width: 100%;border:none !important;"
                  allowfullscreen=""
                  webkitallowfullscreen=""
                  mozallowfullscreen="">

Of the 51 applications carried forward to longlisting, 22 were invited to submit
a full written application and were assessed. Of these, 10 were funded.

Applications by status and organisation type

83 of the applications (59%) were by
registered charities, with a further 23 by
Community Interest Companies. The organisation type of 12 applicants could not
be determined. Charities were slightly more likely than other types to be
longlisted, and make up  of the  successful applications.

Applicants by organisation type and status

            <iframe src="data:text/html;base64,DQogICAgICAgIDwhLS0gTG9hZCBDaGFydHMuanMgLS0+DQogICAgICAgPHNjcmlwdCBzcmM9J2h0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL0NoYXJ0LmpzLzIuNS4wL0NoYXJ0LmJ1bmRsZS5taW4uanMnPjwvc2NyaXB0Pg0KICAgIA0KICAgICAgICA8Y2FudmFzIGlkPSdjaGFydF9vcmdfdHlwZV9zdGF0dXMnPjwvY2FudmFzPg0KICAgICAgICA8c2NyaXB0Pg0KICAgICAgICAgICAgdmFyIGN0eCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjaGFydF9vcmdfdHlwZV9zdGF0dXMnKS5nZXRDb250ZXh0KCcyZCcpOw0KICAgICAgICAgICAgY3R4LmNhbnZhcy53aWR0aCAgPSA4MDAgLSAoLjEgKiA4MDApOw0KICAgICAgICAgICAgY3R4LmNhbnZhcy5oZWlnaHQgPSA1MDAgLSAoLjE1ICogNTAwKTsNCiAgICAgICAgICAgIHZhciBteU5ld0NoYXJ0ID0gbmV3IENoYXJ0KGN0eCx7IHR5cGU6ICdob3Jpem9udGFsQmFyJywgZGF0YTogew0KICAgICdsYWJlbHMnOiBbDQogICAgICAgICdDaGFyaXR5JywNCiAgICAgICAgJ0NvbW11bml0eSBJbnRlcmVzdCBDb21wYW55JywNCiAgICAgICAgJ1Vua25vd24nLA0KICAgICAgICAnQ29tcGFueSBsaW1pdGVkIGJ5IHNoYXJlcycsDQogICAgICAgICdDb21wYW55IExpbWl0ZWQgYnkgR3VhcmFudGVlJywNCiAgICAgICAgJ1VuaXZlcnNpdHknLA0KICAgICAgICAnSG91c2luZyBBc3NvY2lhdGlvbicsDQogICAgICAgICdPdmVyc2VhcycNCiAgICBdLA0KICAgICdkYXRhc2V0cyc6IFsNCiAgICAgICAgew0KICAgICAgICAgICAgJ2JhY2tncm91bmRDb2xvcic6ICdyZ2IoMjM0LDc3LDk0KScsDQogICAgICAgICAgICAnZGF0YSc6IFsNCiAgICAgICAgICAgICAgICA3LjAsDQogICAgICAgICAgICAgICAgMy4wLA0KICAgICAgICAgICAgICAgIDAuMCwNCiAgICAgICAgICAgICAgICAwLjAsDQogICAgICAgICAgICAgICAgMC4wLA0KICAgICAgICAgICAgICAgIDAuMCwNCiAgICAgICAgICAgICAgICAwLjAsDQogICAgICAgICAgICAgICAgMC4wDQogICAgICAgICAgICBdLA0KICAgICAgICAgICAgJ2xhYmVsJzogJ0Z1bmRlZCcNCiAgICAgICAgfSwNCiAgICAgICAgew0KICAgICAgICAgICAgJ2JhY2tncm91bmRDb2xvcic6ICdyZ2IoMCwgMTI4LCAxNTYpJywNCiAgICAgICAgICAgICdkYXRhJzogWw0KICAgICAgICAgICAgICAgIDI1LjAsDQogICAgICAgICAgICAgICAgNi4wLA0KICAgICAgICAgICAgICAgIDUuMCwNCiAgICAgICAgICAgICAgICA0LjAsDQogICAgICAgICAgICAgICAgMS4wLA0KICAgICAgICAgICAgICAgIDAuMCwNCiAgICAgICAgICAgICAgICAwLjAsDQogICAgICAgICAgICAgICAgMC4wDQogICAgICAgICAgICBdLA0KICAgICAgICAgICAgJ2xhYmVsJzogJ1Vuc3VjY2Vzc2Z1bCAtIGxvbmdsaXN0ZWQnDQogICAgICAgIH0sDQogICAgICAgIHsNCiAgICAgICAgICAgICdiYWNrZ3JvdW5kQ29sb3InOiAncmdiKDI1MiwgMTU4LCAxODUpJywNCiAgICAgICAgICAgICdkYXRhJzogWw0KICAgICAgICAgICAgICAgIDUxLjAsDQogICAgICAgICAgICAgICAgMTQuMCwNCiAgICAgICAgICAgICAgICA3LjAsDQogICAgICAgICAgICAgICAgNy4wLA0KICAgICAgICAgICAgICAgIDYuMCwNCiAgICAgICAgICAgICAgICAzLjAsDQogICAgICAgICAgICAgICAgMS4wLA0KICAgICAgICAgICAgICAgIDEuMA0KICAgICAgICAgICAgXSwNCiAgICAgICAgICAgICdsYWJlbCc6ICdVbnN1Y2Nlc3NmdWwnDQogICAgICAgIH0NCiAgICBdDQp9LCBvcHRpb25zOiB7DQogICAgJ3NjYWxlcyc6IHsNCiAgICAgICAgJ3hBeGVzJzogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICd0aWNrcyc6IHsNCiAgICAgICAgICAgICAgICAgICAgJ2ZvbnRGYW1pbHknOiAnXCdSb2JvdG9cJyxzYW5zLXNlcmlmJywNCiAgICAgICAgICAgICAgICAgICAgJ21pbic6IDAsDQogICAgICAgICAgICAgICAgICAgICdmb250U2l6ZSc6IDIwDQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAnZ3JpZExpbmVzJzogew0KICAgICAgICAgICAgICAgICAgICAnZHJhd0JvcmRlcic6IHRydWUsDQogICAgICAgICAgICAgICAgICAgICdkaXNwbGF5JzogZmFsc2UNCiAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgICdzdGFja2VkJzogdHJ1ZQ0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAneUF4ZXMnOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgJ3RpY2tzJzogew0KICAgICAgICAgICAgICAgICAgICAnZm9udEZhbWlseSc6ICdcJ1JvYm90b1wnLHNhbnMtc2VyaWYnLA0KICAgICAgICAgICAgICAgICAgICAnZm9udFNpemUnOiAyMA0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgJ2dyaWRMaW5lcyc6IHsNCiAgICAgICAgICAgICAgICAgICAgJ2RyYXdCb3JkZXInOiBmYWxzZSwNCiAgICAgICAgICAgICAgICAgICAgJ2Rpc3BsYXknOiBmYWxzZQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgXQ0KICAgIH0sDQogICAgJ2xlZ2VuZCc6IHsNCiAgICAgICAgJ2xhYmVscyc6IHsNCiAgICAgICAgICAgICdmb250RmFtaWx5JzogJ1wnUm9ib3RvXCcsc2Fucy1zZXJpZicsDQogICAgICAgICAgICAnZm9udFNpemUnOiAxNg0KICAgICAgICB9LA0KICAgICAgICAncG9zaXRpb24nOiAnYm90dG9tJw0KICAgIH0sDQogICAgJ3Jlc3BvbnNpdmUnOiBmYWxzZQ0KfSB9KTsNCiAgICAgICAgPC9zY3JpcHQ+DQogICAg"
                  style="height:600px;width: 100%;border:none !important;"
                  allowfullscreen=""
                  webkitallowfullscreen=""
                  mozallowfullscreen="">

Size of organisation

Size of applicants was only available for the 83 applicants that were registered charities,
and is based on their income in the latest return to the Charity Commission. Data was not available for
all charities, as some were registered in Northern Ireland or registered too recently for financial information
to be available. Of the 83 charity applications, 14 had an income of
more than £10 million.

Applicants by size and status

            <iframe src="data:text/html;base64,DQogICAgICAgIDwhLS0gTG9hZCBDaGFydHMuanMgLS0+DQogICAgICAgPHNjcmlwdCBzcmM9J2h0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL0NoYXJ0LmpzLzIuNS4wL0NoYXJ0LmJ1bmRsZS5taW4uanMnPjwvc2NyaXB0Pg0KICAgIA0KICAgICAgICA8Y2FudmFzIGlkPSdjaGFydF9vcmdfc2l6ZSc+PC9jYW52YXM+DQogICAgICAgIDxzY3JpcHQ+DQogICAgICAgICAgICB2YXIgY3R4ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NoYXJ0X29yZ19zaXplJykuZ2V0Q29udGV4dCgnMmQnKTsNCiAgICAgICAgICAgIGN0eC5jYW52YXMud2lkdGggID0gODAwIC0gKC4xICogODAwKTsNCiAgICAgICAgICAgIGN0eC5jYW52YXMuaGVpZ2h0ID0gNTAwIC0gKC4xNSAqIDUwMCk7DQogICAgICAgICAgICB2YXIgbXlOZXdDaGFydCA9IG5ldyBDaGFydChjdHgseyB0eXBlOiAnaG9yaXpvbnRhbEJhcicsIGRhdGE6IHsNCiAgICAnbGFiZWxzJzogWw0KICAgICAgICAnVW5kZXIgMTBrJywNCiAgICAgICAgJzEwayAtIDEwMGsnLA0KICAgICAgICAnMTAwayAtIDFtJywNCiAgICAgICAgJzFtIC0gMTBtJywNCiAgICAgICAgJ092ZXIgMTBtJw0KICAgIF0sDQogICAgJ2RhdGFzZXRzJzogWw0KICAgICAgICB7DQogICAgICAgICAgICAnYmFja2dyb3VuZENvbG9yJzogJ3JnYigyMzQsNzcsOTQpJywNCiAgICAgICAgICAgICdkYXRhJzogWw0KICAgICAgICAgICAgICAgIDAuMCwNCiAgICAgICAgICAgICAgICAxLjAsDQogICAgICAgICAgICAgICAgMC4wLA0KICAgICAgICAgICAgICAgIDMuMCwNCiAgICAgICAgICAgICAgICAzLjANCiAgICAgICAgICAgIF0sDQogICAgICAgICAgICAnbGFiZWwnOiAnRnVuZGVkJw0KICAgICAgICB9LA0KICAgICAgICB7DQogICAgICAgICAgICAnYmFja2dyb3VuZENvbG9yJzogJ3JnYigwLCAxMjgsIDE1NiknLA0KICAgICAgICAgICAgJ2RhdGEnOiBbDQogICAgICAgICAgICAgICAgMC4wLA0KICAgICAgICAgICAgICAgIDEuMCwNCiAgICAgICAgICAgICAgICA1LjAsDQogICAgICAgICAgICAgICAgMTIuMCwNCiAgICAgICAgICAgICAgICA2LjANCiAgICAgICAgICAgIF0sDQogICAgICAgICAgICAnbGFiZWwnOiAnVW5zdWNjZXNzZnVsIC0gbG9uZ2xpc3RlZCcNCiAgICAgICAgfSwNCiAgICAgICAgew0KICAgICAgICAgICAgJ2JhY2tncm91bmRDb2xvcic6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLA0KICAgICAgICAgICAgJ2RhdGEnOiBbDQogICAgICAgICAgICAgICAgMS4wLA0KICAgICAgICAgICAgICAgIDYuMCwNCiAgICAgICAgICAgICAgICAxNy4wLA0KICAgICAgICAgICAgICAgIDE5LjAsDQogICAgICAgICAgICAgICAgNS4wDQogICAgICAgICAgICBdLA0KICAgICAgICAgICAgJ2xhYmVsJzogJ1Vuc3VjY2Vzc2Z1bCcNCiAgICAgICAgfQ0KICAgIF0NCn0sIG9wdGlvbnM6IHsNCiAgICAnc2NhbGVzJzogew0KICAgICAgICAneEF4ZXMnOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgJ3RpY2tzJzogew0KICAgICAgICAgICAgICAgICAgICAnZm9udEZhbWlseSc6ICdcJ1JvYm90b1wnLHNhbnMtc2VyaWYnLA0KICAgICAgICAgICAgICAgICAgICAnbWluJzogMCwNCiAgICAgICAgICAgICAgICAgICAgJ2ZvbnRTaXplJzogMjANCiAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgICdncmlkTGluZXMnOiB7DQogICAgICAgICAgICAgICAgICAgICdkcmF3Qm9yZGVyJzogdHJ1ZSwNCiAgICAgICAgICAgICAgICAgICAgJ2Rpc3BsYXknOiBmYWxzZQ0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgJ3N0YWNrZWQnOiB0cnVlDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICd5QXhlcyc6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAndGlja3MnOiB7DQogICAgICAgICAgICAgICAgICAgICdmb250RmFtaWx5JzogJ1wnUm9ib3RvXCcsc2Fucy1zZXJpZicsDQogICAgICAgICAgICAgICAgICAgICdmb250U2l6ZSc6IDIwDQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAnZ3JpZExpbmVzJzogew0KICAgICAgICAgICAgICAgICAgICAnZHJhd0JvcmRlcic6IGZhbHNlLA0KICAgICAgICAgICAgICAgICAgICAnZGlzcGxheSc6IGZhbHNlDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICBdDQogICAgfSwNCiAgICAnbGVnZW5kJzogew0KICAgICAgICAnbGFiZWxzJzogew0KICAgICAgICAgICAgJ2ZvbnRGYW1pbHknOiAnXCdSb2JvdG9cJyxzYW5zLXNlcmlmJywNCiAgICAgICAgICAgICdmb250U2l6ZSc6IDE2DQogICAgICAgIH0sDQogICAgICAgICdwb3NpdGlvbic6ICdib3R0b20nDQogICAgfSwNCiAgICAncmVzcG9uc2l2ZSc6IGZhbHNlDQp9IH0pOw0KICAgICAgICA8L3NjcmlwdD4NCiAgICA="
                  style="height:600px;width: 100%;border:none !important;"
                  allowfullscreen=""
                  webkitallowfullscreen=""
                  mozallowfullscreen="">

Funded
Unsuccessful - longlisted
Unsuccessful
All

Under 10k
0
0
1
1

10k - 100k
1
1
6
8

100k - 1m
0
5
17
22

1m - 10m
3
12
19
34

Over 10m
3
6
5
14

All
7
24
48
79

Applicant region

Around two-fifths of applicants (55) were based in London, according to the location provided with their
application data. The next largest region by number of applicants was the North West (16), followed by
South West (12), and then North East, South East and Yorkshire and the Humber (each with 10). The largest
organisations were more likely to be from London (of half of those with more than £10m income), but
organisations based in London still dominated the smaller income bands: 45% of organisations with
income between £100k and £1m were based in London.

Applications by region and status

            <iframe src="data:text/html;base64,DQogICAgICAgIDwhLS0gTG9hZCBDaGFydHMuanMgLS0+DQogICAgICAgPHNjcmlwdCBzcmM9J2h0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL0NoYXJ0LmpzLzIuNS4wL0NoYXJ0LmJ1bmRsZS5taW4uanMnPjwvc2NyaXB0Pg0KICAgIA0KICAgICAgICA8Y2FudmFzIGlkPSdjaGFydF9yZWdpb24nPjwvY2FudmFzPg0KICAgICAgICA8c2NyaXB0Pg0KICAgICAgICAgICAgdmFyIGN0eCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjaGFydF9yZWdpb24nKS5nZXRDb250ZXh0KCcyZCcpOw0KICAgICAgICAgICAgY3R4LmNhbnZhcy53aWR0aCAgPSA4MDAgLSAoLjEgKiA4MDApOw0KICAgICAgICAgICAgY3R4LmNhbnZhcy5oZWlnaHQgPSA1MDAgLSAoLjE1ICogNTAwKTsNCiAgICAgICAgICAgIHZhciBteU5ld0NoYXJ0ID0gbmV3IENoYXJ0KGN0eCx7IHR5cGU6ICdob3Jpem9udGFsQmFyJywgZGF0YTogew0KICAgICdsYWJlbHMnOiBbDQogICAgICAgICdMb25kb24nLA0KICAgICAgICAnTm9ydGggV2VzdCcsDQogICAgICAgICdTb3V0aCBXZXN0JywNCiAgICAgICAgJ05vcnRoIEVhc3QnLA0KICAgICAgICAnU291dGggRWFzdCcsDQogICAgICAgICdZb3Jrc2hpcmUgYW5kIHRoZSBIdW1iZXInLA0KICAgICAgICAnU2NvdGxhbmQnLA0KICAgICAgICAnV2FsZXMnLA0KICAgICAgICAnRWFzdCBNaWRsYW5kcycsDQogICAgICAgICdOb3J0aGVybiBJcmVsYW5kJywNCiAgICAgICAgJ1dlc3QgTWlkbGFuZHMnLA0KICAgICAgICAnRWFzdGVybicNCiAgICBdLA0KICAgICdkYXRhc2V0cyc6IFsNCiAgICAgICAgew0KICAgICAgICAgICAgJ2JhY2tncm91bmRDb2xvcic6ICdyZ2IoMjM0LDc3LDk0KScsDQogICAgICAgICAgICAnZGF0YSc6IFsNCiAgICAgICAgICAgICAgICA0LA0KICAgICAgICAgICAgICAgIDIsDQogICAgICAgICAgICAgICAgMywNCiAgICAgICAgICAgICAgICAwLA0KICAgICAgICAgICAgICAgIDAsDQogICAgICAgICAgICAgICAgMCwNCiAgICAgICAgICAgICAgICAxLA0KICAgICAgICAgICAgICAgIDAsDQogICAgICAgICAgICAgICAgMCwNCiAgICAgICAgICAgICAgICAwLA0KICAgICAgICAgICAgICAgIDAsDQogICAgICAgICAgICAgICAgMA0KICAgICAgICAgICAgXSwNCiAgICAgICAgICAgICdsYWJlbCc6ICdGdW5kZWQnDQogICAgICAgIH0sDQogICAgICAgIHsNCiAgICAgICAgICAgICdiYWNrZ3JvdW5kQ29sb3InOiAncmdiKDAsIDEyOCwgMTU2KScsDQogICAgICAgICAgICAnZGF0YSc6IFsNCiAgICAgICAgICAgICAgICAyMSwNCiAgICAgICAgICAgICAgICAxLA0KICAgICAgICAgICAgICAgIDQsDQogICAgICAgICAgICAgICAgMywNCiAgICAgICAgICAgICAgICA2LA0KICAgICAgICAgICAgICAgIDEsDQogICAgICAgICAgICAgICAgMSwNCiAgICAgICAgICAgICAgICAyLA0KICAgICAgICAgICAgICAgIDAsDQogICAgICAgICAgICAgICAgMCwNCiAgICAgICAgICAgICAgICAyLA0KICAgICAgICAgICAgICAgIDANCiAgICAgICAgICAgIF0sDQogICAgICAgICAgICAnbGFiZWwnOiAnVW5zdWNjZXNzZnVsIC0gbG9uZ2xpc3RlZCcNCiAgICAgICAgfSwNCiAgICAgICAgew0KICAgICAgICAgICAgJ2JhY2tncm91bmRDb2xvcic6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLA0KICAgICAgICAgICAgJ2RhdGEnOiBbDQogICAgICAgICAgICAgICAgMzAsDQogICAgICAgICAgICAgICAgMTIsDQogICAgICAgICAgICAgICAgNSwNCiAgICAgICAgICAgICAgICA3LA0KICAgICAgICAgICAgICAgIDQsDQogICAgICAgICAgICAgICAgOSwNCiAgICAgICAgICAgICAgICA2LA0KICAgICAgICAgICAgICAgIDMsDQogICAgICAgICAgICAgICAgNCwNCiAgICAgICAgICAgICAgICA0LA0KICAgICAgICAgICAgICAgIDIsDQogICAgICAgICAgICAgICAgMw0KICAgICAgICAgICAgXSwNCiAgICAgICAgICAgICdsYWJlbCc6ICdVbnN1Y2Nlc3NmdWwnDQogICAgICAgIH0NCiAgICBdDQp9LCBvcHRpb25zOiB7DQogICAgJ3NjYWxlcyc6IHsNCiAgICAgICAgJ3hBeGVzJzogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICd0aWNrcyc6IHsNCiAgICAgICAgICAgICAgICAgICAgJ2ZvbnRGYW1pbHknOiAnXCdSb2JvdG9cJyxzYW5zLXNlcmlmJywNCiAgICAgICAgICAgICAgICAgICAgJ21pbic6IDAsDQogICAgICAgICAgICAgICAgICAgICdmb250U2l6ZSc6IDIwDQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAnZ3JpZExpbmVzJzogew0KICAgICAgICAgICAgICAgICAgICAnZHJhd0JvcmRlcic6IHRydWUsDQogICAgICAgICAgICAgICAgICAgICdkaXNwbGF5JzogZmFsc2UNCiAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgICdzdGFja2VkJzogdHJ1ZQ0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAneUF4ZXMnOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgJ3RpY2tzJzogew0KICAgICAgICAgICAgICAgICAgICAnZm9udEZhbWlseSc6ICdcJ1JvYm90b1wnLHNhbnMtc2VyaWYnLA0KICAgICAgICAgICAgICAgICAgICAnZm9udFNpemUnOiAyMA0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgJ2dyaWRMaW5lcyc6IHsNCiAgICAgICAgICAgICAgICAgICAgJ2RyYXdCb3JkZXInOiBmYWxzZSwNCiAgICAgICAgICAgICAgICAgICAgJ2Rpc3BsYXknOiBmYWxzZQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgXQ0KICAgIH0sDQogICAgJ2xlZ2VuZCc6IHsNCiAgICAgICAgJ2xhYmVscyc6IHsNCiAgICAgICAgICAgICdmb250RmFtaWx5JzogJ1wnUm9ib3RvXCcsc2Fucy1zZXJpZicsDQogICAgICAgICAgICAnZm9udFNpemUnOiAxNg0KICAgICAgICB9LA0KICAgICAgICAncG9zaXRpb24nOiAnYm90dG9tJw0KICAgIH0sDQogICAgJ3Jlc3BvbnNpdmUnOiBmYWxzZQ0KfSB9KTsNCiAgICAgICAgPC9zY3JpcHQ+DQogICAg"
                  style="height:600px;width: 100%;border:none !important;"
                  allowfullscreen=""
                  webkitallowfullscreen=""
                  mozallowfullscreen="">

The digital nature of the projects does mean that the location of the applicant does not necessarily
tell us where the technology developed will actually be used.

Applicant locations

            <iframe src="data:text/html;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVMgPSBmYWxzZTsgTF9OT19UT1VDSCA9IGZhbHNlOyBMX0RJU0FCTEVfM0QgPSBmYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL3VucGtnLmNvbS9sZWFmbGV0QDEuMC4xL2Rpc3QvbGVhZmxldC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9hamF4Lmdvb2dsZWFwaXMuY29tL2FqYXgvbGlicy9qcXVlcnkvMS4xMS4xL2pxdWVyeS5taW4uanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vYm9vdHN0cmFwLzMuMi4wL2pzL2Jvb3RzdHJhcC5taW4uanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL0xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLzIuMC4yL2xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9sZWFmbGV0Lm1hcmtlcmNsdXN0ZXIvMS4wLjAvbGVhZmxldC5tYXJrZXJjbHVzdGVyLXNyYy5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvbGVhZmxldC5tYXJrZXJjbHVzdGVyLzEuMC4wL2xlYWZsZXQubWFya2VyY2x1c3Rlci5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vdW5wa2cuY29tL2xlYWZsZXRAMS4wLjEvZGlzdC9sZWFmbGV0LmNzcyIgLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC5taW4uY3NzIiAvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLXRoZW1lLm1pbi5jc3MiIC8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIgLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuY3NzIiAvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9sZWFmbGV0Lm1hcmtlcmNsdXN0ZXIvMS4wLjAvTWFya2VyQ2x1c3Rlci5EZWZhdWx0LmNzcyIgLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvbGVhZmxldC5tYXJrZXJjbHVzdGVyLzEuMC4wL01hcmtlckNsdXN0ZXIuY3NzIiAvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL3Jhd2dpdC5jb20vcHl0aG9uLXZpc3VhbGl6YXRpb24vZm9saXVtL21hc3Rlci9mb2xpdW0vdGVtcGxhdGVzL2xlYWZsZXQuYXdlc29tZS5yb3RhdGUuY3NzIiAvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgICAgICAgICA8c3R5bGU+ICNtYXBfNTIyMjVhNzJiM2Q1NDQ4ZWJmZWQxMjcwMjlkMzc2YzQgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzUyMjI1YTcyYjNkNTQ0OGViZmVkMTI3MDI5ZDM3NmM0IiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIHNvdXRoV2VzdCA9IEwubGF0TG5nKC05MCwgLTE4MCk7CiAgICAgICAgICAgICAgICB2YXIgbm9ydGhFYXN0ID0gTC5sYXRMbmcoOTAsIDE4MCk7CiAgICAgICAgICAgICAgICB2YXIgYm91bmRzID0gTC5sYXRMbmdCb3VuZHMoc291dGhXZXN0LCBub3J0aEVhc3QpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXBfNTIyMjVhNzJiM2Q1NDQ4ZWJmZWQxMjcwMjlkMzc2YzQgPSBMLm1hcCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtYXBfNTIyMjVhNzJiM2Q1NDQ4ZWJmZWQxMjcwMjlkMzc2YzQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2NlbnRlcjogWzUzLjY0OTA0LC0xLjc4NDE2XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvb206IDYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhCb3VuZHM6IGJvdW5kcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyczogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZENvcHlKdW1wOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciB0aWxlX2xheWVyX2M5NTgwYWI3NzQ3YTRmNzhiNmY3OTQyZmQ2MzY4MDdhID0gTC50aWxlTGF5ZXIoCiAgICAgICAgICAgICAgICAnaHR0cHM6Ly9zdGFtZW4tdGlsZXMte3N9LmEuc3NsLmZhc3RseS5uZXQvdG9uZXIve3p9L3t4fS97eX0ucG5nJywKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtYXhab29tOiAxOCwKICAgICAgICAgICAgICAgICAgICBtaW5ab29tOiAxLAogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVvdXNXb3JsZDogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgbm9XcmFwOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGlvbjogJ01hcCB0aWxlcyBieSA8YSBocmVmPSJodHRwOi8vc3RhbWVuLmNvbSI+U3RhbWVuIERlc2lnbjwvYT4sIHVuZGVyIDxhIGhyZWY9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LzMuMCI+Q0MgQlkgMy4wPC9hPi4gRGF0YSBieSA8YSBocmVmPSJodHRwOi8vb3BlbnN0cmVldG1hcC5vcmciPk9wZW5TdHJlZXRNYXA8L2E+LCB1bmRlciA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5zdHJlZXRtYXAub3JnL2NvcHlyaWdodCI+T0RiTDwvYT4uJywKICAgICAgICAgICAgICAgICAgICBkZXRlY3RSZXRpbmE6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNTIyMjVhNzJiM2Q1NDQ4ZWJmZWQxMjcwMjlkMzc2YzQpOwoKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgZmVhdHVyZV9ncm91cF9iM2YwODBmOTg1N2E0YWE2OTQ0OTYxOGVkMWRmZDA3OCA9IEwuZmVhdHVyZUdyb3VwKAogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNTIyMjVhNzJiM2Q1NDQ4ZWJmZWQxMjcwMjlkMzc2YzQpOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81ZmM2ZWZlYTRhMDc0MjdiYTU1MWQ2NjJlNWIzOTc2OCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUwLjgyMjUzMDAwMDAwMDAxLC0wLjEzNzE2M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjNmMDgwZjk4NTdhNGFhNjk0NDk2MThlZDFkZmQwNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTg0MTIzMDk3NTllNDI5Njg4ZGY2MDYwOThmNzBhYjQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTU4MTJiMzA3ZDFiNDQ3YWJmMjNlZjA5OTBjM2EzNGMgPSAkKCc8ZGl2IGlkPSJodG1sX2E1ODEyYjMwN2QxYjQ0N2FiZjIzZWYwOTkwYzNhMzRjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CcmlnaHRvbiBPYXNpcyBQcm9qZWN0IChCcmlnaHRvbik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU4NDEyMzA5NzU5ZTQyOTY4OGRmNjA2MDk4ZjcwYWI0LnNldENvbnRlbnQoaHRtbF9hNTgxMmIzMDdkMWI0NDdhYmYyM2VmMDk5MGMzYTM0Yyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81ZmM2ZWZlYTRhMDc0MjdiYTU1MWQ2NjJlNWIzOTc2OC5iaW5kUG9wdXAocG9wdXBfNTg0MTIzMDk3NTllNDI5Njg4ZGY2MDYwOThmNzBhYjQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JhYTExYzlhNWI1ZTQ5YjE5OTM3ZWQ0YTAwMWU2ZWRiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNDU0NTEzLC0yLjU4NzkxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9iM2YwODBmOTg1N2E0YWE2OTQ0OTYxOGVkMWRmZDA3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83MzUwOWZmZDRhZDk0ZjM2ODFhYWFmN2UyZDFiNWU5NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81MDllODAyZGM4YWU0OTRjYWFkZDk1N2VhNTY5NzIxMSA9ICQoJzxkaXYgaWQ9Imh0bWxfNTA5ZTgwMmRjOGFlNDk0Y2FhZGQ5NTdlYTU2OTcyMTEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkluYXVyYSAoQnJpc3RvbCk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzczNTA5ZmZkNGFkOTRmMzY4MWFhYWY3ZTJkMWI1ZTk3LnNldENvbnRlbnQoaHRtbF81MDllODAyZGM4YWU0OTRjYWFkZDk1N2VhNTY5NzIxMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iYWExMWM5YTViNWU0OWIxOTkzN2VkNGEwMDFlNmVkYi5iaW5kUG9wdXAocG9wdXBfNzM1MDlmZmQ0YWQ5NGYzNjgxYWFhZjdlMmQxYjVlOTcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NmNTliMjM2MjcxOTQ3ZGY4ZTEyNzNlNzk5ZTM0NjczID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTAuODI3OTMxOSwtMC4xNjg3NDldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2IzZjA4MGY5ODU3YTRhYTY5NDQ5NjE4ZWQxZGZkMDc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzA5NWJhZDAzMmJjMzRkMjU5M2M1ZTVhZmVmYzg5MDJlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzdkNjM2MjU5ODRlYjRiMjhiMmY1MTNkOWU0OGU2NTVmID0gJCgnPGRpdiBpZD0iaHRtbF83ZDYzNjI1OTg0ZWI0YjI4YjJmNTEzZDllNDhlNjU1ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WU1DQSBSaWdodCBIZXJlIChCcmlnaHRvbiBhbmQgSG92ZSk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA5NWJhZDAzMmJjMzRkMjU5M2M1ZTVhZmVmYzg5MDJlLnNldENvbnRlbnQoaHRtbF83ZDYzNjI1OTg0ZWI0YjI4YjJmNTEzZDllNDhlNjU1Zik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jZjU5YjIzNjI3MTk0N2RmOGUxMjczZTc5OWUzNDY3My5iaW5kUG9wdXAocG9wdXBfMDk1YmFkMDMyYmMzNGQyNTkzYzVlNWFmZWZjODkwMmUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2M5NjM4NjRiZmQ3NTQyNmRhN2ExY2ViNWQxMmNhZjAwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTUuMDQ0MzIsLTcuMDIwMzU5OTk5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9iM2YwODBmOTg1N2E0YWE2OTQ0OTYxOGVkMWRmZDA3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iNzYxZjhkY2NjNjA0Zjc4OTdiOGMyZmZkNmZhMGE1ZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jYjExYTJmMDhhZTE0YWFjYmY4ZmViY2JiYjY3MmFhMyA9ICQoJzxkaXYgaWQ9Imh0bWxfY2IxMWEyZjA4YWUxNGFhY2JmOGZlYmNiYmI2NzJhYTMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNlcmVzIEV1cm9wZSAoTkkpIEx0ZCAoQmFsbHlrZWxseSBDbyBMb25kb25kZXJyeSBOb3J0aGVybiBJcmVsYW5kKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjc2MWY4ZGNjYzYwNGY3ODk3YjhjMmZmZDZmYTBhNWUuc2V0Q29udGVudChodG1sX2NiMTFhMmYwOGFlMTRhYWNiZjhmZWJjYmJiNjcyYWEzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2M5NjM4NjRiZmQ3NTQyNmRhN2ExY2ViNWQxMmNhZjAwLmJpbmRQb3B1cChwb3B1cF9iNzYxZjhkY2NjNjA0Zjc4OTdiOGMyZmZkNmZhMGE1ZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTM2NjY0MzA5NDcxNDJlZDg0M2IwMzRhYzMwNDdlODQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41MDczNTA5LC0wLjEyNzc1ODNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2IzZjA4MGY5ODU3YTRhYTY5NDQ5NjE4ZWQxZGZkMDc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzNlNjFkNWE4MmRjODQwYWM4M2I1OTkxYTIyMjU3YmIxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRiYTVhNTIyNTU4MjQ0Yzc4YjUzY2M5NWFmYzZkYTRiID0gJCgnPGRpdiBpZD0iaHRtbF80YmE1YTUyMjU1ODI0NGM3OGI1M2NjOTVhZmM2ZGE0YiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V29tZW4gT24gUHVycG9zZSAoTG9uZG9uKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfM2U2MWQ1YTgyZGM4NDBhYzgzYjU5OTFhMjIyNTdiYjEuc2V0Q29udGVudChodG1sXzRiYTVhNTIyNTU4MjQ0Yzc4YjUzY2M5NWFmYzZkYTRiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2UzNjY2NDMwOTQ3MTQyZWQ4NDNiMDM0YWMzMDQ3ZTg0LmJpbmRQb3B1cChwb3B1cF8zZTYxZDVhODJkYzg0MGFjODNiNTk5MWEyMjI1N2JiMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNWFmMGUxZDBkZjczNDRlYThlOGM1ODQ1MjQxMTJiNjEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1NC42MTI1MzcsLTEuMjkwOTYxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9iM2YwODBmOTg1N2E0YWE2OTQ0OTYxOGVkMWRmZDA3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84ZDRhMTFjNjIxMjc0NDRlOGM2ODNjMmFmNmJkMjBjZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82NDg1ZmQxYjc4NjM0OGJmODQyOTU1NmQzYjQwYTQwNCA9ICQoJzxkaXYgaWQ9Imh0bWxfNjQ4NWZkMWI3ODYzNDhiZjg0Mjk1NTZkM2I0MGE0MDQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFCQyBDb3Vuc2VsbGluZyAmYW1wOyBQbGF5IFRoZXJhcHkgJmFtcDsgRmFtaWx5IFNvbHV0aW9ucyAmYW1wOyBUaW1lIDQgWW91IENvdW5zZWxsaW5nIFNlcnZpY2VzIChCaWxsaW5naGFtLCBTdG9ja3RvbiBvbiBUZWVzKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOGQ0YTExYzYyMTI3NDQ0ZThjNjgzYzJhZjZiZDIwY2Quc2V0Q29udGVudChodG1sXzY0ODVmZDFiNzg2MzQ4YmY4NDI5NTU2ZDNiNDBhNDA0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzVhZjBlMWQwZGY3MzQ0ZWE4ZThjNTg0NTI0MTEyYjYxLmJpbmRQb3B1cChwb3B1cF84ZDRhMTFjNjIxMjc0NDRlOGM2ODNjMmFmNmJkMjBjZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDgxYjNmZTUyYmJmNDZkZGE2MjMxYmViOTQxYzVlM2UgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41MDczNTA5LC0wLjEyNzc1ODNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2IzZjA4MGY5ODU3YTRhYTY5NDQ5NjE4ZWQxZGZkMDc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzBlNGVmYzYzMGM0MDRiYzliYzM4MDQxZDkwZGMzYTVhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzVmOTEyMTdjYThmOTQxNjFhNzFiNmM4M2NjZjg2YTFlID0gJCgnPGRpdiBpZD0iaHRtbF81ZjkxMjE3Y2E4Zjk0MTYxYTcxYjZjODNjY2Y4NmExZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VGhlIEhlYWx0aCBFcXVhbGl0eSBhbmQgUmlnaHRzIE9yZ2FuaXNhdGlvbiAoTG9uZG9uLCBVSyk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzBlNGVmYzYzMGM0MDRiYzliYzM4MDQxZDkwZGMzYTVhLnNldENvbnRlbnQoaHRtbF81ZjkxMjE3Y2E4Zjk0MTYxYTcxYjZjODNjY2Y4NmExZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80ODFiM2ZlNTJiYmY0NmRkYTYyMzFiZWI5NDFjNWUzZS5iaW5kUG9wdXAocG9wdXBfMGU0ZWZjNjMwYzQwNGJjOWJjMzgwNDFkOTBkYzNhNWEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Q5N2Q1ZmYzNWY1NzRhM2E5MGM5MTBiOTY5Mzk4NjFmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTMuNDgwNzU5MywtMi4yNDI2MzA1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9iM2YwODBmOTg1N2E0YWE2OTQ0OTYxOGVkMWRmZDA3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zNWMwZThmODg1MTY0MWNhYTJkNjk1NGRhZTdlYjcyMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85NGRjYWQyYmI4ZDc0ZjRjYWIyY2Y1OGU5OTZmYmQ0OCA9ICQoJzxkaXYgaWQ9Imh0bWxfOTRkY2FkMmJiOGQ3NGY0Y2FiMmNmNThlOTk2ZmJkNDgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNvbmRlciBSYWRpbyAoTWFuY2hlc3Rlcik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzM1YzBlOGY4ODUxNjQxY2FhMmQ2OTU0ZGFlN2ViNzIwLnNldENvbnRlbnQoaHRtbF85NGRjYWQyYmI4ZDc0ZjRjYWIyY2Y1OGU5OTZmYmQ0OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kOTdkNWZmMzVmNTc0YTNhOTBjOTEwYjk2OTM5ODYxZi5iaW5kUG9wdXAocG9wdXBfMzVjMGU4Zjg4NTE2NDFjYWEyZDY5NTRkYWU3ZWI3MjApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzAwMGJlMTczMzJkZDQ0MDI5YmYyYWZkYzkyY2RmYTkxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTMuOTU5OTY1MTAwMDAwMDEsLTEuMDg3Mjk3OV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjNmMDgwZjk4NTdhNGFhNjk0NDk2MThlZDFkZmQwNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODFjOTYwZGQ1NTA1NDI5NGJhYjI3ZTdmMjVmYjYwNGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmU5NzhkMmJjNDk0NDcxZDgxZjZmNjA3NTE2MWE0OWYgPSAkKCc8ZGl2IGlkPSJodG1sXzZlOTc4ZDJiYzQ5NDQ3MWQ4MWY2ZjYwNzUxNjFhNDlmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Jbm5vdmF0aW9ucyBpbiBEZW1lbnRpYSBDSUMgKFlvcmspPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84MWM5NjBkZDU1MDU0Mjk0YmFiMjdlN2YyNWZiNjA0YS5zZXRDb250ZW50KGh0bWxfNmU5NzhkMmJjNDk0NDcxZDgxZjZmNjA3NTE2MWE0OWYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDAwYmUxNzMzMmRkNDQwMjliZjJhZmRjOTJjZGZhOTEuYmluZFBvcHVwKHBvcHVwXzgxYzk2MGRkNTUwNTQyOTRiYWIyN2U3ZjI1ZmI2MDRhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iNDcyMWVkOGFlNzM0ODlhOGU4NDRhOTViNzM2NTdmNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUyLjU2OTQ5ODQ5OTk5OTk5LC0wLjI0MDUyOTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2IzZjA4MGY5ODU3YTRhYTY5NDQ5NjE4ZWQxZGZkMDc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzlmZTE0YWNiMmI4MTQyMjRiZThjM2MyNDE3YzM5ZTA0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU5ZmVjNDQ0ZWRiZDQ4OTFhOTRmYWViNWVlYjkwMGQxID0gJCgnPGRpdiBpZD0iaHRtbF81OWZlYzQ0NGVkYmQ0ODkxYTk0ZmFlYjVlZWI5MDBkMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2l0aXplbnMgQWR2aWNlIFBldGVyYm9yb3VnaCAoUGV0ZXJib3JvdWdoKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOWZlMTRhY2IyYjgxNDIyNGJlOGMzYzI0MTdjMzllMDQuc2V0Q29udGVudChodG1sXzU5ZmVjNDQ0ZWRiZDQ4OTFhOTRmYWViNWVlYjkwMGQxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2I0NzIxZWQ4YWU3MzQ4OWE4ZTg0NGE5NWI3MzY1N2Y2LmJpbmRQb3B1cChwb3B1cF85ZmUxNGFjYjJiODE0MjI0YmU4YzNjMjQxN2MzOWUwNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTdlMWM1OGFjMmYwNDFkNmFhNTVlMGJkNDJkZWFiN2YgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1NS44NDcyNTgsLTQuNDQwMTEzOTk5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9iM2YwODBmOTg1N2E0YWE2OTQ0OTYxOGVkMWRmZDA3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yOWNhOWE1ZWUzNmY0ZGQzYWQ5NTgxOTVjMWZlNWQ0MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iMDE1NTc4YTY5ZWI0OTM2YjFjZWM0MDQ5NzcwYTJkNCA9ICQoJzxkaXYgaWQ9Imh0bWxfYjAxNTU3OGE2OWViNDkzNmIxY2VjNDA0OTc3MGEyZDQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJpcG9sYXIgU2NvdGxhbmQgKFBhaXNsZXkpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yOWNhOWE1ZWUzNmY0ZGQzYWQ5NTgxOTVjMWZlNWQ0MC5zZXRDb250ZW50KGh0bWxfYjAxNTU3OGE2OWViNDkzNmIxY2VjNDA0OTc3MGEyZDQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTdlMWM1OGFjMmYwNDFkNmFhNTVlMGJkNDJkZWFiN2YuYmluZFBvcHVwKHBvcHVwXzI5Y2E5YTVlZTM2ZjRkZDNhZDk1ODE5NWMxZmU1ZDQwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mZDYwZjNkOTg4OGE0ODM0OTExZjRiZDFlYjhlZDI3MyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjUwNzM1MDksLTAuMTI3NzU4M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjNmMDgwZjk4NTdhNGFhNjk0NDk2MThlZDFkZmQwNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOWU2MmNjYWMzNTUwNGFmYWIyZjhiNGE2NzVjOTAwNTYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzljY2I0NTA0ZTc3NGVjZmIyNWE0MjgxYzIxY2RjMDAgPSAkKCc8ZGl2IGlkPSJodG1sX2M5Y2NiNDUwNGU3NzRlY2ZiMjVhNDI4MWMyMWNkYzAwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CYWJ5IFBvaW50IChMb25kb24pPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85ZTYyY2NhYzM1NTA0YWZhYjJmOGI0YTY3NWM5MDA1Ni5zZXRDb250ZW50KGh0bWxfYzljY2I0NTA0ZTc3NGVjZmIyNWE0MjgxYzIxY2RjMDApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZmQ2MGYzZDk4ODhhNDgzNDkxMWY0YmQxZWI4ZWQyNzMuYmluZFBvcHVwKHBvcHVwXzllNjJjY2FjMzU1MDRhZmFiMmY4YjRhNjc1YzkwMDU2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84YzZmNmJkYjI4MGM0YmE2OGEwMjFkZjE1MmVjNjcxZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjU4NDE1MSwtMi45OTc2NjRdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2IzZjA4MGY5ODU3YTRhYTY5NDQ5NjE4ZWQxZGZkMDc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzMxZTlmYTJlNjcwNzRjNjZiNWJmMGFiZTljMGM2NjJhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2EwZTllYzA3ZjY2NjRiOThiN2Q2NmNjYzA2ZWI5NDUzID0gJCgnPGRpdiBpZD0iaHRtbF9hMGU5ZWMwN2Y2NjY0Yjk4YjdkNjZjY2MwNmViOTQ1MyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TmV3IFBhdGh3YXlzIChOZXdwb3J0LCBHd2VudCk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzMxZTlmYTJlNjcwNzRjNjZiNWJmMGFiZTljMGM2NjJhLnNldENvbnRlbnQoaHRtbF9hMGU5ZWMwN2Y2NjY0Yjk4YjdkNjZjY2MwNmViOTQ1Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84YzZmNmJkYjI4MGM0YmE2OGEwMjFkZjE1MmVjNjcxZS5iaW5kUG9wdXAocG9wdXBfMzFlOWZhMmU2NzA3NGM2NmI1YmYwYWJlOWMwYzY2MmEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzAyMDQ0NGFmNmQyOTRhMDA5YjcxZWVlMDZhMTU3NTE4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTQuNTIzNjEsLTEuNTU5NDU4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9iM2YwODBmOTg1N2E0YWE2OTQ0OTYxOGVkMWRmZDA3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iOTI2N2JjOTg1NWU0ZWJkOTUwNzUyODQzNjkxMmQyZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82ODI3NGU5ZjRjZTI0NWYyOGE0NDEyYzZkMzUxYWQxYyA9ICQoJzxkaXYgaWQ9Imh0bWxfNjgyNzRlOWY0Y2UyNDVmMjhhNDQxMmM2ZDM1MWFkMWMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRhcmxpbmd0b24gTWluZCAoRGFybGluZ3Rvbik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I5MjY3YmM5ODU1ZTRlYmQ5NTA3NTI4NDM2OTEyZDJmLnNldENvbnRlbnQoaHRtbF82ODI3NGU5ZjRjZTI0NWYyOGE0NDEyYzZkMzUxYWQxYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wMjA0NDRhZjZkMjk0YTAwOWI3MWVlZTA2YTE1NzUxOC5iaW5kUG9wdXAocG9wdXBfYjkyNjdiYzk4NTVlNGViZDk1MDc1Mjg0MzY5MTJkMmYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzJmMDk4MzIxMjY5YTQ1NzhhODc5MGY5OWRlZjFmMDQwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTMuNTIyODIsLTEuMTI4NDYyXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9iM2YwODBmOTg1N2E0YWE2OTQ0OTYxOGVkMWRmZDA3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80OTUxM2RmMDhkMGU0NGExOTYxZTc4OTRhYWFkMTYxNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wYTA1MGJhZWFjY2Y0MTVlOWMyYjc5OGRhYTE0OWE5NCA9ICQoJzxkaXYgaWQ9Imh0bWxfMGEwNTBiYWVhY2NmNDE1ZTljMmI3OThkYWExNDlhOTQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNob2ljZXM0RG9uY2FzdGVyIChEb25jYXN0ZXIsICBTb3V0aCBZb3Jrc2hpcmUpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80OTUxM2RmMDhkMGU0NGExOTYxZTc4OTRhYWFkMTYxNy5zZXRDb250ZW50KGh0bWxfMGEwNTBiYWVhY2NmNDE1ZTljMmI3OThkYWExNDlhOTQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMmYwOTgzMjEyNjlhNDU3OGE4NzkwZjk5ZGVmMWYwNDAuYmluZFBvcHVwKHBvcHVwXzQ5NTEzZGYwOGQwZTQ0YTE5NjFlNzg5NGFhYWQxNjE3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80YmRmOTg4M2MzNmU0ZjRkYjY4NDAyYTM5ZDY0M2VhYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUzLjQwODM3MTQsLTIuOTkxNTcyNl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjNmMDgwZjk4NTdhNGFhNjk0NDk2MThlZDFkZmQwNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGQzYzkwZjdjNWEyNDFhNGI2MmQ5NWMzN2YzN2Q1ZjUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzUxNGNmMjY1ZDdhNDZlZTliYThmNmMyMDYyM2QyMDggPSAkKCc8ZGl2IGlkPSJodG1sXzM1MTRjZjI2NWQ3YTQ2ZWU5YmE4ZjZjMjA2MjNkMjA4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5UaGUgV29tZW4mIzM5O3MgT3JnYW5pc2F0aW9uIChMaXZlcnBvb2wpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wZDNjOTBmN2M1YTI0MWE0YjYyZDk1YzM3ZjM3ZDVmNS5zZXRDb250ZW50KGh0bWxfMzUxNGNmMjY1ZDdhNDZlZTliYThmNmMyMDYyM2QyMDgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNGJkZjk4ODNjMzZlNGY0ZGI2ODQwMmEzOWQ2NDNlYWEuYmluZFBvcHVwKHBvcHVwXzBkM2M5MGY3YzVhMjQxYTRiNjJkOTVjMzdmMzdkNWY1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yZGMxNmY2NmUzYjE0N2U5OTFiOTkwZGUxMzFmMmVhMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzU0Ljg1OTExNjEsLTEuNTc0MDg4OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjNmMDgwZjk4NTdhNGFhNjk0NDk2MThlZDFkZmQwNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzg3ZGEzNzdiYWJjNDg0Zjg0N2E5ZWQzMWQ3NjM0OWUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTk5NmZmZWRhODk3NGNhNTgzNTM4YTBhOGRlMDI3YzkgPSAkKCc8ZGl2IGlkPSJodG1sXzE5OTZmZmVkYTg5NzRjYTU4MzUzOGEwYThkZTAyN2M5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ob3J0aCBFYXN0IEF1dGlzbSBTb2NpZXR5IChORUFTKSAoQ2hlc3RlciBsZSBTdHJlZXQsIENvdW50eSBEdXJoYW0pPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83ODdkYTM3N2JhYmM0ODRmODQ3YTllZDMxZDc2MzQ5ZS5zZXRDb250ZW50KGh0bWxfMTk5NmZmZWRhODk3NGNhNTgzNTM4YTBhOGRlMDI3YzkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMmRjMTZmNjZlM2IxNDdlOTkxYjk5MGRlMTMxZjJlYTIuYmluZFBvcHVwKHBvcHVwXzc4N2RhMzc3YmFiYzQ4NGY4NDdhOWVkMzFkNzYzNDllKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jMDI1M2E1MWQyYzg0YTJmOGY1NzE5MGNlYTRiODZiYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjUwNzM1MDksLTAuMTI3NzU4M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjNmMDgwZjk4NTdhNGFhNjk0NDk2MThlZDFkZmQwNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODQyZDZhMGZkZTI5NGFiNThkNzlmZTRlMzNjYWEzMDMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZGMyNGNkNzI3ZmQ1NDczZDg4NWNlOGIwMzM0OGQ3M2EgPSAkKCc8ZGl2IGlkPSJodG1sX2RjMjRjZDcyN2ZkNTQ3M2Q4ODVjZThiMDMzNDhkNzNhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DYWbDqWRpcmVjdCBQcm9kdWNlcnMmIzM5OyBGb3VuZGF0aW9uICggTG9uZG9uLFVLKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODQyZDZhMGZkZTI5NGFiNThkNzlmZTRlMzNjYWEzMDMuc2V0Q29udGVudChodG1sX2RjMjRjZDcyN2ZkNTQ3M2Q4ODVjZThiMDMzNDhkNzNhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2MwMjUzYTUxZDJjODRhMmY4ZjU3MTkwY2VhNGI4NmJjLmJpbmRQb3B1cChwb3B1cF84NDJkNmEwZmRlMjk0YWI1OGQ3OWZlNGUzM2NhYTMwMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZmQzMjU4NGE1MzlkNDAyZmI1MjYzOGY4NGIxMmJlOTAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1NC45NzgyNTIsLTEuNjE3NzhdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2IzZjA4MGY5ODU3YTRhYTY5NDQ5NjE4ZWQxZGZkMDc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2MyNWZhMzQ3ZGI3ZTQ5OWRiNTk4OWRlMTUzY2UyMzU2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2I1MTg3N2M2ZWEzMTQ2ZGFhNDNkYWQ2YmMxNzA2ZTZhID0gJCgnPGRpdiBpZD0iaHRtbF9iNTE4NzdjNmVhMzE0NmRhYTQzZGFkNmJjMTcwNmU2YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U29jaWFsIEZpbmFuY2UgTHRkIChOZXdjYXN0bGUpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jMjVmYTM0N2RiN2U0OTlkYjU5ODlkZTE1M2NlMjM1Ni5zZXRDb250ZW50KGh0bWxfYjUxODc3YzZlYTMxNDZkYWE0M2RhZDZiYzE3MDZlNmEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZmQzMjU4NGE1MzlkNDAyZmI1MjYzOGY4NGIxMmJlOTAuYmluZFBvcHVwKHBvcHVwX2MyNWZhMzQ3ZGI3ZTQ5OWRiNTk4OWRlMTUzY2UyMzU2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mMDM4N2E1N2NiOGQ0MDgzYTEyZjQxNGExZDEzMjEzNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjUwNzM1MDksLTAuMTI3NzU4M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjNmMDgwZjk4NTdhNGFhNjk0NDk2MThlZDFkZmQwNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODZiNDkxZTg3NmY4NDdhZThlN2ZkODE5YzlhODhjMDQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNGFmNGU2YWNmMmQ3NGI4Mjg0MmI1MjU2OTI2MmYyYTEgPSAkKCc8ZGl2IGlkPSJodG1sXzRhZjRlNmFjZjJkNzRiODI4NDJiNTI1NjkyNjJmMmExIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Xb3JraW5nIFdlbGwgVHJ1c3QgKExvbmRvbiwgVW5pdGVkIEtpbmdkb20pPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84NmI0OTFlODc2Zjg0N2FlOGU3ZmQ4MTljOWE4OGMwNC5zZXRDb250ZW50KGh0bWxfNGFmNGU2YWNmMmQ3NGI4Mjg0MmI1MjU2OTI2MmYyYTEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjAzODdhNTdjYjhkNDA4M2ExMmY0MTRhMWQxMzIxMzcuYmluZFBvcHVwKHBvcHVwXzg2YjQ5MWU4NzZmODQ3YWU4ZTdmZDgxOWM5YTg4YzA0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wZjQ0ODA0NWQ2YzY0MjQ2OTZhMmFlNzQxMDc0NDQ4NCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzU1Ljk1MzI1MiwtMy4xODgyNjddLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2IzZjA4MGY5ODU3YTRhYTY5NDQ5NjE4ZWQxZGZkMDc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzNlY2Q4NjRmMTAyYjQ4YmI5N2QwYzZiNjk1ZjE0NDczID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJjMTg4MzY2YmQ4YzRhOWZhOWQ2OTE3ZmM3ZjA0MDY3ID0gJCgnPGRpdiBpZD0iaHRtbF8yYzE4ODM2NmJkOGM0YTlmYTlkNjkxN2ZjN2YwNDA2NyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UmVtYWRlIGluIEVkaW5idXJnaCAoRWRpbmJ1cmdoKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfM2VjZDg2NGYxMDJiNDhiYjk3ZDBjNmI2OTVmMTQ0NzMuc2V0Q29udGVudChodG1sXzJjMTg4MzY2YmQ4YzRhOWZhOWQ2OTE3ZmM3ZjA0MDY3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzBmNDQ4MDQ1ZDZjNjQyNDY5NmEyYWU3NDEwNzQ0NDg0LmJpbmRQb3B1cChwb3B1cF8zZWNkODY0ZjEwMmI0OGJiOTdkMGM2YjY5NWYxNDQ3Myk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMGNmYTE3MzhiODZjNGEyY2IzMzc0NTg2NGQ1Zjg0ZWUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS44NjQyNDQ5LC0yLjIzODE1Nl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjNmMDgwZjk4NTdhNGFhNjk0NDk2MThlZDFkZmQwNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDhjOTI0NzA4YmE3NGYzMWJjYzI2ODhkOGI4MGNmNjUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODcyOTQwYmYyMmZlNDZjOGFhNzdhYWU1MGEzMDAxNDIgPSAkKCc8ZGl2IGlkPSJodG1sXzg3Mjk0MGJmMjJmZTQ2YzhhYTc3YWFlNTBhMzAwMTQyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SZWFkYXRob24gKEdsb3VjZXN0ZXIpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wOGM5MjQ3MDhiYTc0ZjMxYmNjMjY4OGQ4YjgwY2Y2NS5zZXRDb250ZW50KGh0bWxfODcyOTQwYmYyMmZlNDZjOGFhNzdhYWU1MGEzMDAxNDIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMGNmYTE3MzhiODZjNGEyY2IzMzc0NTg2NGQ1Zjg0ZWUuYmluZFBvcHVwKHBvcHVwXzA4YzkyNDcwOGJhNzRmMzFiY2MyNjg4ZDhiODBjZjY1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kZGFkMzQ1MTQwMWI0Njk4ODY3NTMwOThkZjkyNTMyYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUyLjk1NDc4MzE5OTk5OTk5LC0xLjE1ODEwODZdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2IzZjA4MGY5ODU3YTRhYTY5NDQ5NjE4ZWQxZGZkMDc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzMyMmQ0YzQ2NWQwYjQ0YTViZThkN2RmOTVmODAyOWQyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzIyM2Q1MWRkMzgyMzQxMjZiODRhMTE3OTFkMjE0MDRhID0gJCgnPGRpdiBpZD0iaHRtbF8yMjNkNTFkZDM4MjM0MTI2Yjg0YTExNzkxZDIxNDA0YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tm90dGluZ2hhbSBDb21tdW5pdHkgSG91c2luZyBBc3NvY2lhdGlvbiAoTm90dGluZ2hhbSk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzMyMmQ0YzQ2NWQwYjQ0YTViZThkN2RmOTVmODAyOWQyLnNldENvbnRlbnQoaHRtbF8yMjNkNTFkZDM4MjM0MTI2Yjg0YTExNzkxZDIxNDA0YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kZGFkMzQ1MTQwMWI0Njk4ODY3NTMwOThkZjkyNTMyYi5iaW5kUG9wdXAocG9wdXBfMzIyZDRjNDY1ZDBiNDRhNWJlOGQ3ZGY5NWY4MDI5ZDIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQ0YzRjMGI4MGNhYTQ3NDhiMTdiYTIxNzk0ZDkxZTQ2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTUuOTUzMjUyLC0zLjE4ODI2N10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjNmMDgwZjk4NTdhNGFhNjk0NDk2MThlZDFkZmQwNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmIwNDIyZWJlZjY3NGRiYzhiZmFiMmNlMjA4YTM0MjMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzJkYTFmNDQ1Njc5NDE1NDhmMjY3MDc1ZTY0ZjFhZjcgPSAkKCc8ZGl2IGlkPSJodG1sX2MyZGExZjQ0NTY3OTQxNTQ4ZjI2NzA3NWU2NGYxYWY3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FZGluYnVyZ2ggTGVpc3VyZSAoRWRpbmJ1cmdoKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYmIwNDIyZWJlZjY3NGRiYzhiZmFiMmNlMjA4YTM0MjMuc2V0Q29udGVudChodG1sX2MyZGExZjQ0NTY3OTQxNTQ4ZjI2NzA3NWU2NGYxYWY3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQ0YzRjMGI4MGNhYTQ3NDhiMTdiYTIxNzk0ZDkxZTQ2LmJpbmRQb3B1cChwb3B1cF9iYjA0MjJlYmVmNjc0ZGJjOGJmYWIyY2UyMDhhMzQyMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzNkMjE0Y2VhZDEwNDEyMGE5MWVkYjc1NTkxNzY2YTYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41NDU5MjY5LDAuNzA3NzEyM10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjNmMDgwZjk4NTdhNGFhNjk0NDk2MThlZDFkZmQwNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDJjYjM4OWNhNDAxNDcyMzgzMjY2ZTZiY2M4YmY2MzcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzUxMGQzNTJjZDM5NGJkMGFlODgwOTNjMzg3MGMyNGMgPSAkKCc8ZGl2IGlkPSJodG1sXzM1MTBkMzUyY2QzOTRiZDBhZTg4MDkzYzM4NzBjMjRjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CbGFkZSBFZHVjYXRpb24gKFNvdXRoZW5kLW9uLVNlYSk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQyY2IzODljYTQwMTQ3MjM4MzI2NmU2YmNjOGJmNjM3LnNldENvbnRlbnQoaHRtbF8zNTEwZDM1MmNkMzk0YmQwYWU4ODA5M2MzODcwYzI0Yyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jM2QyMTRjZWFkMTA0MTIwYTkxZWRiNzU1OTE3NjZhNi5iaW5kUG9wdXAocG9wdXBfNDJjYjM4OWNhNDAxNDcyMzgzMjY2ZTZiY2M4YmY2MzcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2M3MTIwYzVjYTgzZTQxYmQ4YzJmNDk2NzFhYjdjN2RhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuMDc4MTU5OSwtNC4wNTgzMzhdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2IzZjA4MGY5ODU3YTRhYTY5NDQ5NjE4ZWQxZGZkMDc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzI3NWY2MmZjNjAxZTRmNzRhNjU3MmUwN2FkNGM0NTkyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzZkNTBjMjM3NDg0MjRmNjZhN2ZmMTczMjk5MmFjMWUzID0gJCgnPGRpdiBpZD0iaHRtbF82ZDUwYzIzNzQ4NDI0ZjY2YTdmZjE3MzI5OTJhYzFlMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U291dGggV2VzdCBGYW1pbHkgU3VwcG9ydCAoQmFybnN0YXBsZSk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzI3NWY2MmZjNjAxZTRmNzRhNjU3MmUwN2FkNGM0NTkyLnNldENvbnRlbnQoaHRtbF82ZDUwYzIzNzQ4NDI0ZjY2YTdmZjE3MzI5OTJhYzFlMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jNzEyMGM1Y2E4M2U0MWJkOGMyZjQ5NjcxYWI3YzdkYS5iaW5kUG9wdXAocG9wdXBfMjc1ZjYyZmM2MDFlNGY3NGE2NTcyZTA3YWQ0YzQ1OTIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Y3YzM4ZGJhNTUzZTQ1MmViOWEwOGMzOWM4NDAwNTczID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNTIwMjYwNjk5OTk5OTksLTAuMDI5MzM5Nl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjNmMDgwZjk4NTdhNGFhNjk0NDk2MThlZDFkZmQwNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDg2MTExODUzMGJhNGQyZWJiZDc3MTAxZGY1NzI4MjMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzJhZDZhZGM5MmZiNGM4OWFmNzQ4ZDMzZjkwZGY4MzAgPSAkKCc8ZGl2IGlkPSJodG1sX2MyYWQ2YWRjOTJmYjRjODlhZjc0OGQzM2Y5MGRmODMwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5ZZWFyIEhlcmUgKFRvd2VyIEhhbWxldHMsIExvbmRvbik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQ4NjExMTg1MzBiYTRkMmViYmQ3NzEwMWRmNTcyODIzLnNldENvbnRlbnQoaHRtbF9jMmFkNmFkYzkyZmI0Yzg5YWY3NDhkMzNmOTBkZjgzMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mN2MzOGRiYTU1M2U0NTJlYjlhMDhjMzljODQwMDU3My5iaW5kUG9wdXAocG9wdXBfNDg2MTExODUzMGJhNGQyZWJiZDc3MTAxZGY1NzI4MjMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ZlNjNiYjRhYzg3MTQ0NWI4NzdjOWExZjNmNjljOGI5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTIuMjA1MzM3LDAuMTIxODE3XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9iM2YwODBmOTg1N2E0YWE2OTQ0OTYxOGVkMWRmZDA3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83MmRhOTYzYjE2MmE0YTZmODM0NDU5NzZkZjI4ZWI4NiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83MzI1YmNiYmFlZDU0NjA2YWMyYzI3MjIzNGY5NjEyYSA9ICQoJzxkaXYgaWQ9Imh0bWxfNzMyNWJjYmJhZWQ1NDYwNmFjMmMyNzIyMzRmOTYxMmEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJlZCBCYWxsb29uIExlYXJuZXIgQ2VudHJlIEdyb3VwIChDYW1icmlkZ2UpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83MmRhOTYzYjE2MmE0YTZmODM0NDU5NzZkZjI4ZWI4Ni5zZXRDb250ZW50KGh0bWxfNzMyNWJjYmJhZWQ1NDYwNmFjMmMyNzIyMzRmOTYxMmEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZmU2M2JiNGFjODcxNDQ1Yjg3N2M5YTFmM2Y2OWM4YjkuYmluZFBvcHVwKHBvcHVwXzcyZGE5NjNiMTYyYTRhNmY4MzQ0NTk3NmRmMjhlYjg2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85OGU4MzkxYzliMjk0YWMyOTA5NjkwOWFkOTFmNWY1YyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjUwNzM1MDksLTAuMTI3NzU4M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjNmMDgwZjk4NTdhNGFhNjk0NDk2MThlZDFkZmQwNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmQ3NzA5OTBiZWIzNDY0OWI3MWY4MTE3YmYxYzI4ZjYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmJiMWNhMTg5ODU5NDZlNmI0ZjRiZTZiNDJmZDRhYzggPSAkKCc8ZGl2IGlkPSJodG1sX2ZiYjFjYTE4OTg1OTQ2ZTZiNGY0YmU2YjQyZmQ0YWM4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Db21tb24gVmlzaW9uIChDb1ZpKSAoTG9uZG9uKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYmQ3NzA5OTBiZWIzNDY0OWI3MWY4MTE3YmYxYzI4ZjYuc2V0Q29udGVudChodG1sX2ZiYjFjYTE4OTg1OTQ2ZTZiNGY0YmU2YjQyZmQ0YWM4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzk4ZTgzOTFjOWIyOTRhYzI5MDk2OTA5YWQ5MWY1ZjVjLmJpbmRQb3B1cChwb3B1cF9iZDc3MDk5MGJlYjM0NjQ5YjcxZjgxMTdiZjFjMjhmNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDllY2RmMDNkNTRlNDc1ZDk2OWY3NjY2OWU1YTM0M2UgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41MDczNTA5LC0wLjEyNzc1ODNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2IzZjA4MGY5ODU3YTRhYTY5NDQ5NjE4ZWQxZGZkMDc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzIwMzFjODlhOGE5YjQ3Y2FiY2U5ZmY0MzMwZTkyM2Y3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzIzNmI0MGY5OGM3NzQyOGViZDk1NTE5MmQ5NTE2NDc2ID0gJCgnPGRpdiBpZD0iaHRtbF8yMzZiNDBmOThjNzc0MjhlYmQ5NTUxOTJkOTUxNjQ3NiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3QgR2lsZXMgVHJ1c3QgKExvbmRvbik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzIwMzFjODlhOGE5YjQ3Y2FiY2U5ZmY0MzMwZTkyM2Y3LnNldENvbnRlbnQoaHRtbF8yMzZiNDBmOThjNzc0MjhlYmQ5NTUxOTJkOTUxNjQ3Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80OWVjZGYwM2Q1NGU0NzVkOTY5Zjc2NjY5ZTVhMzQzZS5iaW5kUG9wdXAocG9wdXBfMjAzMWM4OWE4YTliNDdjYWJjZTlmZjQzMzBlOTIzZjcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg5NDgxZjIwYTY5ZDQ4ZjU4ZmQzY2JlYjYxOWI5MGM4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNTA3MzUwOSwtMC4xMjc3NTgzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9iM2YwODBmOTg1N2E0YWE2OTQ0OTYxOGVkMWRmZDA3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82NzMxODllYjQzOTM0ZTkyYTBmMzhkNjE1ODBkZWM3OSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zNDdmNWFlYTcxNzg0YjYzYjNjMWJhMDk5ZTgzNGUyNiA9ICQoJzxkaXYgaWQ9Imh0bWxfMzQ3ZjVhZWE3MTc4NGI2M2IzYzFiYTA5OWU4MzRlMjYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1vbWVudHVtIFdvcmxkIENJQyAoTG9uZG9uKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjczMTg5ZWI0MzkzNGU5MmEwZjM4ZDYxNTgwZGVjNzkuc2V0Q29udGVudChodG1sXzM0N2Y1YWVhNzE3ODRiNjNiM2MxYmEwOTllODM0ZTI2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzg5NDgxZjIwYTY5ZDQ4ZjU4ZmQzY2JlYjYxOWI5MGM4LmJpbmRQb3B1cChwb3B1cF82NzMxODllYjQzOTM0ZTkyYTBmMzhkNjE1ODBkZWM3OSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzY0NjVjYTMxNjQ5NGMxOWEwOWY0NDAzMjg0NzdhYTMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFsyMC41OTM2ODQsNzguOTYyODhdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2IzZjA4MGY5ODU3YTRhYTY5NDQ5NjE4ZWQxZGZkMDc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzAzYTBiOWRmYzY3YTQ1ODA4NjhlNjhkMGMxZmNjNTFjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBlZWY5NDQyMzNhMTRiMzM5NmRkMWRmOWZiYzdhN2QzID0gJCgnPGRpdiBpZD0iaHRtbF8wZWVmOTQ0MjMzYTE0YjMzOTZkZDFkZjlmYmM3YTdkMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGVvbmFyZCBDaGVzaGlyZSBESXNhYmlsaXR5IChJbmRpYSk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzAzYTBiOWRmYzY3YTQ1ODA4NjhlNjhkMGMxZmNjNTFjLnNldENvbnRlbnQoaHRtbF8wZWVmOTQ0MjMzYTE0YjMzOTZkZDFkZjlmYmM3YTdkMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jNjQ2NWNhMzE2NDk0YzE5YTA5ZjQ0MDMyODQ3N2FhMy5iaW5kUG9wdXAocG9wdXBfMDNhMGI5ZGZjNjdhNDU4MDg2OGU2OGQwYzFmY2M1MWMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzIwODdkNzhhN2RkYjQ3NTFhNzExNjg4MGRiYTYzZTY4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTQuOTc4MjUyLC0xLjYxNzc4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9iM2YwODBmOTg1N2E0YWE2OTQ0OTYxOGVkMWRmZDA3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84YTQ1MjkwMTc4Nzk0ZTg2OGExZDg1ZmUxZjM1NGJjOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kZTMzYmJhZTg2YWM0ZThiYjViNTE5NjVmN2YxMzg1ZCA9ICQoJzxkaXYgaWQ9Imh0bWxfZGUzM2JiYWU4NmFjNGU4YmI1YjUxOTY1ZjdmMTM4NWQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmNoaXBjaGFzZSBob3VzZSBwaXAgcHJvZ3JhbW1lIHBlcmN5IGhlZGxleSBmb3VuZGF0aW9uIChwZXJjeSBoZWRsZXkgZm91bmRhdGlvbiBuZXdjYXN0bGUgdXBvbiB0eW5lKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOGE0NTI5MDE3ODc5NGU4NjhhMWQ4NWZlMWYzNTRiYzkuc2V0Q29udGVudChodG1sX2RlMzNiYmFlODZhYzRlOGJiNWI1MTk2NWY3ZjEzODVkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzIwODdkNzhhN2RkYjQ3NTFhNzExNjg4MGRiYTYzZTY4LmJpbmRQb3B1cChwb3B1cF84YTQ1MjkwMTc4Nzk0ZTg2OGExZDg1ZmUxZjM1NGJjOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDMyZTFmZTg2OWI0NDE4NjkxZGJjODc2MTZmNTVlYmIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1My44MDA3NTU0LC0xLjU0OTA3NzRdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2IzZjA4MGY5ODU3YTRhYTY5NDQ5NjE4ZWQxZGZkMDc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzZiZThjMjc3YWVkMDQ3YjZhZWZjMzY3OGM2ODViNGVkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NlMmZkNjdjOWViMjRhY2VhYTNhOWM1MGZhNzlkMTRiID0gJCgnPGRpdiBpZD0iaHRtbF9jZTJmZDY3YzllYjI0YWNlYWEzYTljNTBmYTc5ZDE0YiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WW9ya3NoaXJlIE1lbnRvcmluZyAoTGVlZHMgYW5kIEhhbGlmYXgpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82YmU4YzI3N2FlZDA0N2I2YWVmYzM2NzhjNjg1YjRlZC5zZXRDb250ZW50KGh0bWxfY2UyZmQ2N2M5ZWIyNGFjZWFhM2E5YzUwZmE3OWQxNGIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDMyZTFmZTg2OWI0NDE4NjkxZGJjODc2MTZmNTVlYmIuYmluZFBvcHVwKHBvcHVwXzZiZThjMjc3YWVkMDQ3YjZhZWZjMzY3OGM2ODViNGVkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81YmNmNWFiOWUxYjA0MzRiOWY2NTA2NjA1NzgxMWRmMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUzLjY0NTc5MiwtMS43ODUwMzVdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2IzZjA4MGY5ODU3YTRhYTY5NDQ5NjE4ZWQxZGZkMDc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzgxOWVlN2FlZjkyMTQ2ODk5ZDMyYTAxM2Q1Y2MyMWViID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ2NzQ0MTk1M2RiZDQ1Y2NhZjM2NGVjNzlmYjRjMGQ3ID0gJCgnPGRpdiBpZD0iaHRtbF80Njc0NDE5NTNkYmQ0NWNjYWYzNjRlYzc5ZmI0YzBkNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGVnYWN5IFNwb3J0IENJQyAoSHVkZGVyc2ZpZWxkKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODE5ZWU3YWVmOTIxNDY4OTlkMzJhMDEzZDVjYzIxZWIuc2V0Q29udGVudChodG1sXzQ2NzQ0MTk1M2RiZDQ1Y2NhZjM2NGVjNzlmYjRjMGQ3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzViY2Y1YWI5ZTFiMDQzNGI5ZjY1MDY2MDU3ODExZGYxLmJpbmRQb3B1cChwb3B1cF84MTllZTdhZWY5MjE0Njg5OWQzMmEwMTNkNWNjMjFlYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDZjMjllMGJlMzMzNDdmNzgwOWFjOTM5NzlhODZkZTUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1My41NzY4NjQ2OTk5OTk5OSwtMi40MjgyMTkyXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9iM2YwODBmOTg1N2E0YWE2OTQ0OTYxOGVkMWRmZDA3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jM2MxYjMwYWMwZjk0NjY3YTI5MzJhMTI5YzM2M2U1MSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82ZDBlOTY2MWFjZTc0YWVkYjJjZGFlNGE3ZGE1MTViNCA9ICQoJzxkaXYgaWQ9Imh0bWxfNmQwZTk2NjFhY2U3NGFlZGIyY2RhZTRhN2RhNTE1YjQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPndlbGwtZ29vZCB3YXRlciBhaWQgQ0lDIChCb2x0b24pPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jM2MxYjMwYWMwZjk0NjY3YTI5MzJhMTI5YzM2M2U1MS5zZXRDb250ZW50KGh0bWxfNmQwZTk2NjFhY2U3NGFlZGIyY2RhZTRhN2RhNTE1YjQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDZjMjllMGJlMzMzNDdmNzgwOWFjOTM5NzlhODZkZTUuYmluZFBvcHVwKHBvcHVwX2MzYzFiMzBhYzBmOTQ2NjdhMjkzMmExMjljMzYzZTUxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kZWVhMzI1Yzg4YzA0YzU2YWU0NWYwYTQwMWE5ZWQ5MSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjc5OTc2MywtNC43NDQwMDhdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2IzZjA4MGY5ODU3YTRhYTY5NDQ5NjE4ZWQxZGZkMDc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzFkY2ZhYzIwOTg1ZDRlYmZiZTZkZDZhMTk3MTQ5YjI0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzk2YWNlODE0OGNkZjQwZjc5ZTNlODEzZWY0NTE0YTNjID0gJCgnPGRpdiBpZD0iaHRtbF85NmFjZTgxNDhjZGY0MGY3OWUzZTgxM2VmNDUxNGEzYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UGVtYnJva2VzaGlyZSBMb2NhbCBBY3Rpb24gTmV0d29yayBmb3IgRW50ZXJwcmlzZSBhbmQgRGV2ZWxvcG1lbnQgKE5hcmJlcnRoKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMWRjZmFjMjA5ODVkNGViZmJlNmRkNmExOTcxNDliMjQuc2V0Q29udGVudChodG1sXzk2YWNlODE0OGNkZjQwZjc5ZTNlODEzZWY0NTE0YTNjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2RlZWEzMjVjODhjMDRjNTZhZTQ1ZjBhNDAxYTllZDkxLmJpbmRQb3B1cChwb3B1cF8xZGNmYWMyMDk4NWQ0ZWJmYmU2ZGQ2YTE5NzE0OWIyNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNWNkM2UzNzYxN2QxNDVhODk1YzMzNjUzM2Y5NjQwNTQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41MDczNTA5LC0wLjEyNzc1ODNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2IzZjA4MGY5ODU3YTRhYTY5NDQ5NjE4ZWQxZGZkMDc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzBjNWM3ZmYyZDBiOTQ3OTdhOWRjOTYzMzQ0ZWNkZDdlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E5MTBiMGFjNWFmOTQwZWU4OTZiNzNlODQxMWVkN2NmID0gJCgnPGRpdiBpZD0iaHRtbF9hOTEwYjBhYzVhZjk0MGVlODk2YjczZTg0MTFlZDdjZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UHJvamVjdHMgRm9yIEFsbCAoTG9uZG9uKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMGM1YzdmZjJkMGI5NDc5N2E5ZGM5NjMzNDRlY2RkN2Uuc2V0Q29udGVudChodG1sX2E5MTBiMGFjNWFmOTQwZWU4OTZiNzNlODQxMWVkN2NmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzVjZDNlMzc2MTdkMTQ1YTg5NWMzMzY1MzNmOTY0MDU0LmJpbmRQb3B1cChwb3B1cF8wYzVjN2ZmMmQwYjk0Nzk3YTlkYzk2MzM0NGVjZGQ3ZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODJlOGExN2YwYTQ3NDc3YzkxMzIzNjhmZmNiNWEyMDEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1My44MDA3NTU0LC0xLjU0OTA3NzRdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2IzZjA4MGY5ODU3YTRhYTY5NDQ5NjE4ZWQxZGZkMDc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzEzMWNmOGVjNjBkNTQ2YzM5NWJmNThhMDMyYjhmYTdjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJkYTBmYTcyNzM2ZTQ1YWQ4YWJiNzljNjM5MGJhZTBmID0gJCgnPGRpdiBpZD0iaHRtbF8yZGEwZmE3MjczNmU0NWFkOGFiYjc5YzYzOTBiYWUwZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T2Jsb25nIChMZWVkcyk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzEzMWNmOGVjNjBkNTQ2YzM5NWJmNThhMDMyYjhmYTdjLnNldENvbnRlbnQoaHRtbF8yZGEwZmE3MjczNmU0NWFkOGFiYjc5YzYzOTBiYWUwZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84MmU4YTE3ZjBhNDc0NzdjOTEzMjM2OGZmY2I1YTIwMS5iaW5kUG9wdXAocG9wdXBfMTMxY2Y4ZWM2MGQ1NDZjMzk1YmY1OGEwMzJiOGZhN2MpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzBjMDAyMDNhMjg2ZjRhMDA5ZWRmYWM0NDdlMDZlMmM0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTMuMzgxMTI4OTk5OTk5OTksLTEuNDcwMDg1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9iM2YwODBmOTg1N2E0YWE2OTQ0OTYxOGVkMWRmZDA3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lMjVhMmM1NTYxNTQ0ZWU5YTQ1MmY0NTc0YWQ1NmQ4OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81OWQ1ZjU3YjgyOWU0NTg4YTY1ZTBiMjk0ZjVlNzUwMyA9ICQoJzxkaXYgaWQ9Imh0bWxfNTlkNWY1N2I4MjllNDU4OGE2NWUwYjI5NGY1ZTc1MDMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJlY292ZXJ5IEVudGVycHJpc2VzIChTaGVmZmllbGQpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lMjVhMmM1NTYxNTQ0ZWU5YTQ1MmY0NTc0YWQ1NmQ4OC5zZXRDb250ZW50KGh0bWxfNTlkNWY1N2I4MjllNDU4OGE2NWUwYjI5NGY1ZTc1MDMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMGMwMDIwM2EyODZmNGEwMDllZGZhYzQ0N2UwNmUyYzQuYmluZFBvcHVwKHBvcHVwX2UyNWEyYzU1NjE1NDRlZTlhNDUyZjQ1NzRhZDU2ZDg4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83ZTM3NTRjMDI4ODc0YWQyYWEyMjQ0OWJjYjk3ODVhYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjQ1NDUxMywtMi41ODc5MV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjNmMDgwZjk4NTdhNGFhNjk0NDk2MThlZDFkZmQwNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGM2ZGFjYTNiOWU4NDE1OTkxZGU1MjcxNDk1ODBhNTAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzExMzY3OWNmOTg1NDdhYWJkNzYxNmFmNjFmMTg5YTkgPSAkKCc8ZGl2IGlkPSJodG1sXzMxMTM2NzljZjk4NTQ3YWFiZDc2MTZhZjYxZjE4OWE5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Lbm93bGUgV2VzdCBNZWRpYSBDZW50cmUgKEJyaXN0b2wpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kYzZkYWNhM2I5ZTg0MTU5OTFkZTUyNzE0OTU4MGE1MC5zZXRDb250ZW50KGh0bWxfMzExMzY3OWNmOTg1NDdhYWJkNzYxNmFmNjFmMTg5YTkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfN2UzNzU0YzAyODg3NGFkMmFhMjI0NDliY2I5Nzg1YWEuYmluZFBvcHVwKHBvcHVwX2RjNmRhY2EzYjllODQxNTk5MWRlNTI3MTQ5NTgwYTUwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iN2M1MTNkNmIwNjA0YzJiYTc1ZmNiYzI2YzQxMDMzMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjU0NjUwNjMsLTAuMTA1ODA1OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjNmMDgwZjk4NTdhNGFhNjk0NDk2MThlZDFkZmQwNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGJjNjBiODEwZGJiNGJhYjk1YTdjZDFmMmU2MDI0ZDggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTY3MjE2YTZjYjYzNDA0Njg1NWIyZDIyZTYxNDMxYjUgPSAkKCc8ZGl2IGlkPSJodG1sXzE2NzIxNmE2Y2I2MzQwNDY4NTViMmQyMmU2MTQzMWI1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Mb25kb24gVmlsbGFnZSBOZXR3b3JrIChJc2xpbmd0b246IExvbmRvbik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RiYzYwYjgxMGRiYjRiYWI5NWE3Y2QxZjJlNjAyNGQ4LnNldENvbnRlbnQoaHRtbF8xNjcyMTZhNmNiNjM0MDQ2ODU1YjJkMjJlNjE0MzFiNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iN2M1MTNkNmIwNjA0YzJiYTc1ZmNiYzI2YzQxMDMzMS5iaW5kUG9wdXAocG9wdXBfZGJjNjBiODEwZGJiNGJhYjk1YTdjZDFmMmU2MDI0ZDgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2U1NWRlNjA4ZDk1MzRiYjhiOWUzOTQ0MGVkMWEzYWNhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTUuMDQ2Mzg5LC0xLjQ1MTI5ODldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2IzZjA4MGY5ODU3YTRhYTY5NDQ5NjE4ZWQxZGZkMDc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ZjNWZjZmFjNTA5ZDQ1NTk4MWM1ZTI1ODRkNGE3OTFhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ZjMGI0ZWRjNDZkYjQ5ZmQ4ODYyNDRlNDZmM2NkZjhhID0gJCgnPGRpdiBpZD0iaHRtbF9mYzBiNGVkYzQ2ZGI0OWZkODg2MjQ0ZTQ2ZjNjZGY4YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UGFyayBWaWV3IFByb2plY3QgKFdoaXRsZXkgQmF5LCBOb3J0aCBUeW5lc2lkZSwgVHluZSAmYW1wOyBXZWFyKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZmM1ZmNmYWM1MDlkNDU1OTgxYzVlMjU4NGQ0YTc5MWEuc2V0Q29udGVudChodG1sX2ZjMGI0ZWRjNDZkYjQ5ZmQ4ODYyNDRlNDZmM2NkZjhhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2U1NWRlNjA4ZDk1MzRiYjhiOWUzOTQ0MGVkMWEzYWNhLmJpbmRQb3B1cChwb3B1cF9mYzVmY2ZhYzUwOWQ0NTU5ODFjNWUyNTg0ZDRhNzkxYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNGYxZWNhMGIyMjQ4NDExODk1MWIxZjZhYzZkMmI4YmIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1NS44NjQyMzcsLTQuMjUxODA2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9iM2YwODBmOTg1N2E0YWE2OTQ0OTYxOGVkMWRmZDA3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wNjQ2ODZiYzFlZmY0MTM2YTMxYzllMDNjZjM2ZjdiZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81MDkwOGQ4OGQwYmE0MDAzYjZlMzljYzE5MGQ5ODdjMiA9ICQoJzxkaXYgaWQ9Imh0bWxfNTA5MDhkODhkMGJhNDAwM2I2ZTM5Y2MxOTBkOTg3YzIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNpbW9uIENvbW11bml0eSBTY290bGFuZCAoR2xhc2dvdyk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA2NDY4NmJjMWVmZjQxMzZhMzFjOWUwM2NmMzZmN2JmLnNldENvbnRlbnQoaHRtbF81MDkwOGQ4OGQwYmE0MDAzYjZlMzljYzE5MGQ5ODdjMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80ZjFlY2EwYjIyNDg0MTE4OTUxYjFmNmFjNmQyYjhiYi5iaW5kUG9wdXAocG9wdXBfMDY0Njg2YmMxZWZmNDEzNmEzMWM5ZTAzY2YzNmY3YmYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NlYTgwYjI4YWNmYjRhOGRiY2JmMjM3MWM4NzI1ZGMzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNTA3MzUwOSwtMC4xMjc3NTgzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9iM2YwODBmOTg1N2E0YWE2OTQ0OTYxOGVkMWRmZDA3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lMzZmMDFhZTE0OGI0Y2Y5YmVmOTlkZWJmNjA5MWUwOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iZDgxMDI1OTc0ZDA0Zjg4YmY1MzZhMDNhOGM2NTgzMiA9ICQoJzxkaXYgaWQ9Imh0bWxfYmQ4MTAyNTk3NGQwNGY4OGJmNTM2YTAzYThjNjU4MzIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFjdGlvbiBmb3IgU3RhbW1lcmluZyBDaGlsZHJlbiAoTG9uZG9uKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTM2ZjAxYWUxNDhiNGNmOWJlZjk5ZGViZjYwOTFlMDkuc2V0Q29udGVudChodG1sX2JkODEwMjU5NzRkMDRmODhiZjUzNmEwM2E4YzY1ODMyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2NlYTgwYjI4YWNmYjRhOGRiY2JmMjM3MWM4NzI1ZGMzLmJpbmRQb3B1cChwb3B1cF9lMzZmMDFhZTE0OGI0Y2Y5YmVmOTlkZWJmNjA5MWUwOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjBmNTk5NjgyMGQ0NGUwNWI1M2ZlZmUwMWFkY2U5ZDggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1NS45NTMyNTIsLTMuMTg4MjY3XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9iM2YwODBmOTg1N2E0YWE2OTQ0OTYxOGVkMWRmZDA3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yMTQ5MmI4MGVhMWQ0YTllOGEyMDFhYWFkMTM3MTk2YiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kODA3OWQxOTRlMzU0NjZiOWQ4MDNkMGY4MTE3YTUxMSA9ICQoJzxkaXYgaWQ9Imh0bWxfZDgwNzlkMTk0ZTM1NDY2YjlkODAzZDBmODExN2E1MTEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlN0cmVldHdvcmsgVUsgKEVkaW5idXJnaCk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzIxNDkyYjgwZWExZDRhOWU4YTIwMWFhYWQxMzcxOTZiLnNldENvbnRlbnQoaHRtbF9kODA3OWQxOTRlMzU0NjZiOWQ4MDNkMGY4MTE3YTUxMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mMGY1OTk2ODIwZDQ0ZTA1YjUzZmVmZTAxYWRjZTlkOC5iaW5kUG9wdXAocG9wdXBfMjE0OTJiODBlYTFkNGE5ZThhMjAxYWFhZDEzNzE5NmIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JiNmVkZGVkYjdlODQxZGNiNWFkZWZiYzY0NDRlZDM1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTAuNzY4MDM1LDAuMjkwNDcyXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9iM2YwODBmOTg1N2E0YWE2OTQ0OTYxOGVkMWRmZDA3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mMmE0YTVhN2M5OGM0OTE5ODA0YzUwNjcxNjI5YmRmNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wYzg0MjFlNGY3MjI0ODc3YjIwM2QxMjA2NDk2MmU4MiA9ICQoJzxkaXYgaWQ9Imh0bWxfMGM4NDIxZTRmNzIyNDg3N2IyMDNkMTIwNjQ5NjJlODIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlRoZSBXYXlmaW5kZXIgR3JvdXAgQ0lDIChFYXN0Ym91cm5lKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjJhNGE1YTdjOThjNDkxOTgwNGM1MDY3MTYyOWJkZjYuc2V0Q29udGVudChodG1sXzBjODQyMWU0ZjcyMjQ4NzdiMjAzZDEyMDY0OTYyZTgyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2JiNmVkZGVkYjdlODQxZGNiNWFkZWZiYzY0NDRlZDM1LmJpbmRQb3B1cChwb3B1cF9mMmE0YTVhN2M5OGM0OTE5ODA0YzUwNjcxNjI5YmRmNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfY2Y0M2EzM2NjNGQ2NDZjNjhmOGQ5YTk4MDIzY2VjMDUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1Ni4yMDA4NDE5OTk5OTk5OSwtMy4xNTk4Nl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjNmMDgwZjk4NTdhNGFhNjk0NDk2MThlZDFkZmQwNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmIyNDRkMzNhMmY1NGE0ZGI1ZTMzMDQ5MThhM2I4Y2QgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjZkYWE3NTNlMTVhNDgxNWFjZTQ4OTg4NzI5NTZjNTIgPSAkKCc8ZGl2IGlkPSJodG1sX2I2ZGFhNzUzZTE1YTQ4MTVhY2U0ODk4ODcyOTU2YzUyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DaXRpemVucyBBZHZpY2UgYW5kIFJpZ2h0cyBGaWZlIChHbGVucm90aGVzLCBGaWZlKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMmIyNDRkMzNhMmY1NGE0ZGI1ZTMzMDQ5MThhM2I4Y2Quc2V0Q29udGVudChodG1sX2I2ZGFhNzUzZTE1YTQ4MTVhY2U0ODk4ODcyOTU2YzUyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2NmNDNhMzNjYzRkNjQ2YzY4ZjhkOWE5ODAyM2NlYzA1LmJpbmRQb3B1cChwb3B1cF8yYjI0NGQzM2EyZjU0YTRkYjVlMzMwNDkxOGEzYjhjZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWNkN2U0MWU4ZTBjNDIzM2FlZDg1ZTIzM2EyNGUyOWYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41MDczNTA5LC0wLjEyNzc1ODNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2IzZjA4MGY5ODU3YTRhYTY5NDQ5NjE4ZWQxZGZkMDc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E1MWRlYzdiMTI2MzQ3ODA5YWYzM2IzMTBmOTc0YjYwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU5ZDNhZDQ5NzM3NjQ1ZDc5NDE1NTJkNTA0NjhjMjkxID0gJCgnPGRpdiBpZD0iaHRtbF81OWQzYWQ0OTczNzY0NWQ3OTQxNTUyZDUwNDY4YzI5MSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SmFyb2tlbG8gUHVibGljIEJlbmVmaXQgQXNzb2NpYXRpb24gKExvbmRvbik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E1MWRlYzdiMTI2MzQ3ODA5YWYzM2IzMTBmOTc0YjYwLnNldENvbnRlbnQoaHRtbF81OWQzYWQ0OTczNzY0NWQ3OTQxNTUyZDUwNDY4YzI5MSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85Y2Q3ZTQxZThlMGM0MjMzYWVkODVlMjMzYTI0ZTI5Zi5iaW5kUG9wdXAocG9wdXBfYTUxZGVjN2IxMjYzNDc4MDlhZjMzYjMxMGY5NzRiNjApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzY2NTQzZWRjZjUxMTQ5MzFiMzVmYzMzMTY2MzFhYWMzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTMuODAwNzU1NCwtMS41NDkwNzc0XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9iM2YwODBmOTg1N2E0YWE2OTQ0OTYxOGVkMWRmZDA3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iOTI2ODAyYmM3ZDg0MWE0YmU2OTVlZmQxYTczOGIxOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kNjA4YjEwYzc2YjI0ZDA1ODI2MWI5OTc3MDBkMzJkZSA9ICQoJzxkaXYgaWQ9Imh0bWxfZDYwOGIxMGM3NmIyNGQwNTgyNjFiOTk3NzAwZDMyZGUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkF0dGlnbyBDSUMgKExlZWRzKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjkyNjgwMmJjN2Q4NDFhNGJlNjk1ZWZkMWE3MzhiMTguc2V0Q29udGVudChodG1sX2Q2MDhiMTBjNzZiMjRkMDU4MjYxYjk5NzcwMGQzMmRlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzY2NTQzZWRjZjUxMTQ5MzFiMzVmYzMzMTY2MzFhYWMzLmJpbmRQb3B1cChwb3B1cF9iOTI2ODAyYmM3ZDg0MWE0YmU2OTVlZmQxYTczOGIxOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZmQzYTQ5Y2JjYmRjNGQzMzkwM2Y3MjE4NzczYjk1MmUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS40NDE0NTc5LC0wLjAxMTcwMDZdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2IzZjA4MGY5ODU3YTRhYTY5NDQ5NjE4ZWQxZGZkMDc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2VkZmI0YTVmNTQ3YzRkNzE4ZWFjYjRmY2M2NGJkNDM4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FmZjgyNzc4OGEwOTRiMTQ5N2QyMjUzN2E3MDY0YzczID0gJCgnPGRpdiBpZD0iaHRtbF9hZmY4Mjc3ODhhMDk0YjE0OTdkMjI1MzdhNzA2NGM3MyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmUgVG90YWxseSBZb3UgKExld2lzaGFtKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZWRmYjRhNWY1NDdjNGQ3MThlYWNiNGZjYzY0YmQ0Mzguc2V0Q29udGVudChodG1sX2FmZjgyNzc4OGEwOTRiMTQ5N2QyMjUzN2E3MDY0YzczKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2ZkM2E0OWNiY2JkYzRkMzM5MDNmNzIxODc3M2I5NTJlLmJpbmRQb3B1cChwb3B1cF9lZGZiNGE1ZjU0N2M0ZDcxOGVhY2I0ZmNjNjRiZDQzOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTY5YTY4ZGFhNjk5NDdkNGFkZmJjOGQ5ZTU1YmVmMjcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1My40ODA3NTkzLC0yLjI0MjYzMDVdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2IzZjA4MGY5ODU3YTRhYTY5NDQ5NjE4ZWQxZGZkMDc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzdmYTQ1YTIzODk3NDQ5MjQ4OGFmNjNlNzVmOWZmMWQ0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJiNjZmMjJlMDNlNTRlOGU4NjU1YzYzYTRhNWU0YjQ5ID0gJCgnPGRpdiBpZD0iaHRtbF8yYjY2ZjIyZTAzZTU0ZThlODY1NWM2M2E0YTVlNGI0OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+aW4ycmVjb3ZlcnkgQ0lDIChNYW5jaGVzdGVyKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfN2ZhNDVhMjM4OTc0NDkyNDg4YWY2M2U3NWY5ZmYxZDQuc2V0Q29udGVudChodG1sXzJiNjZmMjJlMDNlNTRlOGU4NjU1YzYzYTRhNWU0YjQ5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2U2OWE2OGRhYTY5OTQ3ZDRhZGZiYzhkOWU1NWJlZjI3LmJpbmRQb3B1cChwb3B1cF83ZmE0NWEyMzg5NzQ0OTI0ODhhZjYzZTc1ZjlmZjFkNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzI1MjQ3MzE1MmY5NGI0MGJhMmRhNDUyYmRjMmYzNGMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1My40MDgzNzE0LC0yLjk5MTU3MjZdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2IzZjA4MGY5ODU3YTRhYTY5NDQ5NjE4ZWQxZGZkMDc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQ2M2RlZjA5Y2U4NTQ4ZTE4YjI5NjBiMGNkNjVjYTFlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ZhMDY5OGY2NDEyODQ4NTdiMzg0Zjg5ZTk3MzgzOTdjID0gJCgnPGRpdiBpZD0iaHRtbF9mYTA2OThmNjQxMjg0ODU3YjM4NGY4OWU5NzM4Mzk3YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RGVzaXJlIGFuZCBJbnNwaXJlIChMaXZlcnBvb2wpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80NjNkZWYwOWNlODU0OGUxOGIyOTYwYjBjZDY1Y2ExZS5zZXRDb250ZW50KGh0bWxfZmEwNjk4ZjY0MTI4NDg1N2IzODRmODllOTczODM5N2MpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzI1MjQ3MzE1MmY5NGI0MGJhMmRhNDUyYmRjMmYzNGMuYmluZFBvcHVwKHBvcHVwXzQ2M2RlZjA5Y2U4NTQ4ZTE4YjI5NjBiMGNkNjVjYTFlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zNTQzMWZhY2ZiYmE0ZGU3OGIyMjkwMTNiOTNjNDdjMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjUwNzM1MDksLTAuMTI3NzU4M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjNmMDgwZjk4NTdhNGFhNjk0NDk2MThlZDFkZmQwNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNWRiYzUyNzk2Yjg1NGQ2M2JiZDlmYjExM2FhOGNjOGIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmNiZmEyZTNlYTAwNGM1OGE5MzVkMjRjM2NhNTc0MzUgPSAkKCc8ZGl2IGlkPSJodG1sXzJjYmZhMmUzZWEwMDRjNThhOTM1ZDI0YzNjYTU3NDM1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ub3dlciBIYW1sZXRzIENvbW11bml0eSBUcmFuc3BvcnQgKExvbmRvbik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzVkYmM1Mjc5NmI4NTRkNjNiYmQ5ZmIxMTNhYThjYzhiLnNldENvbnRlbnQoaHRtbF8yY2JmYTJlM2VhMDA0YzU4YTkzNWQyNGMzY2E1NzQzNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zNTQzMWZhY2ZiYmE0ZGU3OGIyMjkwMTNiOTNjNDdjMy5iaW5kUG9wdXAocG9wdXBfNWRiYzUyNzk2Yjg1NGQ2M2JiZDlmYjExM2FhOGNjOGIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzdiMWM1NzJmZGI5OTQyMmU5ZWYxMmI2NGUxMjg3YTNmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTIuNTM2MTY3NCwtMi4wMTA3OTNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2IzZjA4MGY5ODU3YTRhYTY5NDQ5NjE4ZWQxZGZkMDc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzc1OWVkNjk5NDg4YjQ3ZjdhZDlkY2FmMGIwNTYyN2YzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzE0NjYwYjBjMGRmZDQ4MWQ5NGZkMWYzMjg5ZDQzYTJlID0gJCgnPGRpdiBpZD0iaHRtbF8xNDY2MGIwYzBkZmQ0ODFkOTRmZDFmMzI4OWQ0M2EyZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QnVpbGRpbmcgQnJpZGdlcyBUcmFpbmluZyAoU2FuZHdlbGwgYW5kIEJpcm1pbmdoYW0pPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83NTllZDY5OTQ4OGI0N2Y3YWQ5ZGNhZjBiMDU2MjdmMy5zZXRDb250ZW50KGh0bWxfMTQ2NjBiMGMwZGZkNDgxZDk0ZmQxZjMyODlkNDNhMmUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfN2IxYzU3MmZkYjk5NDIyZTllZjEyYjY0ZTEyODdhM2YuYmluZFBvcHVwKHBvcHVwXzc1OWVkNjk5NDg4YjQ3ZjdhZDlkY2FmMGIwNTYyN2YzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xNGU3MDBjODhjOGU0M2YyYjlhNTZiM2M1Mjk4Y2ZmMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjYyMTQ0LC0zLjk0MzY0NTk5OTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjNmMDgwZjk4NTdhNGFhNjk0NDk2MThlZDFkZmQwNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOWVjZTJhZGIxOTQ3NDI2NGJkNTY1OGU0Yjc1ODVhY2QgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzVmZDBlNDg1MTliNDdkMTlhYTliZjhjZGRkMDQzYzcgPSAkKCc8ZGl2IGlkPSJodG1sX2M1ZmQwZTQ4NTE5YjQ3ZDE5YWE5YmY4Y2RkZDA0M2M3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5UaGUgTXVsbGFueSBGdW5kIChTd2Fuc2VhKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOWVjZTJhZGIxOTQ3NDI2NGJkNTY1OGU0Yjc1ODVhY2Quc2V0Q29udGVudChodG1sX2M1ZmQwZTQ4NTE5YjQ3ZDE5YWE5YmY4Y2RkZDA0M2M3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzE0ZTcwMGM4OGM4ZTQzZjJiOWE1NmIzYzUyOThjZmYyLmJpbmRQb3B1cChwb3B1cF85ZWNlMmFkYjE5NDc0MjY0YmQ1NjU4ZTRiNzU4NWFjZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTJmNGFkMjlhNWZhNDA3ODk4NDlmNzhiZDZkMTk2ZDcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41MDczNTA5LC0wLjEyNzc1ODNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2IzZjA4MGY5ODU3YTRhYTY5NDQ5NjE4ZWQxZGZkMDc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzliZTBhMmMxNjFiZDRlZmI4ZGJhZWUwOTNhZTY5Yjg4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzAwMTU4ZmYyYTZkOTRmYTA5M2IzN2RkNmNjNjdlYzdiID0gJCgnPGRpdiBpZD0iaHRtbF8wMDE1OGZmMmE2ZDk0ZmEwOTNiMzdkZDZjYzY3ZWM3YiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+R2luZ2VyYnJlYWQgKExvbmRvbik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzliZTBhMmMxNjFiZDRlZmI4ZGJhZWUwOTNhZTY5Yjg4LnNldENvbnRlbnQoaHRtbF8wMDE1OGZmMmE2ZDk0ZmEwOTNiMzdkZDZjYzY3ZWM3Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85MmY0YWQyOWE1ZmE0MDc4OTg0OWY3OGJkNmQxOTZkNy5iaW5kUG9wdXAocG9wdXBfOWJlMGEyYzE2MWJkNGVmYjhkYmFlZTA5M2FlNjliODgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2I5OWU1ZmJmOWQxNjQ3NzhhMWYwZjM3MmE1MzBiYjllID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNTA3MzUwOSwtMC4xMjc3NTgzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9iM2YwODBmOTg1N2E0YWE2OTQ0OTYxOGVkMWRmZDA3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hZDExM2I1ZTdlMTI0YzNhYWY3N2JkNzA2N2VmYjFlNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xMDBmODRhNmY0ZWM0M2NiYWZkYTE5OTllZWY0MjA1OSA9ICQoJzxkaXYgaWQ9Imh0bWxfMTAwZjg0YTZmNGVjNDNjYmFmZGExOTk5ZWVmNDIwNTkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlVuaXZlcnNpdHkgQ29sbGVnZSBMb25kb24gKFVDTCkgKExvbmRvbiAtIFVLKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYWQxMTNiNWU3ZTEyNGMzYWFmNzdiZDcwNjdlZmIxZTUuc2V0Q29udGVudChodG1sXzEwMGY4NGE2ZjRlYzQzY2JhZmRhMTk5OWVlZjQyMDU5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2I5OWU1ZmJmOWQxNjQ3NzhhMWYwZjM3MmE1MzBiYjllLmJpbmRQb3B1cChwb3B1cF9hZDExM2I1ZTdlMTI0YzNhYWY3N2JkNzA2N2VmYjFlNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfN2JmOGM0Y2I3MDliNGQ3MDgzNmNjNWFhYjFmNTBhM2MgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1Mi4yNDA0NzcsLTAuOTAyNjU2MDAwMDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjNmMDgwZjk4NTdhNGFhNjk0NDk2MThlZDFkZmQwNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTkwYzc1ODE0OGNkNDk2ZmE4MzgyN2ZhMWQxZDZhYmMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTc1NzkzM2M1OWQ5NDllZGE1YjUyNWYwYTYyMDFmNjMgPSAkKCc8ZGl2IGlkPSJodG1sX2E3NTc5MzNjNTlkOTQ5ZWRhNWI1MjVmMGE2MjAxZjYzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5UaGUgQ2hyeXNhbGlzIEZvdW5kYXRpb24gKE5vcnRoYW1wdG9uKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTkwYzc1ODE0OGNkNDk2ZmE4MzgyN2ZhMWQxZDZhYmMuc2V0Q29udGVudChodG1sX2E3NTc5MzNjNTlkOTQ5ZWRhNWI1MjVmMGE2MjAxZjYzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzdiZjhjNGNiNzA5YjRkNzA4MzZjYzVhYWIxZjUwYTNjLmJpbmRQb3B1cChwb3B1cF9lOTBjNzU4MTQ4Y2Q0OTZmYTgzODI3ZmExZDFkNmFiYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZmViNGZkMTkyYTg4NDMxNDllYzdmNjIzZDJlNWUxNWYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1Mi40MDY4MjIsLTEuNTE5NjkzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9iM2YwODBmOTg1N2E0YWE2OTQ0OTYxOGVkMWRmZDA3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xZGVmMTk5NjYxMGI0MGZmYWIzMDYzOGE1NWIyNDU5NCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zYTc0ZGY4MWNiYzE0YmJiODdhNzEyOTZhMDQyNTk5NSA9ICQoJzxkaXYgaWQ9Imh0bWxfM2E3NGRmODFjYmMxNGJiYjg3YTcxMjk2YTA0MjU5OTUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNlbnRyYWwgRW5nbGFuZCBMYXcgQ2VudHJlIChDb3ZlbnRyeSk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzFkZWYxOTk2NjEwYjQwZmZhYjMwNjM4YTU1YjI0NTk0LnNldENvbnRlbnQoaHRtbF8zYTc0ZGY4MWNiYzE0YmJiODdhNzEyOTZhMDQyNTk5NSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mZWI0ZmQxOTJhODg0MzE0OWVjN2Y2MjNkMmU1ZTE1Zi5iaW5kUG9wdXAocG9wdXBfMWRlZjE5OTY2MTBiNDBmZmFiMzA2MzhhNTViMjQ1OTQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzY0ZTI1ZWEzZGQ4ODRhZGRiZDk2NmE2MTNlYmE3NGQ0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTMuNjQ1NzkyLC0xLjc4NTAzNV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjNmMDgwZjk4NTdhNGFhNjk0NDk2MThlZDFkZmQwNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfY2QzODU5OTJlNzlkNDJlMzhjNzg3YWI5NDNlNmQ0OGUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTU3ODgxZDk4MDlkNGZkNDg0ZWEyZmY2OWMyMDM3NjIgPSAkKCc8ZGl2IGlkPSJodG1sXzU1Nzg4MWQ5ODA5ZDRmZDQ4NGVhMmZmNjljMjAzNzYyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Vbml2ZXJzaXR5IG9mIEh1ZGRlcnNmaWVsZCwgQ2VudHJlIG9mIFN1c3RhaW5hYmxlICZhbXA7IFJlc2lsaWVudCBDb21tdW5pdGllcyAoSHVkZGVyc2ZpZWxkKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2QzODU5OTJlNzlkNDJlMzhjNzg3YWI5NDNlNmQ0OGUuc2V0Q29udGVudChodG1sXzU1Nzg4MWQ5ODA5ZDRmZDQ4NGVhMmZmNjljMjAzNzYyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzY0ZTI1ZWEzZGQ4ODRhZGRiZDk2NmE2MTNlYmE3NGQ0LmJpbmRQb3B1cChwb3B1cF9jZDM4NTk5MmU3OWQ0MmUzOGM3ODdhYjk0M2U2ZDQ4ZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDZiNjNlOGVjOTVjNDc0NjlhNWNmNmU4OTNjMGIzMjEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1Mi45NTQ3ODMxOTk5OTk5OSwtMS4xNTgxMDg2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9iM2YwODBmOTg1N2E0YWE2OTQ0OTYxOGVkMWRmZDA3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85ZDUyMGM3YzRlYmM0YWFlOTExNjBlMTk1NzQwOGI4NSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xZWFiNTM4MTA1OGE0YTEyYjUxYmY1MDFhNjA2OTNkOSA9ICQoJzxkaXYgaWQ9Imh0bWxfMWVhYjUzODEwNThhNGExMmI1MWJmNTAxYTYwNjkzZDkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkhhcm1sZXNzIENJQyAoTm90dGluZ2hhbSk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzlkNTIwYzdjNGViYzRhYWU5MTE2MGUxOTU3NDA4Yjg1LnNldENvbnRlbnQoaHRtbF8xZWFiNTM4MTA1OGE0YTEyYjUxYmY1MDFhNjA2OTNkOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80NmI2M2U4ZWM5NWM0NzQ2OWE1Y2Y2ZTg5M2MwYjMyMS5iaW5kUG9wdXAocG9wdXBfOWQ1MjBjN2M0ZWJjNGFhZTkxMTYwZTE5NTc0MDhiODUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzk5YTdlNjE0YzRmZTQxNTA4N2MzN2NiNGQ4NTY4OGVlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNTA3MzUwOSwtMC4xMjc3NTgzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9iM2YwODBmOTg1N2E0YWE2OTQ0OTYxOGVkMWRmZDA3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xN2NjOGU3NmY1MmM0N2MwOGRmZTlkMzRjMGM2Y2NjOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kNTA2N2Y5ZDk4Mzg0YjQ3OThlZWM4YTllZWFiOTUxOSA9ICQoJzxkaXYgaWQ9Imh0bWxfZDUwNjdmOWQ5ODM4NGI0Nzk4ZWVjOGE5ZWVhYjk1MTkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJyaWRnZXMgU2VsZiBNYW5hZ2VtZW50IExpbWl0ZWQgKExvbmRvbik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE3Y2M4ZTc2ZjUyYzQ3YzA4ZGZlOWQzNGMwYzZjY2M5LnNldENvbnRlbnQoaHRtbF9kNTA2N2Y5ZDk4Mzg0YjQ3OThlZWM4YTllZWFiOTUxOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85OWE3ZTYxNGM0ZmU0MTUwODdjMzdjYjRkODU2ODhlZS5iaW5kUG9wdXAocG9wdXBfMTdjYzhlNzZmNTJjNDdjMDhkZmU5ZDM0YzBjNmNjYzkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzllMWVmZGUwMWNjYjRhMjY4ZDhiODdmOTI5NGYyYmEzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTMuNDA4MzcxNCwtMi45OTE1NzI2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9iM2YwODBmOTg1N2E0YWE2OTQ0OTYxOGVkMWRmZDA3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wZjc3MDlmODg3ZWU0NmMyYTRhMjgyMWVlM2E2ZWMxZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mY2U2Y2YwMTM4ODg0NDJiYmQ1YzRhMjNjYjcyMWIwMyA9ICQoJzxkaXYgaWQ9Imh0bWxfZmNlNmNmMDEzODg4NDQyYmJkNWM0YTIzY2I3MjFiMDMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZvdW5kYXRpb24gU2Nob29sIG9mIE1hcnRpYWwgQXJ0cyAoTGl2ZXJwb29sKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMGY3NzA5Zjg4N2VlNDZjMmE0YTI4MjFlZTNhNmVjMWUuc2V0Q29udGVudChodG1sX2ZjZTZjZjAxMzg4ODQ0MmJiZDVjNGEyM2NiNzIxYjAzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzllMWVmZGUwMWNjYjRhMjY4ZDhiODdmOTI5NGYyYmEzLmJpbmRQb3B1cChwb3B1cF8wZjc3MDlmODg3ZWU0NmMyYTRhMjgyMWVlM2E2ZWMxZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYmNmNTQzYmY4NDU0NGQwZjhhNDJiZjY2YjM4MTExMDQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41MDczNTA5LC0wLjEyNzc1ODNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2IzZjA4MGY5ODU3YTRhYTY5NDQ5NjE4ZWQxZGZkMDc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NjZWRlNWE4ZTQ4NDQwNmFiMjI4ZWIzNGM1ZWE3ZTk5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJiMjQxNWE0ZTg0MTQ2OTdhYzM1ODMyZTBiZDU4Yzk5ID0gJCgnPGRpdiBpZD0iaHRtbF8yYjI0MTVhNGU4NDE0Njk3YWMzNTgzMmUwYmQ1OGM5OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T3JjaGFyZCBIaWxsIENvbGxlZ2UgKExvbmRvbik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2NjZWRlNWE4ZTQ4NDQwNmFiMjI4ZWIzNGM1ZWE3ZTk5LnNldENvbnRlbnQoaHRtbF8yYjI0MTVhNGU4NDE0Njk3YWMzNTgzMmUwYmQ1OGM5OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iY2Y1NDNiZjg0NTQ0ZDBmOGE0MmJmNjZiMzgxMTEwNC5iaW5kUG9wdXAocG9wdXBfY2NlZGU1YThlNDg0NDA2YWIyMjhlYjM0YzVlYTdlOTkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzlkMzEyZGY1OTlkODRmNjA5ODViZjBiNDY2YjUzZGI4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTMuNDA4MzcxNCwtMi45OTE1NzI2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9iM2YwODBmOTg1N2E0YWE2OTQ0OTYxOGVkMWRmZDA3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85YTkyZjVmNjIwYjI0MWQ4ODMxYTliNGI5NzUyNmIzZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84MmVhZTNlYjFhOTI0MzFhODQ2YjljYzMzZWFlZGNhYSA9ICQoJzxkaXYgaWQ9Imh0bWxfODJlYWUzZWIxYTkyNDMxYTg0NmI5Y2MzM2VhZWRjYWEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1wb3dlciBQZW9wbGUgQ0lDIChMaXZlcnBvb2wpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85YTkyZjVmNjIwYjI0MWQ4ODMxYTliNGI5NzUyNmIzZC5zZXRDb250ZW50KGh0bWxfODJlYWUzZWIxYTkyNDMxYTg0NmI5Y2MzM2VhZWRjYWEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOWQzMTJkZjU5OWQ4NGY2MDk4NWJmMGI0NjZiNTNkYjguYmluZFBvcHVwKHBvcHVwXzlhOTJmNWY2MjBiMjQxZDg4MzFhOWI0Yjk3NTI2YjNkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jNjNkMzkyYTY2MjA0YjZlOTY1MTVkNGQ1YmZhYzlmNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjUwNzM1MDksLTAuMTI3NzU4M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjNmMDgwZjk4NTdhNGFhNjk0NDk2MThlZDFkZmQwNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTFhN2ZiMjMzOTMwNGNjODhlOWQ2ZTZlMTExOTZkZDAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNGE3Njc3ZjJjNjQyNGNkYTlmYzFiNzkyOGJiNjNkNjEgPSAkKCc8ZGl2IGlkPSJodG1sXzRhNzY3N2YyYzY0MjRjZGE5ZmMxYjc5MjhiYjYzZDYxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TdHJlZXRJbnZlc3QgKExvbmRvbik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2UxYTdmYjIzMzkzMDRjYzg4ZTlkNmU2ZTExMTk2ZGQwLnNldENvbnRlbnQoaHRtbF80YTc2NzdmMmM2NDI0Y2RhOWZjMWI3OTI4YmI2M2Q2MSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jNjNkMzkyYTY2MjA0YjZlOTY1MTVkNGQ1YmZhYzlmNS5iaW5kUG9wdXAocG9wdXBfZTFhN2ZiMjMzOTMwNGNjODhlOWQ2ZTZlMTExOTZkZDApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzVmNGQ2OGZjM2RkZTRlNzk4ZGJjMDBjYzFiMzJiMmIzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNjA0OTY3NDAwMDAwMDEsLTAuMDcyMjc4NV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjNmMDgwZjk4NTdhNGFhNjk0NDk2MThlZDFkZmQwNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZWNlMGM1MjA5YmIzNGNkYWFkY2MzZWE2NTJkMWM5ZjMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODhmZmJlYWQwZmExNGFiOTg0NzA3MjZjNzQ4NTY3MGEgPSAkKCc8ZGl2IGlkPSJodG1sXzg4ZmZiZWFkMGZhMTRhYjk4NDcwNzI2Yzc0ODU2NzBhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TbWFydCBTY2hvb2wgQ291bmNpbHMgKFRvdHRlbmhhbSwgTG9uZG9uKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZWNlMGM1MjA5YmIzNGNkYWFkY2MzZWE2NTJkMWM5ZjMuc2V0Q29udGVudChodG1sXzg4ZmZiZWFkMGZhMTRhYjk4NDcwNzI2Yzc0ODU2NzBhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzVmNGQ2OGZjM2RkZTRlNzk4ZGJjMDBjYzFiMzJiMmIzLmJpbmRQb3B1cChwb3B1cF9lY2UwYzUyMDliYjM0Y2RhYWRjYzNlYTY1MmQxYzlmMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTMzYjQ1ODBjM2UxNGVjMTk5NmY0MjJmZDdlYmFkNzIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS40NDE0NTc5LC0wLjAxMTcwMDZdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2IzZjA4MGY5ODU3YTRhYTY5NDQ5NjE4ZWQxZGZkMDc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg4NjE1MDkwODMxYjQ1NjVhYWE2YzNlZjljMDYxZTUyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzlhODUxNTBmMTNhMzQ3ZWZiNmU4OWRlM2E1NGIzY2IyID0gJCgnPGRpdiBpZD0iaHRtbF85YTg1MTUwZjEzYTM0N2VmYjZlODlkZTNhNTRiM2NiMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWVtb3J5VHJhY2tzIChMZXdpc2hhbSk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg4NjE1MDkwODMxYjQ1NjVhYWE2YzNlZjljMDYxZTUyLnNldENvbnRlbnQoaHRtbF85YTg1MTUwZjEzYTM0N2VmYjZlODlkZTNhNTRiM2NiMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hMzNiNDU4MGMzZTE0ZWMxOTk2ZjQyMmZkN2ViYWQ3Mi5iaW5kUG9wdXAocG9wdXBfODg2MTUwOTA4MzFiNDU2NWFhYTZjM2VmOWMwNjFlNTIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhlNGM3Zjg3MTBlYjRiN2ZiZjBhNjBiMTU5YzUyYjJiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTQuNTk3Mjg1MDAwMDAwMDEsLTUuOTMwMTJdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2IzZjA4MGY5ODU3YTRhYTY5NDQ5NjE4ZWQxZGZkMDc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NkZjlkYWZiNGNjZTRjN2ZhMzIwNDZjMDMwNmUxMjI0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFiYjg1MTJhOWU1YTQzZjY5ZDAwN2Q4ZWMyOGZkYmZjID0gJCgnPGRpdiBpZD0iaHRtbF8xYmI4NTEyYTllNWE0M2Y2OWQwMDdkOGVjMjhmZGJmYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RmFiTGFiIEJlbGZhc3QgKEJlbGZhc3QpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jZGY5ZGFmYjRjY2U0YzdmYTMyMDQ2YzAzMDZlMTIyNC5zZXRDb250ZW50KGh0bWxfMWJiODUxMmE5ZTVhNDNmNjlkMDA3ZDhlYzI4ZmRiZmMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOGU0YzdmODcxMGViNGI3ZmJmMGE2MGIxNTljNTJiMmIuYmluZFBvcHVwKHBvcHVwX2NkZjlkYWZiNGNjZTRjN2ZhMzIwNDZjMDMwNmUxMjI0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84YzJjNDcwZTk5N2E0YmYxODI0ZTA1YTNiMDY5OTY1ZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUzLjQ4MDc1OTMsLTIuMjQyNjMwNV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjNmMDgwZjk4NTdhNGFhNjk0NDk2MThlZDFkZmQwNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjVjMWJiOTJlY2EwNDRiYzhkYTNmYTJkZjk5ZTg0NzkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTVkNmY0ZmNmZTM0NDc3OWEzYTU5ZmFkNjM2YWM3YmMgPSAkKCc8ZGl2IGlkPSJodG1sX2E1ZDZmNGZjZmUzNDQ3NzlhM2E1OWZhZDYzNmFjN2JjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5RdWVlciBNZWRpYSAoTWFuY2hlc3Rlcik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY1YzFiYjkyZWNhMDQ0YmM4ZGEzZmEyZGY5OWU4NDc5LnNldENvbnRlbnQoaHRtbF9hNWQ2ZjRmY2ZlMzQ0Nzc5YTNhNTlmYWQ2MzZhYzdiYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84YzJjNDcwZTk5N2E0YmYxODI0ZTA1YTNiMDY5OTY1ZS5iaW5kUG9wdXAocG9wdXBfNjVjMWJiOTJlY2EwNDRiYzhkYTNmYTJkZjk5ZTg0NzkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NlMTQyOGI2YzM1ZjRjNjY4NmRjNDdhMjAzODMwZGJlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNTA3MzUwOSwtMC4xMjc3NTgzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9iM2YwODBmOTg1N2E0YWE2OTQ0OTYxOGVkMWRmZDA3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hMmU4N2IxMGIxNmI0NDVhYjAwZGEwOGRkOTJkZDA1NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jNjU4YmVjODkzNWE0ODNlYTA2ZjUyMmE1NGQ0YTg3MiA9ICQoJzxkaXYgaWQ9Imh0bWxfYzY1OGJlYzg5MzVhNDgzZWEwNmY1MjJhNTRkNGE4NzIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJlZFIgVUsgKExvbmRvbik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2EyZTg3YjEwYjE2YjQ0NWFiMDBkYTA4ZGQ5MmRkMDU3LnNldENvbnRlbnQoaHRtbF9jNjU4YmVjODkzNWE0ODNlYTA2ZjUyMmE1NGQ0YTg3Mik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jZTE0MjhiNmMzNWY0YzY2ODZkYzQ3YTIwMzgzMGRiZS5iaW5kUG9wdXAocG9wdXBfYTJlODdiMTBiMTZiNDQ1YWIwMGRhMDhkZDkyZGQwNTcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzU0MTc2OWVlOTY2ZTQ0MjM4MTk3ZGU3YWJjNTMxZDE0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTMuMjM1MDQ4LC0xLjQyMTYyOV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjNmMDgwZjk4NTdhNGFhNjk0NDk2MThlZDFkZmQwNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjY3OWM2YzgyNWViNDM1OWFiNDQ5OTcwMzAzNTIwYzIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWEyMzJlZTg1YTE3NDVmMmJkZmZhYzNkZWQ2OTdjYTggPSAkKCc8ZGl2IGlkPSJodG1sX2VhMjMyZWU4NWExNzQ1ZjJiZGZmYWMzZGVkNjk3Y2E4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Bc2hnYXRlIEhvc3BpY2VjYXJlIChDaGVzdGVyZmllbGQpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82Njc5YzZjODI1ZWI0MzU5YWI0NDk5NzAzMDM1MjBjMi5zZXRDb250ZW50KGh0bWxfZWEyMzJlZTg1YTE3NDVmMmJkZmZhYzNkZWQ2OTdjYTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTQxNzY5ZWU5NjZlNDQyMzgxOTdkZTdhYmM1MzFkMTQuYmluZFBvcHVwKHBvcHVwXzY2NzljNmM4MjVlYjQzNTlhYjQ0OTk3MDMwMzUyMGMyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xZjdjN2MzMTI3ODg0NjdhYmE1NDIzMTg4OWY0MjFmMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjUwNzM1MDksLTAuMTI3NzU4M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjNmMDgwZjk4NTdhNGFhNjk0NDk2MThlZDFkZmQwNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODhlMjQxOWM4MDUzNGUwNmIwMzdhOWMwYTY3YTkxNDMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzMxYmM4ZDkxMDVjNGM0OThhZTU5M2I0MmYxMzc2ODggPSAkKCc8ZGl2IGlkPSJodG1sXzMzMWJjOGQ5MTA1YzRjNDk4YWU1OTNiNDJmMTM3Njg4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Jbm5vdmF0ZW1lZHRlYyAoTG9uZG9uKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODhlMjQxOWM4MDUzNGUwNmIwMzdhOWMwYTY3YTkxNDMuc2V0Q29udGVudChodG1sXzMzMWJjOGQ5MTA1YzRjNDk4YWU1OTNiNDJmMTM3Njg4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzFmN2M3YzMxMjc4ODQ2N2FiYTU0MjMxODg5ZjQyMWYxLmJpbmRQb3B1cChwb3B1cF84OGUyNDE5YzgwNTM0ZTA2YjAzN2E5YzBhNjdhOTE0Myk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNWJhMDc3NjBjMDRiNDlkYmE2MDc4OTY0YzcxMzE3NWQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1NC41OTcyODUwMDAwMDAwMSwtNS45MzAxMl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjNmMDgwZjk4NTdhNGFhNjk0NDk2MThlZDFkZmQwNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfY2I5OTY5ZDhjZDc4NDZhMGEyZTdkYTI5ZjgyYzg3MTYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTk5NGEyNjM0M2U4NDhiZWFlZGI4MTA5NDIzMjliODkgPSAkKCc8ZGl2IGlkPSJodG1sX2E5OTRhMjYzNDNlODQ4YmVhZWRiODEwOTQyMzI5Yjg5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FeHRlcm4gV29ya3MgKEJlbGZhc3QsIE4uSXJlbGFuZCxVSyk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2NiOTk2OWQ4Y2Q3ODQ2YTBhMmU3ZGEyOWY4MmM4NzE2LnNldENvbnRlbnQoaHRtbF9hOTk0YTI2MzQzZTg0OGJlYWVkYjgxMDk0MjMyOWI4OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81YmEwNzc2MGMwNGI0OWRiYTYwNzg5NjRjNzEzMTc1ZC5iaW5kUG9wdXAocG9wdXBfY2I5OTY5ZDhjZDc4NDZhMGEyZTdkYTI5ZjgyYzg3MTYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzAwMmRiMjVkYjEzNzQ2Y2ViNzE1MTYzNjVmZjA4NzQwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNTI1NTE2MiwwLjAzNTIxNjNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2IzZjA4MGY5ODU3YTRhYTY5NDQ5NjE4ZWQxZGZkMDc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2QzNzE5MTA5YjBjMjQ3NzdiY2I3MjQ0NTJhYzA1NWM3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NmZDJkOTY4ZjQ4NjRjY2ViM2ZmM2I4YzgzODRmOGRkID0gJCgnPGRpdiBpZD0iaHRtbF9jZmQyZDk2OGY0ODY0Y2NlYjNmZjNiOGM4Mzg0ZjhkZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QXN0b24tTWFuc2ZpZWxkIChMb25kb24gQm9yb3VnaCBvZiBOZXdoYW0pPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kMzcxOTEwOWIwYzI0Nzc3YmNiNzI0NDUyYWMwNTVjNy5zZXRDb250ZW50KGh0bWxfY2ZkMmQ5NjhmNDg2NGNjZWIzZmYzYjhjODM4NGY4ZGQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDAyZGIyNWRiMTM3NDZjZWI3MTUxNjM2NWZmMDg3NDAuYmluZFBvcHVwKHBvcHVwX2QzNzE5MTA5YjBjMjQ3NzdiY2I3MjQ0NTJhYzA1NWM3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kYTQ3Y2Y1ZTI2NDU0OWYxOWUxNjA4ODU5NDc4NjY2NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzU0LjU3NDIyNywtMS4yMzQ5NTZdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2IzZjA4MGY5ODU3YTRhYTY5NDQ5NjE4ZWQxZGZkMDc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E3YTliYTdjOGFjOTQ1NzBhMWNmNDg1MmY0M2QwNDIxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBjNzIzYTU1YTlhOTQ2YjFiMWIxZjQwZTAzOWUwMmZiID0gJCgnPGRpdiBpZD0iaHRtbF8wYzcyM2E1NWE5YTk0NmIxYjFiMWY0MGUwMzllMDJmYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SGFsbyBQcm9qZWN0IENoYXJpdHkgKE1pZGRsZXNicm91Z2gpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hN2E5YmE3YzhhYzk0NTcwYTFjZjQ4NTJmNDNkMDQyMS5zZXRDb250ZW50KGh0bWxfMGM3MjNhNTVhOWE5NDZiMWIxYjFmNDBlMDM5ZTAyZmIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZGE0N2NmNWUyNjQ1NDlmMTllMTYwODg1OTQ3ODY2NjUuYmluZFBvcHVwKHBvcHVwX2E3YTliYTdjOGFjOTQ1NzBhMWNmNDg1MmY0M2QwNDIxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zY2I3MDFlMzkwNjk0OWVhYTYxYjNmZTU1OWE5ZjkyZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUwLjcxOTE2NCwtMS44ODA3NjldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2IzZjA4MGY5ODU3YTRhYTY5NDQ5NjE4ZWQxZGZkMDc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM5ZDBkMzE4MGExMTRhM2M4YzliNTNmZGFiNDRlM2Y2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q2ODg1ZDc1NmNlNzQ1NTViOWYyNDRlZTNjNzgwNjhjID0gJCgnPGRpdiBpZD0iaHRtbF9kNjg4NWQ3NTZjZTc0NTU1YjlmMjQ0ZWUzYzc4MDY4YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SG9wZSBIb3BlIEhvdXNpbmcsIFRyYWluaW5nIGFuZCBTdXBwb3J0IExURCAoQm91cm5lbW91dGggJmFtcDsgUG9vbGUgKERvcnNldCkpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zOWQwZDMxODBhMTE0YTNjOGM5YjUzZmRhYjQ0ZTNmNi5zZXRDb250ZW50KGh0bWxfZDY4ODVkNzU2Y2U3NDU1NWI5ZjI0NGVlM2M3ODA2OGMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfM2NiNzAxZTM5MDY5NDllYWE2MWIzZmU1NTlhOWY5MmUuYmluZFBvcHVwKHBvcHVwXzM5ZDBkMzE4MGExMTRhM2M4YzliNTNmZGFiNDRlM2Y2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xNjFhMDJmZDBiMzE0MWJlODZlZTc4YzhjNWUwNjQxNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUyLjA2MjkwMDksLTEuMzM5Nzc1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9iM2YwODBmOTg1N2E0YWE2OTQ0OTYxOGVkMWRmZDA3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82YzMzZDE4NjFmYzU0NmZkYjE5MTg2ZDMxNGM2MTc5ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iZmYzNDg1ZmQzN2Y0NjBhYjFiMWE4YTNiMTM1NDgyZCA9ICQoJzxkaXYgaWQ9Imh0bWxfYmZmMzQ4NWZkMzdmNDYwYWIxYjFhOGEzYjEzNTQ4MmQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFkb3B0aW9uIFVLIChCYW5idXJ5KTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNmMzM2QxODYxZmM1NDZmZGIxOTE4NmQzMTRjNjE3OWQuc2V0Q29udGVudChodG1sX2JmZjM0ODVmZDM3ZjQ2MGFiMWIxYThhM2IxMzU0ODJkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzE2MWEwMmZkMGIzMTQxYmU4NmVlNzhjOGM1ZTA2NDE1LmJpbmRQb3B1cChwb3B1cF82YzMzZDE4NjFmYzU0NmZkYjE5MTg2ZDMxNGM2MTc5ZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMmUyZWM1NzNmY2Y1NDliNDhkMDVlYzMxZWY3MDRlMWQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41MDczNTA5LC0wLjEyNzc1ODNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2IzZjA4MGY5ODU3YTRhYTY5NDQ5NjE4ZWQxZGZkMDc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Y4NWNmMGFiNzc3MjQ0ZWE4ZWU3MjRjMWM5MGUzYzZlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY4Y2M0MTU2YmJiYzQ5MWQ5NjIzM2NlZjY2YjAyMmUwID0gJCgnPGRpdiBpZD0iaHRtbF82OGNjNDE1NmJiYmM0OTFkOTYyMzNjZWY2NmIwMjJlMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U29jaWFsIExpZmUgKExvbmRvbik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Y4NWNmMGFiNzc3MjQ0ZWE4ZWU3MjRjMWM5MGUzYzZlLnNldENvbnRlbnQoaHRtbF82OGNjNDE1NmJiYmM0OTFkOTYyMzNjZWY2NmIwMjJlMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yZTJlYzU3M2ZjZjU0OWI0OGQwNWVjMzFlZjcwNGUxZC5iaW5kUG9wdXAocG9wdXBfZjg1Y2YwYWI3NzcyNDRlYThlZTcyNGMxYzkwZTNjNmUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2M4NjFjMTQ4NGQ5ZjRlMmRhODVlZDFhZmNjMDE5YjhmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNTA3MzUwOSwtMC4xMjc3NTgzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9iM2YwODBmOTg1N2E0YWE2OTQ0OTYxOGVkMWRmZDA3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lNWIwMDhlNzcwYzA0M2NhYTcxODg0ZWNjYzRkOWZlYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zYmQzYThmNDViNzY0Mzc5ODFhNDI3MmQ1ZjgzMjlhMyA9ICQoJzxkaXYgaWQ9Imh0bWxfM2JkM2E4ZjQ1Yjc2NDM3OTgxYTQyNzJkNWY4MzI5YTMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxpdHRsZSBBbmdlbCBUaGVhdHJlIChMb25kb24pPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lNWIwMDhlNzcwYzA0M2NhYTcxODg0ZWNjYzRkOWZlYi5zZXRDb250ZW50KGh0bWxfM2JkM2E4ZjQ1Yjc2NDM3OTgxYTQyNzJkNWY4MzI5YTMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzg2MWMxNDg0ZDlmNGUyZGE4NWVkMWFmY2MwMTliOGYuYmluZFBvcHVwKHBvcHVwX2U1YjAwOGU3NzBjMDQzY2FhNzE4ODRlY2NjNGQ5ZmViKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zMWZhMWU3NWQ0NDI0ZWYzOGVjY2Y1ZDNlZjlhM2E3YiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjU0NjUwNjMsLTAuMTA1ODA1OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjNmMDgwZjk4NTdhNGFhNjk0NDk2MThlZDFkZmQwNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGNjZTMzYWUwY2E2NDI4YTk0MjgxMTk4MWM3MGIzODUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjg3MDg5YTRiM2Q5NGIyZDkyOTMyMGRlOTI0NTYyOTUgPSAkKCc8ZGl2IGlkPSJodG1sXzY4NzA4OWE0YjNkOTRiMmQ5MjkzMjBkZTkyNDU2Mjk1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IZWxwIG9uIFlvdXIgRG9vcnN0ZXAgKElzbGluZ3RvbiwgTG9uZG9uKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZGNjZTMzYWUwY2E2NDI4YTk0MjgxMTk4MWM3MGIzODUuc2V0Q29udGVudChodG1sXzY4NzA4OWE0YjNkOTRiMmQ5MjkzMjBkZTkyNDU2Mjk1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzMxZmExZTc1ZDQ0MjRlZjM4ZWNjZjVkM2VmOWEzYTdiLmJpbmRQb3B1cChwb3B1cF9kY2NlMzNhZTBjYTY0MjhhOTQyODExOTgxYzcwYjM4NSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTk5Y2ZhOTFjN2ZmNGYzMWIyMzc3MDM1ZTQ0N2ZlZTIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1My40ODA3NTkzLC0yLjI0MjYzMDVdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2IzZjA4MGY5ODU3YTRhYTY5NDQ5NjE4ZWQxZGZkMDc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2IwZmEwZDdmZDA2MzRjYTQ5NGRmZDhkN2U1ZTk2Yzg5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzI3NDY0ODkwM2NlMDQ4ZDQ5ZjAzM2ZmNWU4ZWJmNDM5ID0gJCgnPGRpdiBpZD0iaHRtbF8yNzQ2NDg5MDNjZTA0OGQ0OWYwMzNmZjVlOGViZjQzOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SGVuc2hhd3MgU29jaWV0eSBmb3IgQmxpbmQgUGVvcGxlIChNYW5jaGVzdGVyKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjBmYTBkN2ZkMDYzNGNhNDk0ZGZkOGQ3ZTVlOTZjODkuc2V0Q29udGVudChodG1sXzI3NDY0ODkwM2NlMDQ4ZDQ5ZjAzM2ZmNWU4ZWJmNDM5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzk5OWNmYTkxYzdmZjRmMzFiMjM3NzAzNWU0NDdmZWUyLmJpbmRQb3B1cChwb3B1cF9iMGZhMGQ3ZmQwNjM0Y2E0OTRkZmQ4ZDdlNWU5NmM4OSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjhkYjNhOTc0ODMzNDc3ZTk2YjM4ZDExYmM1YWIzZTUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1NC4xNzUxMDI0LC02LjM0MDIyOTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2IzZjA4MGY5ODU3YTRhYTY5NDQ5NjE4ZWQxZGZkMDc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzY2ZWM1ZGQxZjMwMjQ0Y2JhNjcyOWRmNzZhZjMxYmZjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2IwZGI3YmM1NDk2ZTQ2YzBhZTZjZTA2OGYzNjViOGFkID0gJCgnPGRpdiBpZD0iaHRtbF9iMGRiN2JjNTQ5NmU0NmMwYWU2Y2UwNjhmMzY1YjhhZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VW5yZXBvcnRlZC5Xb3JsZCBDb21tdW5pdHkgSW50ZXJlc3QgQ28gKE5ld3J5KTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjZlYzVkZDFmMzAyNDRjYmE2NzI5ZGY3NmFmMzFiZmMuc2V0Q29udGVudChodG1sX2IwZGI3YmM1NDk2ZTQ2YzBhZTZjZTA2OGYzNjViOGFkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2I4ZGIzYTk3NDgzMzQ3N2U5NmIzOGQxMWJjNWFiM2U1LmJpbmRQb3B1cChwb3B1cF82NmVjNWRkMWYzMDI0NGNiYTY3MjlkZjc2YWYzMWJmYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDJhMWQ2ZjY0MTRmNDVkYzg5OTE1ZTEwMjNlYzhlZWQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1My40OTYxMTUsLTIuNTE4NzI3XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9iM2YwODBmOTg1N2E0YWE2OTQ0OTYxOGVkMWRmZDA3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kMzUzNTY3OWQyNTg0NWZlYWRjNWRiZjA0ZDVmYzg5NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lOGQyOTViMDIxYWI0MGIzOTY3YjlmMjJiMTM4NTZkZiA9ICQoJzxkaXYgaWQ9Imh0bWxfZThkMjk1YjAyMWFiNDBiMzk2N2I5ZjIyYjEzODU2ZGYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlRoZSBCbGFpciBQcm9qZWN0IChMZWlnaCk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2QzNTM1Njc5ZDI1ODQ1ZmVhZGM1ZGJmMDRkNWZjODk3LnNldENvbnRlbnQoaHRtbF9lOGQyOTViMDIxYWI0MGIzOTY3YjlmMjJiMTM4NTZkZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80MmExZDZmNjQxNGY0NWRjODk5MTVlMTAyM2VjOGVlZC5iaW5kUG9wdXAocG9wdXBfZDM1MzU2NzlkMjU4NDVmZWFkYzVkYmYwNGQ1ZmM4OTcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg0ZjgwYjE0YjY0NzRhMDE4Yjg0NGVjMzA0ZTQ0NmI3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTMuNzQ1NjcwOSwtMC4zMzY3NDEzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9iM2YwODBmOTg1N2E0YWE2OTQ0OTYxOGVkMWRmZDA3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mNDI2MTU4MWFiMjE0MGI4OGFhZjY2MzBiZjE4ZDZkZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jNTA4OGJjOWI0MTc0YzYxOWM5ZDlkODQyZTQyMzBjZiA9ICQoJzxkaXYgaWQ9Imh0bWxfYzUwODhiYzliNDE3NGM2MTljOWQ5ZDg0MmU0MjMwY2YiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlVuaXZlcnNpdHkgb2YgSHVsbCAoSHVsbCk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Y0MjYxNTgxYWIyMTQwYjg4YWFmNjYzMGJmMThkNmRkLnNldENvbnRlbnQoaHRtbF9jNTA4OGJjOWI0MTc0YzYxOWM5ZDlkODQyZTQyMzBjZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84NGY4MGIxNGI2NDc0YTAxOGI4NDRlYzMwNGU0NDZiNy5iaW5kUG9wdXAocG9wdXBfZjQyNjE1ODFhYjIxNDBiODhhYWY2NjMwYmYxOGQ2ZGQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2FmOTc2NGRiZGQ5YTQ4YTY4MjJiZWUwNGI4OTdlNDI5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNTA3MzUwOSwtMC4xMjc3NTgzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9iM2YwODBmOTg1N2E0YWE2OTQ0OTYxOGVkMWRmZDA3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xNTYyMTk2NGJkMjk0ZWRlYWE1OGIzMmE5YWMwOWY0ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xODRiODU2YWU0Y2I0M2I0OGE3MDkyMzY5NjdhZmNhMiA9ICQoJzxkaXYgaWQ9Imh0bWxfMTg0Yjg1NmFlNGNiNDNiNDhhNzA5MjM2OTY3YWZjYTIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNhbXBhaWduIEFjYWRlbXkgKExvbmRvbik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE1NjIxOTY0YmQyOTRlZGVhYTU4YjMyYTlhYzA5ZjRkLnNldENvbnRlbnQoaHRtbF8xODRiODU2YWU0Y2I0M2I0OGE3MDkyMzY5NjdhZmNhMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hZjk3NjRkYmRkOWE0OGE2ODIyYmVlMDRiODk3ZTQyOS5iaW5kUG9wdXAocG9wdXBfMTU2MjE5NjRiZDI5NGVkZWFhNThiMzJhOWFjMDlmNGQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzdhMjFiYmYyNzRmYzQzNTBiNzZmMTE1NDVmYjg0ZDNmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTMuNDgwNzU5MywtMi4yNDI2MzA1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9iM2YwODBmOTg1N2E0YWE2OTQ0OTYxOGVkMWRmZDA3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82ZDZlMWJlOTQyMTk0MjlhOWQwNGQwZGEyZjhhZDc4NCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jNjhkZGQyM2U0ZWE0ZGViODM4N2M4ZmRjNTY1Mjk1MSA9ICQoJzxkaXYgaWQ9Imh0bWxfYzY4ZGRkMjNlNGVhNGRlYjgzODdjOGZkYzU2NTI5NTEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZpcnN0IEFzaWFuIFN1cHBvcnQgVHJ1c3QgKEZBU1QpIChNYW5jaGVzdGVyKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNmQ2ZTFiZTk0MjE5NDI5YTlkMDRkMGRhMmY4YWQ3ODQuc2V0Q29udGVudChodG1sX2M2OGRkZDIzZTRlYTRkZWI4Mzg3YzhmZGM1NjUyOTUxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzdhMjFiYmYyNzRmYzQzNTBiNzZmMTE1NDVmYjg0ZDNmLmJpbmRQb3B1cChwb3B1cF82ZDZlMWJlOTQyMTk0MjlhOWQwNGQwZGEyZjhhZDc4NCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYmVmZDcwMjFlM2NlNGQwYzkyNWQ4ODgzMDIzZmNhYTggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1My40ODA3NTkzLC0yLjI0MjYzMDVdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2IzZjA4MGY5ODU3YTRhYTY5NDQ5NjE4ZWQxZGZkMDc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzc2M2I2YTY5MzMzYjQxZGFhOWZiOGQ3N2EzMjI2MjM0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M4MjBjNDczMDhkNTQ4ODg5ZWViNzYwN2NhOTUwZDExID0gJCgnPGRpdiBpZD0iaHRtbF9jODIwYzQ3MzA4ZDU0ODg4OWVlYjc2MDdjYTk1MGQxMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VGVjaCBGb3IgR29vZCBMaXZlIChNYW5jaGVzdGVyKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzYzYjZhNjkzMzNiNDFkYWE5ZmI4ZDc3YTMyMjYyMzQuc2V0Q29udGVudChodG1sX2M4MjBjNDczMDhkNTQ4ODg5ZWViNzYwN2NhOTUwZDExKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2JlZmQ3MDIxZTNjZTRkMGM5MjVkODg4MzAyM2ZjYWE4LmJpbmRQb3B1cChwb3B1cF83NjNiNmE2OTMzM2I0MWRhYTlmYjhkNzdhMzIyNjIzNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjZjOGYzOTcwMjcyNDJjZmIyZTk3M2YwMjE5N2FkYmMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41MDczNTA5LC0wLjEyNzc1ODNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2IzZjA4MGY5ODU3YTRhYTY5NDQ5NjE4ZWQxZGZkMDc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M2N2E1ZTg1YTliNjQ2OGE4YjhkMDFiNWQwNjk1NmQwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzUzNjJiOTI4NjNiZTQ0OTdhZDA4ZGZkMDU4MGQzODdkID0gJCgnPGRpdiBpZD0iaHRtbF81MzYyYjkyODYzYmU0NDk3YWQwOGRmZDA1ODBkMzg3ZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3RlcCB1cCB0byBTZXJ2ZSAoTG9uZG9uKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzY3YTVlODVhOWI2NDY4YThiOGQwMWI1ZDA2OTU2ZDAuc2V0Q29udGVudChodG1sXzUzNjJiOTI4NjNiZTQ0OTdhZDA4ZGZkMDU4MGQzODdkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Y2YzhmMzk3MDI3MjQyY2ZiMmU5NzNmMDIxOTdhZGJjLmJpbmRQb3B1cChwb3B1cF9jNjdhNWU4NWE5YjY0NjhhOGI4ZDAxYjVkMDY5NTZkMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgZmVhdHVyZV9ncm91cF8wYjVlNzc3Yzk4YmM0ZjkwYTdmNTI4Njc0MGY3ODU2YSA9IEwuZmVhdHVyZUdyb3VwKAogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNTIyMjVhNzJiM2Q1NDQ4ZWJmZWQxMjcwMjlkMzc2YzQpOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jMjM5MTVhOTE2YzQ0OTMxYWY2OTgwNzVlNThmYWJhZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjUwNzM1MDksLTAuMTI3NzU4M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF8wYjVlNzc3Yzk4YmM0ZjkwYTdmNTI4Njc0MGY3ODU2YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lYzllNDkzZWZjODE0YTlmYTBiNjhjYzNmZTY2ZGI2ZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84YzQxMmI5MDQzYmM0NjFhYTNiZGJhNTc2ZWNhMmI5MSA9ICQoJzxkaXYgaWQ9Imh0bWxfOGM0MTJiOTA0M2JjNDYxYWEzYmRiYTU3NmVjYTJiOTEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJyZWFzdCBDYW5jZXIgQ2FyZSAoTG9uZG9uKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZWM5ZTQ5M2VmYzgxNGE5ZmEwYjY4Y2MzZmU2NmRiNmUuc2V0Q29udGVudChodG1sXzhjNDEyYjkwNDNiYzQ2MWFhM2JkYmE1NzZlY2EyYjkxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2MyMzkxNWE5MTZjNDQ5MzFhZjY5ODA3NWU1OGZhYmFkLmJpbmRQb3B1cChwb3B1cF9lYzllNDkzZWZjODE0YTlmYTBiNjhjYzNmZTY2ZGI2ZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNGY5YWQ0MDNiZWIwNGY4OGEwOTc0OGY5MzMwNWY0NmIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41MDczNTA5LC0wLjEyNzc1ODNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMGI1ZTc3N2M5OGJjNGY5MGE3ZjUyODY3NDBmNzg1NmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzM5Nzc0YjBmYjIzNDVmOWExYmFhYzQyNjFlMDA3YTIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWViZGNiODk1YWVlNGI3NWE0MzAwN2RmNThkNmQyMGIgPSAkKCc8ZGl2IGlkPSJodG1sXzFlYmRjYjg5NWFlZTRiNzVhNDMwMDdkZjU4ZDZkMjBiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SSVNFIE11dHVhbCBDSUMgKExvbmRvbiwgVUspPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jMzk3NzRiMGZiMjM0NWY5YTFiYWFjNDI2MWUwMDdhMi5zZXRDb250ZW50KGh0bWxfMWViZGNiODk1YWVlNGI3NWE0MzAwN2RmNThkNmQyMGIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNGY5YWQ0MDNiZWIwNGY4OGEwOTc0OGY5MzMwNWY0NmIuYmluZFBvcHVwKHBvcHVwX2MzOTc3NGIwZmIyMzQ1ZjlhMWJhYWM0MjYxZTAwN2EyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85ZmI3MjhkMzYwNmQ0YzE4YTVlMTMyMzViMWYxZDczYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjUzODg4OTk5OTk5OTk5LDAuMTQ3NDNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMGI1ZTc3N2M5OGJjNGY5MGE3ZjUyODY3NDBmNzg1NmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjlkZjc3YWQyNDk1NDZlMmE3MjI0M2JlZGEwZDM3MWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODA5NjEzMjJiYWNkNDlhZjljOGM1MWQ2OTczMTk4MTEgPSAkKCc8ZGl2IGlkPSJodG1sXzgwOTYxMzIyYmFjZDQ5YWY5YzhjNTFkNjk3MzE5ODExIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Db21tdW5pdHkgUmVzb3VyY2VzIGZvciBDaGFuZ2UgKERhZ2VuaGFtKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjlkZjc3YWQyNDk1NDZlMmE3MjI0M2JlZGEwZDM3MWEuc2V0Q29udGVudChodG1sXzgwOTYxMzIyYmFjZDQ5YWY5YzhjNTFkNjk3MzE5ODExKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzlmYjcyOGQzNjA2ZDRjMThhNWUxMzIzNWIxZjFkNzNiLmJpbmRQb3B1cChwb3B1cF82OWRmNzdhZDI0OTU0NmUyYTcyMjQzYmVkYTBkMzcxYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTRmZjI4YjFkZGUzNDBmMzg5OWQ3MTdlMzFkODdhNTIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41MDczNTA5LC0wLjEyNzc1ODNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMGI1ZTc3N2M5OGJjNGY5MGE3ZjUyODY3NDBmNzg1NmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNWZlYTUxOWVjMTNjNGYwNWIwMGQzNzY0YmUxNTNkMWUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjBjMWM0Y2VjMzZlNGNlOWE1ZDNhZDcxMjA3ZjMxOWQgPSAkKCc8ZGl2IGlkPSJodG1sX2YwYzFjNGNlYzM2ZTRjZTlhNWQzYWQ3MTIwN2YzMTlkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CZXN0IEJlZ2lubmluZ3MgKExvbmRvbik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzVmZWE1MTllYzEzYzRmMDViMDBkMzc2NGJlMTUzZDFlLnNldENvbnRlbnQoaHRtbF9mMGMxYzRjZWMzNmU0Y2U5YTVkM2FkNzEyMDdmMzE5ZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81NGZmMjhiMWRkZTM0MGYzODk5ZDcxN2UzMWQ4N2E1Mi5iaW5kUG9wdXAocG9wdXBfNWZlYTUxOWVjMTNjNGYwNWIwMGQzNzY0YmUxNTNkMWUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Q0NjZjOTE2ZWZiNjQ2NjVhNjMxOGE3NmYyYmY4YzY5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTAuMzc1NDU2NSwtNC4xNDI2NTY1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzBiNWU3NzdjOThiYzRmOTBhN2Y1Mjg2NzQwZjc4NTZhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzkzZThmNzM5NjYwZTRjNDhhNmJlOWExYTZjMDcwMzhhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRkYmM2MDVkZTc5YzQxYzk5MmRjZDExZThkOGYwZWNjID0gJCgnPGRpdiBpZD0iaHRtbF80ZGJjNjA1ZGU3OWM0MWM5OTJkY2QxMWU4ZDhmMGVjYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UGx5bW91dGggTXVzaWMgWm9uZSAoUGx5bW91dGgpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85M2U4ZjczOTY2MGU0YzQ4YTZiZTlhMWE2YzA3MDM4YS5zZXRDb250ZW50KGh0bWxfNGRiYzYwNWRlNzljNDFjOTkyZGNkMTFlOGQ4ZjBlY2MpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDQ2NmM5MTZlZmI2NDY2NWE2MzE4YTc2ZjJiZjhjNjkuYmluZFBvcHVwKHBvcHVwXzkzZThmNzM5NjYwZTRjNDhhNmJlOWExYTZjMDcwMzhhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hYTNjNDM2ZWI5NDk0YjkwOTBjZTFlOWRkYTFiYmYxNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUwLjkwODU5NiwwLjI0OTQyMzVdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMGI1ZTc3N2M5OGJjNGY5MGE3ZjUyODY3NDBmNzg1NmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjkxZmQyNzYwNTQ2NDAzZDhjMmRkMGM1MjNmOWNmMGYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzA3YzQ3MGYzZThjNDgwOWEyMDdkYTQwYjk4NzNhNDMgPSAkKCc8ZGl2IGlkPSJodG1sX2MwN2M0NzBmM2U4YzQ4MDlhMjA3ZGE0MGI5ODczYTQzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Qb3NpdGl2ZU5lZ2F0aXZlcyAoRWFzdCBTdXNzZXgpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82OTFmZDI3NjA1NDY0MDNkOGMyZGQwYzUyM2Y5Y2YwZi5zZXRDb250ZW50KGh0bWxfYzA3YzQ3MGYzZThjNDgwOWEyMDdkYTQwYjk4NzNhNDMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYWEzYzQzNmViOTQ5NGI5MDkwY2UxZTlkZGExYmJmMTcuYmluZFBvcHVwKHBvcHVwXzY5MWZkMjc2MDU0NjQwM2Q4YzJkZDBjNTIzZjljZjBmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kOTc4ZWQ5ZjZiNGM0NWU0OTBiMTQ0YjViZTJmMDA4ZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjM3MDkyMiwxLjEyNzc3MV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF8wYjVlNzc3Yzk4YmM0ZjkwYTdmNTI4Njc0MGY3ODU2YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lZWU5ODY4MWMxMGE0OWRlYTk3YjU0NmVmM2ZkYjIyNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83N2NiZjVkZDYxM2Y0ZjIzOWU5Njk5YmY5ZjVlYTVlZCA9ICQoJzxkaXYgaWQ9Imh0bWxfNzdjYmY1ZGQ2MTNmNGYyMzllOTY5OWJmOWY1ZWE1ZWQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJyaWdodCBTaGFkb3cgKEhlcm5lIEJheSk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2VlZTk4NjgxYzEwYTQ5ZGVhOTdiNTQ2ZWYzZmRiMjI0LnNldENvbnRlbnQoaHRtbF83N2NiZjVkZDYxM2Y0ZjIzOWU5Njk5YmY5ZjVlYTVlZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kOTc4ZWQ5ZjZiNGM0NWU0OTBiMTQ0YjViZTJmMDA4ZS5iaW5kUG9wdXAocG9wdXBfZWVlOTg2ODFjMTBhNDlkZWE5N2I1NDZlZjNmZGIyMjQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzFkMjQ3NjA3YWFkNDQzNjViYWVmMDJlY2ZmOTYwNmZmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNTA3MzUwOSwtMC4xMjc3NTgzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzBiNWU3NzdjOThiYzRmOTBhN2Y1Mjg2NzQwZjc4NTZhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E0OTQyNmY5OTkwMzRlNmM5MTU3NmRkNWE0ODFkZTc0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzE1OWQ5ODhkMDc0MDQ3YTVhMjE4MjIwYWNjYmY0MGIwID0gJCgnPGRpdiBpZD0iaHRtbF8xNTlkOTg4ZDA3NDA0N2E1YTIxODIyMGFjY2JmNDBiMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2FyaXRhcyBBbmNob3IgSG91c2UgKExvbmRvbik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E0OTQyNmY5OTkwMzRlNmM5MTU3NmRkNWE0ODFkZTc0LnNldENvbnRlbnQoaHRtbF8xNTlkOTg4ZDA3NDA0N2E1YTIxODIyMGFjY2JmNDBiMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xZDI0NzYwN2FhZDQ0MzY1YmFlZjAyZWNmZjk2MDZmZi5iaW5kUG9wdXAocG9wdXBfYTQ5NDI2Zjk5OTAzNGU2YzkxNTc2ZGQ1YTQ4MWRlNzQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzRmYzQ3MGI3NDVkZTQxZDliMDFlMjg5ZWFkZWVkYzVlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTMuMjkzMTgxOTk5OTk5OTksLTMuNzI3NjRdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMGI1ZTc3N2M5OGJjNGY5MGE3ZjUyODY3NDBmNzg1NmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzZkYTMyY2NlZTJlNGIzM2FhMDU2ODc1YzlmZTEwN2UgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmE5OTJjYzM2NzE1NDI4ZDlkNzlkNzdiNzk5MjEwOTEgPSAkKCc8ZGl2IGlkPSJodG1sXzZhOTkyY2MzNjcxNTQyOGQ5ZDc5ZDc3Yjc5OTIxMDkxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ob3J0aCBXYWxlcyBEZWFmIEFzc29jaWF0aW9uIChDb2x3eW4gQmF5LCBOb3J0aCBXYWxlcyk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzc2ZGEzMmNjZWUyZTRiMzNhYTA1Njg3NWM5ZmUxMDdlLnNldENvbnRlbnQoaHRtbF82YTk5MmNjMzY3MTU0MjhkOWQ3OWQ3N2I3OTkyMTA5MSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80ZmM0NzBiNzQ1ZGU0MWQ5YjAxZTI4OWVhZGVlZGM1ZS5iaW5kUG9wdXAocG9wdXBfNzZkYTMyY2NlZTJlNGIzM2FhMDU2ODc1YzlmZTEwN2UpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2FlZTQyYjA5Y2MyMTRmZDdhNjM1MWZmNGMyNDdmM2E0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNTA3MzUwOSwtMC4xMjc3NTgzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzBiNWU3NzdjOThiYzRmOTBhN2Y1Mjg2NzQwZjc4NTZhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M3ZWQ1OTY2NWVlMjQxZWQ5MGFhOTMwNWMwNjZjYmI2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2YwZDU2YjAzNWFmYTQ1MzRhZjhjYThhNTNjOGY0OTEzID0gJCgnPGRpdiBpZD0iaHRtbF9mMGQ1NmIwMzVhZmE0NTM0YWY4Y2E4YTUzYzhmNDkxMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VGVjaG5vbG9neSBUcnVzdCAoTG9uZG9uKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzdlZDU5NjY1ZWUyNDFlZDkwYWE5MzA1YzA2NmNiYjYuc2V0Q29udGVudChodG1sX2YwZDU2YjAzNWFmYTQ1MzRhZjhjYThhNTNjOGY0OTEzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2FlZTQyYjA5Y2MyMTRmZDdhNjM1MWZmNGMyNDdmM2E0LmJpbmRQb3B1cChwb3B1cF9jN2VkNTk2NjVlZTI0MWVkOTBhYTkzMDVjMDY2Y2JiNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNGUxZDlhMTJhMTg2NGE2NTg5OTU2ZDU2OTI4NzM0NmEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41NTU3NzM5MDAwMDAwMSwtMS43Nzk3MTc2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzBiNWU3NzdjOThiYzRmOTBhN2Y1Mjg2NzQwZjc4NTZhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2IzNDhjMDc3NzhiYzQyODRhMjc2OWRjOWZkYjU0YzczID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRiMzlhZGYzMzJhNDQ0ZGZiNDFiZjU3MjExZWMxYjkwID0gJCgnPGRpdiBpZD0iaHRtbF80YjM5YWRmMzMyYTQ0NGRmYjQxYmY1NzIxMWVjMWI5MCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q3JlYXRlIFN0dWRpb3MgRGlnaXRhbCBNZWRpYSBDSUMgKFN3aW5kb24pPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iMzQ4YzA3Nzc4YmM0Mjg0YTI3NjlkYzlmZGI1NGM3My5zZXRDb250ZW50KGh0bWxfNGIzOWFkZjMzMmE0NDRkZmI0MWJmNTcyMTFlYzFiOTApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNGUxZDlhMTJhMTg2NGE2NTg5OTU2ZDU2OTI4NzM0NmEuYmluZFBvcHVwKHBvcHVwX2IzNDhjMDc3NzhiYzQyODRhMjc2OWRjOWZkYjU0YzczKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mZjVhMzU1MWJjNjg0OTE1YWI3NmRmZjIwMTQwNGJjZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjA1OTc3MSwtMS4zMTAxNDJdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMGI1ZTc3N2M5OGJjNGY5MGE3ZjUyODY3NDBmNzg1NmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfM2M1MzQzY2FiODAwNDdiZGJjNzkzZWNlNzYwMDA4YjcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTZkZTc3OTQ5MzU1NGM0ZDkxZDUwZmRjODU1ODZhNmMgPSAkKCc8ZGl2IGlkPSJodG1sXzE2ZGU3Nzk0OTM1NTRjNGQ5MWQ1MGZkYzg1NTg2YTZjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Db21tdW5pdHkgRmlyc3QgKFdpbmNoZXN0ZXIpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zYzUzNDNjYWI4MDA0N2JkYmM3OTNlY2U3NjAwMDhiNy5zZXRDb250ZW50KGh0bWxfMTZkZTc3OTQ5MzU1NGM0ZDkxZDUwZmRjODU1ODZhNmMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZmY1YTM1NTFiYzY4NDkxNWFiNzZkZmYyMDE0MDRiY2UuYmluZFBvcHVwKHBvcHVwXzNjNTM0M2NhYjgwMDQ3YmRiYzc5M2VjZTc2MDAwOGI3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83ODgzZDY1YzZhMzQ0NGMzYmNjM2YyOTUwMTI1ZTQyMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjUwNzM1MDksLTAuMTI3NzU4M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF8wYjVlNzc3Yzk4YmM0ZjkwYTdmNTI4Njc0MGY3ODU2YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80M2FlNWUzM2IyZmI0Zjc5OWFlY2FhYjIwOWNkNTc1NCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hYmYwMzdkYTc0OGQ0MWI2YjkzMDg3MGExYjU3ZDkwNiA9ICQoJzxkaXYgaWQ9Imh0bWxfYWJmMDM3ZGE3NDhkNDFiNmI5MzA4NzBhMWI1N2Q5MDYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldvbWVuIGluIFByaXNvbiAoTG9uZG9uKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDNhZTVlMzNiMmZiNGY3OTlhZWNhYWIyMDljZDU3NTQuc2V0Q29udGVudChodG1sX2FiZjAzN2RhNzQ4ZDQxYjZiOTMwODcwYTFiNTdkOTA2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzc4ODNkNjVjNmEzNDQ0YzNiY2MzZjI5NTAxMjVlNDIzLmJpbmRQb3B1cChwb3B1cF80M2FlNWUzM2IyZmI0Zjc5OWFlY2FhYjIwOWNkNTc1NCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODY0YTRjMjEwNzkyNGE1YjgxNmU1OGFjOTViZTFlNTggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41MDczNTA5LC0wLjEyNzc1ODNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMGI1ZTc3N2M5OGJjNGY5MGE3ZjUyODY3NDBmNzg1NmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDM3MDYzNDAzYTcwNGU1NGFjMzFhZDliY2RjNTFkZDUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODI3MWZmZDY5YWVjNGQyNmJiN2EwYTVmNjQ2MDA3MDUgPSAkKCc8ZGl2IGlkPSJodG1sXzgyNzFmZmQ2OWFlYzRkMjZiYjdhMGE1ZjY0NjAwNzA1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NaW5pc3RyeSBvZiBTdG9yaWVzIChMb25kb24pPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wMzcwNjM0MDNhNzA0ZTU0YWMzMWFkOWJjZGM1MWRkNS5zZXRDb250ZW50KGh0bWxfODI3MWZmZDY5YWVjNGQyNmJiN2EwYTVmNjQ2MDA3MDUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODY0YTRjMjEwNzkyNGE1YjgxNmU1OGFjOTViZTFlNTguYmluZFBvcHVwKHBvcHVwXzAzNzA2MzQwM2E3MDRlNTRhYzMxYWQ5YmNkYzUxZGQ1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yMTcxYjk0ZjlhYjE0ZjU4YmFiZDVhMTQ4ZDhlMGRmYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUyLjI1NDUyMjUsLTIuMjY2ODM4Ml0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF8wYjVlNzc3Yzk4YmM0ZjkwYTdmNTI4Njc0MGY3ODU2YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81ZjExNmU2M2Q5NWU0YzQzODhmY2Y2Njg0YTE4OTdlMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81ODZiYmUxYTczYWM0NGQ1OTkxYmM0ZDdlMzE3MWY2YyA9ICQoJzxkaXYgaWQ9Imh0bWxfNTg2YmJlMWE3M2FjNDRkNTk5MWJjNGQ3ZTMxNzFmNmMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNvY2lhbCBGaW5hbmNlIEx0ZCAod29yY2VzdGVyc2hpcmUpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81ZjExNmU2M2Q5NWU0YzQzODhmY2Y2Njg0YTE4OTdlMi5zZXRDb250ZW50KGh0bWxfNTg2YmJlMWE3M2FjNDRkNTk5MWJjNGQ3ZTMxNzFmNmMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjE3MWI5NGY5YWIxNGY1OGJhYmQ1YTE0OGQ4ZTBkZmEuYmluZFBvcHVwKHBvcHVwXzVmMTE2ZTYzZDk1ZTRjNDM4OGZjZjY2ODRhMTg5N2UyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82YmJiMmMzY2YzYzc0NjA1YTRmMTUxZGM4NTA2OTY0YiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjUwNzM1MDksLTAuMTI3NzU4M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF8wYjVlNzc3Yzk4YmM0ZjkwYTdmNTI4Njc0MGY3ODU2YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mM2ZmMjUzZDYzYmM0MWM4YmM5NWJlMGM1NTgwNGYxNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xYzU3YmNiOWI5OWQ0MzQ5OTUzYWQ4ZjcyNzQxNzI4MyA9ICQoJzxkaXYgaWQ9Imh0bWxfMWM1N2JjYjliOTlkNDM0OTk1M2FkOGY3Mjc0MTcyODMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNlbnRyZXBvaW50IChMb25kb24pPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mM2ZmMjUzZDYzYmM0MWM4YmM5NWJlMGM1NTgwNGYxNS5zZXRDb250ZW50KGh0bWxfMWM1N2JjYjliOTlkNDM0OTk1M2FkOGY3Mjc0MTcyODMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNmJiYjJjM2NmM2M3NDYwNWE0ZjE1MWRjODUwNjk2NGIuYmluZFBvcHVwKHBvcHVwX2YzZmYyNTNkNjNiYzQxYzhiYzk1YmUwYzU1ODA0ZjE1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kOTM3ODEyNmNhMDI0YTljYWIyYjE4YjA0MTBjNjRiNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjI4MDIzMywxLjA3ODkwODldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMGI1ZTc3N2M5OGJjNGY5MGE3ZjUyODY3NDBmNzg1NmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmMwYjIwNDgxZGVkNDA0OWIwOWNiYmNmNDU5OTQyZmUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmI3OTg0NmI1NzFlNDVmZGE5MWE5NGI5MGE3M2U4NzYgPSAkKCc8ZGl2IGlkPSJodG1sXzJiNzk4NDZiNTcxZTQ1ZmRhOTFhOTRiOTBhNzNlODc2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SZWZ1Z2VlIExpdmUgKENhbnRlcmJ1cnkpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82YzBiMjA0ODFkZWQ0MDQ5YjA5Y2JiY2Y0NTk5NDJmZS5zZXRDb250ZW50KGh0bWxfMmI3OTg0NmI1NzFlNDVmZGE5MWE5NGI5MGE3M2U4NzYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDkzNzgxMjZjYTAyNGE5Y2FiMmIxOGIwNDEwYzY0YjcuYmluZFBvcHVwKHBvcHVwXzZjMGIyMDQ4MWRlZDQwNDliMDljYmJjZjQ1OTk0MmZlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82ZWU2ZTdkMzZhMTI0ZjljYmNhODMzNDZjM2NmNmZhZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjM3NTgwMSwtMi4zNTk5MDM5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzBiNWU3NzdjOThiYzRmOTBhN2Y1Mjg2NzQwZjc4NTZhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U5ZjA4NDdkYTk3NDQ1M2I5NGJiMTAxMDJhYzc0MWViID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M1YTFmNDUxMWJkZTRhODhiM2QwYjJjYmUwZjFkMDdkID0gJCgnPGRpdiBpZD0iaHRtbF9jNWExZjQ1MTFiZGU0YTg4YjNkMGIyY2JlMGYxZDA3ZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmF0aCBDYXJlcnMgRW50ZXJwcmlzZXMgTHRkIChCYXRoKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTlmMDg0N2RhOTc0NDUzYjk0YmIxMDEwMmFjNzQxZWIuc2V0Q29udGVudChodG1sX2M1YTFmNDUxMWJkZTRhODhiM2QwYjJjYmUwZjFkMDdkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzZlZTZlN2QzNmExMjRmOWNiY2E4MzM0NmMzY2Y2ZmFlLmJpbmRQb3B1cChwb3B1cF9lOWYwODQ3ZGE5NzQ0NTNiOTRiYjEwMTAyYWM3NDFlYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzE0ZTQ3MDdlNTgwNDFiN2FlMDIyOWYyM2U5ZjJjOTQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41MDczNTA5LC0wLjEyNzc1ODNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMGI1ZTc3N2M5OGJjNGY5MGE3ZjUyODY3NDBmNzg1NmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDJiODNhNzQyYmY0NDExMWJlOTU3ZTE4ZmY5MThhNTQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmY4NTg1OTE1NDZmNDFkOGFjYWJlNjRhMmFhZWIzMzUgPSAkKCc8ZGl2IGlkPSJodG1sX2ZmODU4NTkxNTQ2ZjQxZDhhY2FiZTY0YTJhYWViMzM1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Tb2NpYWwgU3BpZGVyIENJQyAoTG9uZG9uKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDJiODNhNzQyYmY0NDExMWJlOTU3ZTE4ZmY5MThhNTQuc2V0Q29udGVudChodG1sX2ZmODU4NTkxNTQ2ZjQxZDhhY2FiZTY0YTJhYWViMzM1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzMxNGU0NzA3ZTU4MDQxYjdhZTAyMjlmMjNlOWYyYzk0LmJpbmRQb3B1cChwb3B1cF8wMmI4M2E3NDJiZjQ0MTExYmU5NTdlMThmZjkxOGE1NCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMGU1MDYxN2M3NWZhNGM1YWFjMDc4NDlmMmEwNmRjY2QgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41MTA1MzgzOTk5OTk5OSwtMC41OTUwNDA1OTk5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzBiNWU3NzdjOThiYzRmOTBhN2Y1Mjg2NzQwZjc4NTZhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M3OWZlODc5N2I4NDRiMzE5OTFmMWY2MjIwZDNiYzJkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2EzMzg2ZjZiYTE4NTQwYmZiMmQxMTRhYWNiOGY3ZmY0ID0gJCgnPGRpdiBpZD0iaHRtbF9hMzM4NmY2YmExODU0MGJmYjJkMTE0YWFjYjhmN2ZmNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+NTAtNTAgU1lOQyBDSUMgKFNsb3VnaCk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2M3OWZlODc5N2I4NDRiMzE5OTFmMWY2MjIwZDNiYzJkLnNldENvbnRlbnQoaHRtbF9hMzM4NmY2YmExODU0MGJmYjJkMTE0YWFjYjhmN2ZmNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wZTUwNjE3Yzc1ZmE0YzVhYWMwNzg0OWYyYTA2ZGNjZC5iaW5kUG9wdXAocG9wdXBfYzc5ZmU4Nzk3Yjg0NGIzMTk5MWYxZjYyMjBkM2JjMmQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg1ZDI4MzI4NTg5ZDQxOTQ5ZTMxMmU2NjYxMmYxNWUyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNDgxNTgxMDAwMDAwMDEsLTMuMTc5MDldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMGI1ZTc3N2M5OGJjNGY5MGE3ZjUyODY3NDBmNzg1NmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNWEwNTI5ZmJhZTRhNDdmYmJmMjNlYjMwYzhmM2E3ZDggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWJmYzNhZTgyOTUyNDdjY2I2NzcxMGQ0MGNlZWFhZTIgPSAkKCc8ZGl2IGlkPSJodG1sX2ViZmMzYWU4Mjk1MjQ3Y2NiNjc3MTBkNDBjZWVhYWUyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BY3Rpb24gb24gSGVhcmluZyBMb3NzIEN5bXJ1IChDYXJkaWZmKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNWEwNTI5ZmJhZTRhNDdmYmJmMjNlYjMwYzhmM2E3ZDguc2V0Q29udGVudChodG1sX2ViZmMzYWU4Mjk1MjQ3Y2NiNjc3MTBkNDBjZWVhYWUyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzg1ZDI4MzI4NTg5ZDQxOTQ5ZTMxMmU2NjYxMmYxNWUyLmJpbmRQb3B1cChwb3B1cF81YTA1MjlmYmFlNGE0N2ZiYmYyM2ViMzBjOGYzYTdkOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjZkOTJmNjkyYWVjNGMzZmJmYjE3YWY4YTcyZDA0MDUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41MDczNTA5LC0wLjEyNzc1ODNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMGI1ZTc3N2M5OGJjNGY5MGE3ZjUyODY3NDBmNzg1NmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTFhYzA0ZTg0YTUwNGVhZjlmMTUzNmE5YzFiOGUyNzEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzQwYzc3N2I2Y2U1NGFiZjlkYjgyOTIzMGVhYWFjMDMgPSAkKCc8ZGl2IGlkPSJodG1sXzM0MGM3NzdiNmNlNTRhYmY5ZGI4MjkyMzBlYWFhYzAzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5UaXRoZUJhcm4gR2l2aW5nIEZ1bmQgKExvbmRvbik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ExYWMwNGU4NGE1MDRlYWY5ZjE1MzZhOWMxYjhlMjcxLnNldENvbnRlbnQoaHRtbF8zNDBjNzc3YjZjZTU0YWJmOWRiODI5MjMwZWFhYWMwMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mNmQ5MmY2OTJhZWM0YzNmYmZiMTdhZjhhNzJkMDQwNS5iaW5kUG9wdXAocG9wdXBfYTFhYzA0ZTg0YTUwNGVhZjlmMTUzNmE5YzFiOGUyNzEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2U0NWIxMmQ1OGMyYzQ3MDVhZjIyNWYwZDIyMDcxNTM1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNTA3MzUwOSwtMC4xMjc3NTgzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzBiNWU3NzdjOThiYzRmOTBhN2Y1Mjg2NzQwZjc4NTZhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q3MWNhNWViYTMyODQxMDc4MmU1ZWI5OWZjYjYwY2JjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ViZTI3NTI5MjJmNjRlNWVhOGUyYzcxNTczNmZiYzJjID0gJCgnPGRpdiBpZD0iaHRtbF9lYmUyNzUyOTIyZjY0ZTVlYThlMmM3MTU3MzZmYmMyYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGlmZWxpbmUgUHJvamVjdCAoTG9uZG9uKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDcxY2E1ZWJhMzI4NDEwNzgyZTVlYjk5ZmNiNjBjYmMuc2V0Q29udGVudChodG1sX2ViZTI3NTI5MjJmNjRlNWVhOGUyYzcxNTczNmZiYzJjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2U0NWIxMmQ1OGMyYzQ3MDVhZjIyNWYwZDIyMDcxNTM1LmJpbmRQb3B1cChwb3B1cF9kNzFjYTVlYmEzMjg0MTA3ODJlNWViOTlmY2I2MGNiYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjhhNGRiZThhZmYwNGMxZDk4YTI5MGRhMmFjYjM0NmYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41MDczNTA5LC0wLjEyNzc1ODNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMGI1ZTc3N2M5OGJjNGY5MGE3ZjUyODY3NDBmNzg1NmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTc4ZDg0Zjk4MGUyNDE5NmI2YzdiOGQwNmEwMGEwMzAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTQ3YmYyY2FlMmQ3NDE2OTlmMTQ3M2Q1MTQ5ZjdjMTEgPSAkKCc8ZGl2IGlkPSJodG1sX2E0N2JmMmNhZTJkNzQxNjk5ZjE0NzNkNTE0OWY3YzExIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CdWRkeUh1YiAoTG9uZG9uKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTc4ZDg0Zjk4MGUyNDE5NmI2YzdiOGQwNmEwMGEwMzAuc2V0Q29udGVudChodG1sX2E0N2JmMmNhZTJkNzQxNjk5ZjE0NzNkNTE0OWY3YzExKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2I4YTRkYmU4YWZmMDRjMWQ5OGEyOTBkYTJhY2IzNDZmLmJpbmRQb3B1cChwb3B1cF81NzhkODRmOTgwZTI0MTk2YjZjN2I4ZDA2YTAwYTAzMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmZhNzRjMmNiYTcxNDI3MjgyMjljZTY1MGZkNzRjMzUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41MDczNTA5LC0wLjEyNzc1ODNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMGI1ZTc3N2M5OGJjNGY5MGE3ZjUyODY3NDBmNzg1NmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzYxN2IzZWUxYWMyNGRiYTgwNjE2OGM5ZjJlYzI0ODMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWRmNDgzYjVjODAwNGU1ZWE0MjgwNDQ3MWNmY2Y5MDMgPSAkKCc8ZGl2IGlkPSJodG1sXzVkZjQ4M2I1YzgwMDRlNWVhNDI4MDQ0NzFjZmNmOTAzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Bbm5hIEZyZXVkIE5hdGlvbmFsIENlbnRyZSBGb3IgQ2hpbGRyZW4gYW5kIEZhbWlsaWVzIChMb25kb24pPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83NjE3YjNlZTFhYzI0ZGJhODA2MTY4YzlmMmVjMjQ4My5zZXRDb250ZW50KGh0bWxfNWRmNDgzYjVjODAwNGU1ZWE0MjgwNDQ3MWNmY2Y5MDMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNmZhNzRjMmNiYTcxNDI3MjgyMjljZTY1MGZkNzRjMzUuYmluZFBvcHVwKHBvcHVwXzc2MTdiM2VlMWFjMjRkYmE4MDYxNjhjOWYyZWMyNDgzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81ZmQyZTAwYjIzMzc0ZDBmOTdjZTk1Y2U2OGFhMThiMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjUwNzM1MDksLTAuMTI3NzU4M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF8wYjVlNzc3Yzk4YmM0ZjkwYTdmNTI4Njc0MGY3ODU2YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81NTQyMmZhN2MwYWQ0YTMxYWQ4MjE3ZjkwNTE3OTc3MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jMGI1YTQyZTRlOTg0YmM4YTZkMDBmOGQ1ZjE3NGZhZCA9ICQoJzxkaXYgaWQ9Imh0bWxfYzBiNWE0MmU0ZTk4NGJjOGE2ZDAwZjhkNWYxNzRmYWQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNwaWNlIElubm92YXRpb25zIChMb25kb24pPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81NTQyMmZhN2MwYWQ0YTMxYWQ4MjE3ZjkwNTE3OTc3MC5zZXRDb250ZW50KGh0bWxfYzBiNWE0MmU0ZTk4NGJjOGE2ZDAwZjhkNWYxNzRmYWQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNWZkMmUwMGIyMzM3NGQwZjk3Y2U5NWNlNjhhYTE4YjAuYmluZFBvcHVwKHBvcHVwXzU1NDIyZmE3YzBhZDRhMzFhZDgyMTdmOTA1MTc5NzcwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80NDczNGVmYTljYmI0ODY4YWJhYTdkNTkxNjM3YTc1MyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjc1MjAyMDksLTEuMjU3NzI2M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF8wYjVlNzc3Yzk4YmM0ZjkwYTdmNTI4Njc0MGY3ODU2YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iNWMxYTBlNjM0NWM0NjI0YWYyNzA5NTNiNDNkMDJhMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kNDE0M2E5MWM5MzY0NTM0OWEwZGRlZmY1ZTcwOGY2MSA9ICQoJzxkaXYgaWQ9Imh0bWxfZDQxNDNhOTFjOTM2NDUzNDlhMGRkZWZmNWU3MDhmNjEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRpZ2l0YWwgZm9yIEdvb2QgKE94Zm9yZCk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I1YzFhMGU2MzQ1YzQ2MjRhZjI3MDk1M2I0M2QwMmEyLnNldENvbnRlbnQoaHRtbF9kNDE0M2E5MWM5MzY0NTM0OWEwZGRlZmY1ZTcwOGY2MSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80NDczNGVmYTljYmI0ODY4YWJhYTdkNTkxNjM3YTc1My5iaW5kUG9wdXAocG9wdXBfYjVjMWEwZTYzNDVjNDYyNGFmMjcwOTUzYjQzZDAyYTIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzYzNDFlNjZjNjg1NTQ2ZDI4NmVjOTQ4NDJkN2U1MzcxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTQuOTUyNjgsLTEuNjAzNDExXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzBiNWU3NzdjOThiYzRmOTBhN2Y1Mjg2NzQwZjc4NTZhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQ4Nzg1YTA2ZTFkZTRhNTNiNTE1NGIzNjhkZDczMmQ3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzdiMGRkMjUwMDM3OTQ1YTQ5OGUxOGJjNzg0NTBiMDQ2ID0gJCgnPGRpdiBpZD0iaHRtbF83YjBkZDI1MDAzNzk0NWE0OThlMThiYzc4NDUwYjA0NiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RXF1YWwgQXJ0cyAoR2F0ZXNoZWFkKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDg3ODVhMDZlMWRlNGE1M2I1MTU0YjM2OGRkNzMyZDcuc2V0Q29udGVudChodG1sXzdiMGRkMjUwMDM3OTQ1YTQ5OGUxOGJjNzg0NTBiMDQ2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzYzNDFlNjZjNjg1NTQ2ZDI4NmVjOTQ4NDJkN2U1MzcxLmJpbmRQb3B1cChwb3B1cF80ODc4NWEwNmUxZGU0YTUzYjUxNTRiMzY4ZGQ3MzJkNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjZjNzc0ZTlhYzNhNGQ4OGI3ZGE5NTZjZjA2NjkzYzYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1NS45NTMyNTIsLTMuMTg4MjY3XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzBiNWU3NzdjOThiYzRmOTBhN2Y1Mjg2NzQwZjc4NTZhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg4YzAyMzk4YjkxZjRhZTI5ZjA5YzYxMjE3YWYwMTNmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E0MjI4ZWM0M2U5NDRmNTU5Y2Q2MGRkYzA4Zjk4MjA4ID0gJCgnPGRpdiBpZD0iaHRtbF9hNDIyOGVjNDNlOTQ0ZjU1OWNkNjBkZGMwOGY5ODIwOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WW91bmcgU2NvdCAoRWRpbmJ1cmdoKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODhjMDIzOThiOTFmNGFlMjlmMDljNjEyMTdhZjAxM2Yuc2V0Q29udGVudChodG1sX2E0MjI4ZWM0M2U5NDRmNTU5Y2Q2MGRkYzA4Zjk4MjA4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2I2Yzc3NGU5YWMzYTRkODhiN2RhOTU2Y2YwNjY5M2M2LmJpbmRQb3B1cChwb3B1cF84OGMwMjM5OGI5MWY0YWUyOWYwOWM2MTIxN2FmMDEzZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTM5MGE5NjcyZWU0NGVlNmFlYWYyYmNiMGIyYmNkMzAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41MzA2MjcsLTAuMDI4MzUzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzBiNWU3NzdjOThiYzRmOTBhN2Y1Mjg2NzQwZjc4NTZhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzk5ZGUxMDRiOTZkZjQ0ZTE5NzIyZTIyMDNhNTExMzBhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFhMGVhZTE0MTVmYzQyYWQ5ZDFhNzNhMDMzYTEwNzc2ID0gJCgnPGRpdiBpZD0iaHRtbF8xYTBlYWUxNDE1ZmM0MmFkOWQxYTczYTAzM2ExMDc3NiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QnJvbWxleSBieSBCb3cgQ2VudHJlIChCb3csIFRvd2VyIEhhbWxldHMsIExvbmRvbik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk5ZGUxMDRiOTZkZjQ0ZTE5NzIyZTIyMDNhNTExMzBhLnNldENvbnRlbnQoaHRtbF8xYTBlYWUxNDE1ZmM0MmFkOWQxYTczYTAzM2ExMDc3Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85MzkwYTk2NzJlZTQ0ZWU2YWVhZjJiY2IwYjJiY2QzMC5iaW5kUG9wdXAocG9wdXBfOTlkZTEwNGI5NmRmNDRlMTk3MjJlMjIwM2E1MTEzMGEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzE5NTFhNmQ4ZGY2ZTRlOGU4NjYyNTdiYTYxMGRjODNkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuMDY4Nzg1LC0xLjc5NDQ3Ml0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF8wYjVlNzc3Yzk4YmM0ZjkwYTdmNTI4Njc0MGY3ODU2YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mZmY3YWQ4ZjRjNzc0ZmZmYjBhNjY1OGE4MjU3ZTA1ZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wZGQ1ZWFmYWNiZjg0Yjg3OTUxN2IwNjBiMmFkYTdiNyA9ICQoJzxkaXYgaWQ9Imh0bWxfMGRkNWVhZmFjYmY4NGI4Nzk1MTdiMDYwYjJhZGE3YjciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlRydXNzZWxsIFRydXN0IChTYWxpc2J1cnkpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mZmY3YWQ4ZjRjNzc0ZmZmYjBhNjY1OGE4MjU3ZTA1Zi5zZXRDb250ZW50KGh0bWxfMGRkNWVhZmFjYmY4NGI4Nzk1MTdiMDYwYjJhZGE3YjcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTk1MWE2ZDhkZjZlNGU4ZTg2NjI1N2JhNjEwZGM4M2QuYmluZFBvcHVwKHBvcHVwX2ZmZjdhZDhmNGM3NzRmZmZiMGE2NjU4YTgyNTdlMDVmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kNGE4ZmVmNjQyNzc0NTRjYjFjNmVkY2IwMjI4YzRlMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzU1LjAxODIzOTksLTEuNDg1ODQzNl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF8wYjVlNzc3Yzk4YmM0ZjkwYTdmNTI4Njc0MGY3ODU2YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83NjBkZDI1NDI0ZDI0YjYzYmU1N2M5OGIzYWZlMTMyOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85MGUzYjRkY2IyNjI0NGJjOGNiNzU3MDM4ODI3MmJiYSA9ICQoJzxkaXYgaWQ9Imh0bWxfOTBlM2I0ZGNiMjYyNDRiYzhjYjc1NzAzODgyNzJiYmEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5vcnRoIFR5bmVzaWRlIFZPREEgKE5vcnRoIFR5bmVzaWRlKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzYwZGQyNTQyNGQyNGI2M2JlNTdjOThiM2FmZTEzMjguc2V0Q29udGVudChodG1sXzkwZTNiNGRjYjI2MjQ0YmM4Y2I3NTcwMzg4MjcyYmJhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Q0YThmZWY2NDI3NzQ1NGNiMWM2ZWRjYjAyMjhjNGUzLmJpbmRQb3B1cChwb3B1cF83NjBkZDI1NDI0ZDI0YjYzYmU1N2M5OGIzYWZlMTMyOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMmM4NzgyMjlhMDFmNGJlZTllNjUxNDhjZWYyNGVjYzQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1My43NjMyMjU0LC0yLjcwNDQwNTJdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMGI1ZTc3N2M5OGJjNGY5MGE3ZjUyODY3NDBmNzg1NmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOGFhZTc4MjM3OGEyNDIzNzkxYjJjNDZmMTUzYzM5YjkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODY3ODZhYjQ1YjhjNDE1Mjk4NTllYWYzM2M4NTIyNjMgPSAkKCc8ZGl2IGlkPSJodG1sXzg2Nzg2YWI0NWI4YzQxNTI5ODU5ZWFmMzNjODUyMjYzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TYWZlciBUb2dldGhlciAvIEhBUlYgKGxhbmNhc2hpcmUpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84YWFlNzgyMzc4YTI0MjM3OTFiMmM0NmYxNTNjMzliOS5zZXRDb250ZW50KGh0bWxfODY3ODZhYjQ1YjhjNDE1Mjk4NTllYWYzM2M4NTIyNjMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMmM4NzgyMjlhMDFmNGJlZTllNjUxNDhjZWYyNGVjYzQuYmluZFBvcHVwKHBvcHVwXzhhYWU3ODIzNzhhMjQyMzc5MWIyYzQ2ZjE1M2MzOWI5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xMGM3ZmI2YWVkNDE0ZTAwODE1MGE1ZjYyZmI4NzZlNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUyLjQ4NjI0Mjk5OTk5OTk5LC0xLjg5MDQwMV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF8wYjVlNzc3Yzk4YmM0ZjkwYTdmNTI4Njc0MGY3ODU2YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hNzgwMGRhZGM5NmE0MDljYTg5ODkxMDYyNmMyNWM0NCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83ZjU4NDQ0Y2RhN2I0MWQ0YmNhMjliZWMxNTIwZmI2NSA9ICQoJzxkaXYgaWQ9Imh0bWxfN2Y1ODQ0NGNkYTdiNDFkNGJjYTI5YmVjMTUyMGZiNjUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNoYW5nZXMgVUsgKEJpcm1pbmdoYW0pPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hNzgwMGRhZGM5NmE0MDljYTg5ODkxMDYyNmMyNWM0NC5zZXRDb250ZW50KGh0bWxfN2Y1ODQ0NGNkYTdiNDFkNGJjYTI5YmVjMTUyMGZiNjUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTBjN2ZiNmFlZDQxNGUwMDgxNTBhNWY2MmZiODc2ZTQuYmluZFBvcHVwKHBvcHVwX2E3ODAwZGFkYzk2YTQwOWNhODk4OTEwNjI2YzI1YzQ0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kNDk4NTM1NzBkYTE0Y2EyYjU1MTA2NDA4MmFlMmMyNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUzLjgwMDc1NTQsLTEuNTQ5MDc3NF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF8wYjVlNzc3Yzk4YmM0ZjkwYTdmNTI4Njc0MGY3ODU2YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wNzA5MTlmOGY2N2U0MTZjYTVhYjA5NjkyMjUzYzA5NiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mMGIyZGJjZjdkMzc0ZjViYjkwNmNlYTJkYThlNTRiMyA9ICQoJzxkaXYgaWQ9Imh0bWxfZjBiMmRiY2Y3ZDM3NGY1YmI5MDZjZWEyZGE4ZTU0YjMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlZhbGxhIChMZWVkcyk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA3MDkxOWY4ZjY3ZTQxNmNhNWFiMDk2OTIyNTNjMDk2LnNldENvbnRlbnQoaHRtbF9mMGIyZGJjZjdkMzc0ZjViYjkwNmNlYTJkYThlNTRiMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kNDk4NTM1NzBkYTE0Y2EyYjU1MTA2NDA4MmFlMmMyNC5iaW5kUG9wdXAocG9wdXBfMDcwOTE5ZjhmNjdlNDE2Y2E1YWIwOTY5MjI1M2MwOTYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ZmZTg3YzFhNmRhYzQxMDdiNjdjNDU0NjU0NTJmZDdhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNTA3MzUwOSwtMC4xMjc3NTgzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzBiNWU3NzdjOThiYzRmOTBhN2Y1Mjg2NzQwZjc4NTZhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzliNTBlMzkxMTAzMDRiNTVhZDkzMTA5NmQ2MTY1NTUzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M0NTQ4MmI0YzVkYzQ0Mjc4OGQ2YTQwNWYzM2Q2MTMxID0gJCgnPGRpdiBpZD0iaHRtbF9jNDU0ODJiNGM1ZGM0NDI3ODhkNmE0MDVmMzNkNjEzMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+dippbnNwaXJlZCAoTG9uZG9uKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOWI1MGUzOTExMDMwNGI1NWFkOTMxMDk2ZDYxNjU1NTMuc2V0Q29udGVudChodG1sX2M0NTQ4MmI0YzVkYzQ0Mjc4OGQ2YTQwNWYzM2Q2MTMxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2ZmZTg3YzFhNmRhYzQxMDdiNjdjNDU0NjU0NTJmZDdhLmJpbmRQb3B1cChwb3B1cF85YjUwZTM5MTEwMzA0YjU1YWQ5MzEwOTZkNjE2NTU1Myk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjI5Yjg0MTk5YTAyNGVjMDg0ZTgwMjZjZDVlNjQ2NjIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41MDczNTA5LC0wLjEyNzc1ODNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMGI1ZTc3N2M5OGJjNGY5MGE3ZjUyODY3NDBmNzg1NmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmRhNGIwZGExN2M0NDRmMzhlNTY4N2I2MWRmMTA4MGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTQxYWY1N2I3YmM4NDVjNmE3NGRkZWJmZGYxNzljNzIgPSAkKCc8ZGl2IGlkPSJodG1sX2U0MWFmNTdiN2JjODQ1YzZhNzRkZGViZmRmMTc5YzcyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IZWxwVGV4dCAoTG9uZG9uKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZmRhNGIwZGExN2M0NDRmMzhlNTY4N2I2MWRmMTA4MGEuc2V0Q29udGVudChodG1sX2U0MWFmNTdiN2JjODQ1YzZhNzRkZGViZmRmMTc5YzcyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzIyOWI4NDE5OWEwMjRlYzA4NGU4MDI2Y2Q1ZTY0NjYyLmJpbmRQb3B1cChwb3B1cF9mZGE0YjBkYTE3YzQ0NGYzOGU1Njg3YjYxZGYxMDgwYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzM3NTkyNzE5NmYxNDQzM2IzOWMyZDBjZThmZDVhMzYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41MDczNTA5LC0wLjEyNzc1ODNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMGI1ZTc3N2M5OGJjNGY5MGE3ZjUyODY3NDBmNzg1NmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTk4YzZmMjlhMjQ4NDcyYmIzY2M1ZTk0NzQ1ZmU2YjIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWZhMDJkY2Y1YzcxNGRiZTg4NWY1MmRjN2U2ZTA4NWMgPSAkKCc8ZGl2IGlkPSJodG1sXzVmYTAyZGNmNWM3MTRkYmU4ODVmNTJkYzdlNmUwODVjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BY3Rpb24gRm9yIENoaWxkcmVuIChMb25kb24pPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xOThjNmYyOWEyNDg0NzJiYjNjYzVlOTQ3NDVmZTZiMi5zZXRDb250ZW50KGh0bWxfNWZhMDJkY2Y1YzcxNGRiZTg4NWY1MmRjN2U2ZTA4NWMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzM3NTkyNzE5NmYxNDQzM2IzOWMyZDBjZThmZDVhMzYuYmluZFBvcHVwKHBvcHVwXzE5OGM2ZjI5YTI0ODQ3MmJiM2NjNWU5NDc0NWZlNmIyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hMzE4YjIxMzlkM2E0M2FmODUwZmIzZDMyYWU1OGFhZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzU0Ljk3ODI1MiwtMS42MTc3OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF8wYjVlNzc3Yzk4YmM0ZjkwYTdmNTI4Njc0MGY3ODU2YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jZGM2YTE4YWQ4YTY0NzgyODBkZWNkYWE4OGE1NDZiMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jNzg4MzM0ZTg1OGY0MzIyOTFiNzJkMDM3OTNlYzA4MCA9ICQoJzxkaXYgaWQ9Imh0bWxfYzc4ODMzNGU4NThmNDMyMjkxYjcyZDAzNzkzZWMwODAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRlbWVudGlhIENhcmUgKE5ld2Nhc3RsZSB1cG9uIFR5bmUpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jZGM2YTE4YWQ4YTY0NzgyODBkZWNkYWE4OGE1NDZiMi5zZXRDb250ZW50KGh0bWxfYzc4ODMzNGU4NThmNDMyMjkxYjcyZDAzNzkzZWMwODApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTMxOGIyMTM5ZDNhNDNhZjg1MGZiM2QzMmFlNThhYWQuYmluZFBvcHVwKHBvcHVwX2NkYzZhMThhZDhhNjQ3ODI4MGRlY2RhYTg4YTU0NmIyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84NjAzMjNiYTljZWQ0MWEwYjNhNWI1MGZjM2Q2ODhhZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjUwNzM1MDksLTAuMTI3NzU4M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF8wYjVlNzc3Yzk4YmM0ZjkwYTdmNTI4Njc0MGY3ODU2YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yYzI1NzkzMDk0YjA0NmU1OWIwMjE4YzQwNTZkZmRjNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xYzBkMDI3MDUzNjA0MTk2YjVkYzM5NzUwYTlhODFiZCA9ICQoJzxkaXYgaWQ9Imh0bWxfMWMwZDAyNzA1MzYwNDE5NmI1ZGMzOTc1MGE5YTgxYmQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVjaG8gVmVudHVyZXMgQy5JLkMuIChFYXN0IExvbmRvbik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzJjMjU3OTMwOTRiMDQ2ZTU5YjAyMThjNDA1NmRmZGM3LnNldENvbnRlbnQoaHRtbF8xYzBkMDI3MDUzNjA0MTk2YjVkYzM5NzUwYTlhODFiZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84NjAzMjNiYTljZWQ0MWEwYjNhNWI1MGZjM2Q2ODhhZi5iaW5kUG9wdXAocG9wdXBfMmMyNTc5MzA5NGIwNDZlNTliMDIxOGM0MDU2ZGZkYzcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNjNzc5ZjFkNDA4YTRmOTRhMzk3YzUzNTAzNmMyYWE1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNTA3MzUwOSwtMC4xMjc3NTgzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzBiNWU3NzdjOThiYzRmOTBhN2Y1Mjg2NzQwZjc4NTZhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U5MjRlMWQ1YzE3YjRiZmQ4YTM3NzQ0YjMyM2I4YjExID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2MxYzc1ODI4ODI3ZTRkOGFiM2FmMjc0NmJkYzhlZDU1ID0gJCgnPGRpdiBpZD0iaHRtbF9jMWM3NTgyODgyN2U0ZDhhYjNhZjI3NDZiZGM4ZWQ1NSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TXVsdGlwbGUgU2NsZXJvc2lzIChNUykgU29jaWV0eSAoTG9uZG9uKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTkyNGUxZDVjMTdiNGJmZDhhMzc3NDRiMzIzYjhiMTEuc2V0Q29udGVudChodG1sX2MxYzc1ODI4ODI3ZTRkOGFiM2FmMjc0NmJkYzhlZDU1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzNjNzc5ZjFkNDA4YTRmOTRhMzk3YzUzNTAzNmMyYWE1LmJpbmRQb3B1cChwb3B1cF9lOTI0ZTFkNWMxN2I0YmZkOGEzNzc0NGIzMjNiOGIxMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgZmVhdHVyZV9ncm91cF8wNjA1YmZlMjczYjI0Y2FmOWU3MGNiNTRlYzMxOWRhNCA9IEwuZmVhdHVyZUdyb3VwKAogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNTIyMjVhNzJiM2Q1NDQ4ZWJmZWQxMjcwMjlkMzc2YzQpOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84ZmE5MTA1NTZkOTg0NDBkODY1MGYwYzc1M2JmYWNmNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUzLjM5MDA0NDEsLTIuNTk2OTUwMV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjM0LDc3LDk0KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyMzQsNzcsOTQpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzA2MDViZmUyNzNiMjRjYWY5ZTcwY2I1NGVjMzE5ZGE0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzY5Njk5OWI3NGVlNzRkMWFiMmVlNTNkMjg4Mjg3NTA1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzAyZTY1MmRiZDk5MjRjY2FiYjQ1ZTM1NWFlZjExMjMyID0gJCgnPGRpdiBpZD0iaHRtbF8wMmU2NTJkYmQ5OTI0Y2NhYmI0NWUzNTVhZWYxMTIzMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U2lnbkhlYWx0aCAoV2FycmluZ3Rvbik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY5Njk5OWI3NGVlNzRkMWFiMmVlNTNkMjg4Mjg3NTA1LnNldENvbnRlbnQoaHRtbF8wMmU2NTJkYmQ5OTI0Y2NhYmI0NWUzNTVhZWYxMTIzMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84ZmE5MTA1NTZkOTg0NDBkODY1MGYwYzc1M2JmYWNmNS5iaW5kUG9wdXAocG9wdXBfNjk2OTk5Yjc0ZWU3NGQxYWIyZWU1M2QyODgyODc1MDUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzZmMzBmNTc4ODBjMDQ5YTM4NTNlY2U4NzA5YzNkOGUwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNTA3MzUwOSwtMC4xMjc3NTgzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyMzQsNzcsOTQpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDIzNCw3Nyw5NCknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMDYwNWJmZTI3M2IyNGNhZjllNzBjYjU0ZWMzMTlkYTQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmRlNWQ1NzYyMzQ4NDgyMGE5YTE2NTc4NzNhZGM5MDYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGUzMzYwMmRjZGVhNGY5MjllYmNhOWM0OWQwZmFjZjcgPSAkKCc8ZGl2IGlkPSJodG1sXzBlMzM2MDJkY2RlYTRmOTI5ZWJjYTljNDlkMGZhY2Y3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PeGZhbSAoTG9uZG9uKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNmRlNWQ1NzYyMzQ4NDgyMGE5YTE2NTc4NzNhZGM5MDYuc2V0Q29udGVudChodG1sXzBlMzM2MDJkY2RlYTRmOTI5ZWJjYTljNDlkMGZhY2Y3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzZmMzBmNTc4ODBjMDQ5YTM4NTNlY2U4NzA5YzNkOGUwLmJpbmRQb3B1cChwb3B1cF82ZGU1ZDU3NjIzNDg0ODIwYTlhMTY1Nzg3M2FkYzkwNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjY1MTY5YTUyMGIxNGRlMWJhNWVlYjRkMTdiMjQ2MGMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41MDczNTA5LC0wLjEyNzc1ODNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDIzNCw3Nyw5NCknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjM0LDc3LDk0KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF8wNjA1YmZlMjczYjI0Y2FmOWU3MGNiNTRlYzMxOWRhNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xMTdiODc5YTQzMjk0YTkxOTJhNzlkMDE4NmIzNDk5NiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xODI5NzAyYzhlMTA0OTE1YjZmNzdjOWIwN2IxOWQzOCA9ICQoJzxkaXYgaWQ9Imh0bWxfMTgyOTcwMmM4ZTEwNDkxNWI2Zjc3YzliMDdiMTlkMzgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRpc3J1cHREaXNhYmlsaXR5IChMb25kb24pPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xMTdiODc5YTQzMjk0YTkxOTJhNzlkMDE4NmIzNDk5Ni5zZXRDb250ZW50KGh0bWxfMTgyOTcwMmM4ZTEwNDkxNWI2Zjc3YzliMDdiMTlkMzgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjY1MTY5YTUyMGIxNGRlMWJhNWVlYjRkMTdiMjQ2MGMuYmluZFBvcHVwKHBvcHVwXzExN2I4NzlhNDMyOTRhOTE5MmE3OWQwMTg2YjM0OTk2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xMjdhMzMzYTE0MjQ0YjY5YmViMTBhMWZlY2NlMmQyMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjQ1NDUxMywtMi41ODc5MV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjM0LDc3LDk0KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyMzQsNzcsOTQpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzA2MDViZmUyNzNiMjRjYWY5ZTcwY2I1NGVjMzE5ZGE0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E2NTE4OTMwY2ZiMjQ5NWFhOTMyZTFlOTNhMzc1ZWJhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzgwNDllNTZmYTViOTQyODZhZjc3MDViNTRlOTBkMDFmID0gJCgnPGRpdiBpZD0iaHRtbF84MDQ5ZTU2ZmE1Yjk0Mjg2YWY3NzA1YjU0ZTkwZDAxZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QnJpc3RvbCBCcmFpbGxlIFRlY2hub2xvZ3kgQ0lDIChCcmlzdG9sKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTY1MTg5MzBjZmIyNDk1YWE5MzJlMWU5M2EzNzVlYmEuc2V0Q29udGVudChodG1sXzgwNDllNTZmYTViOTQyODZhZjc3MDViNTRlOTBkMDFmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzEyN2EzMzNhMTQyNDRiNjliZWIxMGExZmVjY2UyZDIwLmJpbmRQb3B1cChwb3B1cF9hNjUxODkzMGNmYjI0OTVhYTkzMmUxZTkzYTM3NWViYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZGRjMTFiOTI2ZTQ5NDhiMDg1NTNhNTFjYjA5YzE5NjQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41MDczNTA5LC0wLjEyNzc1ODNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDIzNCw3Nyw5NCknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjM0LDc3LDk0KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF8wNjA1YmZlMjczYjI0Y2FmOWU3MGNiNTRlYzMxOWRhNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wODFmYWJiNDZhMDQ0NzRiYWYwYzI1YzQ4MTE1NjNmYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82NTY5MjgxNmJiMDc0YWYyOWZiNjkyZmFiYWEyMDJlZiA9ICQoJzxkaXYgaWQ9Imh0bWxfNjU2OTI4MTZiYjA3NGFmMjlmYjY5MmZhYmFhMjAyZWYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRlUGF1bCBVSyAoTG9uZG9uKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDgxZmFiYjQ2YTA0NDc0YmFmMGMyNWM0ODExNTYzZmMuc2V0Q29udGVudChodG1sXzY1NjkyODE2YmIwNzRhZjI5ZmI2OTJmYWJhYTIwMmVmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2RkYzExYjkyNmU0OTQ4YjA4NTUzYTUxY2IwOWMxOTY0LmJpbmRQb3B1cChwb3B1cF8wODFmYWJiNDZhMDQ0NzRiYWYwYzI1YzQ4MTE1NjNmYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTZjYzgzY2ZmN2NmNDViYThkZmU0YWJiZWNmMmNiYzYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1NC4wNDY1NzUsLTIuODAwNzM5OV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjM0LDc3LDk0KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyMzQsNzcsOTQpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzA2MDViZmUyNzNiMjRjYWY5ZTcwY2I1NGVjMzE5ZGE0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzFlYWM3MTI2MzdmMTRmMWM4NGIzZTcyMjEwZGI4YjM0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzI2MTg4Y2VkNzRmNjRiNGM5ZDBmOTE5MjcyNTE1MGEyID0gJCgnPGRpdiBpZD0iaHRtbF8yNjE4OGNlZDc0ZjY0YjRjOWQwZjkxOTI3MjUxNTBhMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VGhlIFdlbGwgKExhbmNhc3Rlcik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzFlYWM3MTI2MzdmMTRmMWM4NGIzZTcyMjEwZGI4YjM0LnNldENvbnRlbnQoaHRtbF8yNjE4OGNlZDc0ZjY0YjRjOWQwZjkxOTI3MjUxNTBhMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85NmNjODNjZmY3Y2Y0NWJhOGRmZTRhYmJlY2YyY2JjNi5iaW5kUG9wdXAocG9wdXBfMWVhYzcxMjYzN2YxNGYxYzg0YjNlNzIyMTBkYjhiMzQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2M1NGVmY2JkMTk1ZjQ3MDI4MjEzN2NmMGI0NmVhOTNlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTUuOTUzMjUyLC0zLjE4ODI2N10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjM0LDc3LDk0KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyMzQsNzcsOTQpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzA2MDViZmUyNzNiMjRjYWY5ZTcwY2I1NGVjMzE5ZGE0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzczOWI2ZjgwYWJmMzRhMjA4ZWNmZjM0ZTIyNDA5YjFhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY1MTNmMWE3OTg3ZTQzZTZiNzljMmZhOWMwMzVkMGJjID0gJCgnPGRpdiBpZD0iaHRtbF82NTEzZjFhNzk4N2U0M2U2Yjc5YzJmYTljMDM1ZDBiYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U2hlbHRlciBTY290bGFuZCAoRWRpbmJ1cmdoKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzM5YjZmODBhYmYzNGEyMDhlY2ZmMzRlMjI0MDliMWEuc2V0Q29udGVudChodG1sXzY1MTNmMWE3OTg3ZTQzZTZiNzljMmZhOWMwMzVkMGJjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2M1NGVmY2JkMTk1ZjQ3MDI4MjEzN2NmMGI0NmVhOTNlLmJpbmRQb3B1cChwb3B1cF83MzliNmY4MGFiZjM0YTIwOGVjZmYzNGUyMjQwOWIxYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTY5MjBkZDE1OTcxNGM2MjlmNzc3MTA3NjY0NTMzYzkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MC43MTg0MTIsLTMuNTMzODk5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyMzQsNzcsOTQpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDIzNCw3Nyw5NCknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMDYwNWJmZTI3M2IyNGNhZjllNzBjYjU0ZWMzMTlkYTQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTE2NzRlZTBlODA3NDY0ZWIxZDNlZWY2ZTI0ZmY2ZmYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWFjMjE2NjFhNmQ3NDJjNWFlMWQyNmU3NDQwMDNkM2UgPSAkKCc8ZGl2IGlkPSJodG1sXzVhYzIxNjYxYTZkNzQyYzVhZTFkMjZlNzQ0MDAzZDNlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XRVNDIEZvdW5kYXRpb24gLSBUaGUgU3BlY2lhbGlzdCBDZW50cmUgZm9yIFZpc3VhbCBJbXBhaXJtZW50IChFeGV0ZXIpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lMTY3NGVlMGU4MDc0NjRlYjFkM2VlZjZlMjRmZjZmZi5zZXRDb250ZW50KGh0bWxfNWFjMjE2NjFhNmQ3NDJjNWFlMWQyNmU3NDQwMDNkM2UpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTY5MjBkZDE1OTcxNGM2MjlmNzc3MTA3NjY0NTMzYzkuYmluZFBvcHVwKHBvcHVwX2UxNjc0ZWUwZTgwNzQ2NGViMWQzZWVmNmUyNGZmNmZmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iMGMyM2E1MjZhN2U0MWEwYTFiNTU2NmNhNzBmYWQ2MCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjUwNzM1MDksLTAuMTI3NzU4M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjM0LDc3LDk0KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyMzQsNzcsOTQpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzA2MDViZmUyNzNiMjRjYWY5ZTcwY2I1NGVjMzE5ZGE0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzY0N2Q1N2NmYmY3MTQ2YzBiMjA4YjVmM2Y2Y2I1YmI0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzExNDFiODJmZTRlNTRkNDI4ZjY2NDc1ZmIxZTA3OWNjID0gJCgnPGRpdiBpZD0iaHRtbF8xMTQxYjgyZmU0ZTU0ZDQyOGY2NjQ3NWZiMWUwNzljYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VGhlIEFsZXhhbmRyYSBSb3NlIENoYXJpdHkgKExvbmRvbik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY0N2Q1N2NmYmY3MTQ2YzBiMjA4YjVmM2Y2Y2I1YmI0LnNldENvbnRlbnQoaHRtbF8xMTQxYjgyZmU0ZTU0ZDQyOGY2NjQ3NWZiMWUwNzljYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iMGMyM2E1MjZhN2U0MWEwYTFiNTU2NmNhNzBmYWQ2MC5iaW5kUG9wdXAocG9wdXBfNjQ3ZDU3Y2ZiZjcxNDZjMGIyMDhiNWYzZjZjYjViYjQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2QzOTMwOGU4NGEwNjRmMmQ5MWI1ZDJiNDhmZWMzNGUwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNDU0NTEzLC0yLjU4NzkxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyMzQsNzcsOTQpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDIzNCw3Nyw5NCknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMDYwNWJmZTI3M2IyNGNhZjllNzBjYjU0ZWMzMTlkYTQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfY2NjYjgzOWI0Mzc5NGExY2E1NDFhOTExNThlYjZmMWQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDVkNzZiOTljNjZjNDcwMjg2Zjc1MzYwNDU0M2FlNGMgPSAkKCc8ZGl2IGlkPSJodG1sXzQ1ZDc2Yjk5YzY2YzQ3MDI4NmY3NTM2MDQ1NDNhZTRjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Xb21lbiYjMzk7cyBBaWQgKEJyaXN0b2wpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jY2NiODM5YjQzNzk0YTFjYTU0MWE5MTE1OGViNmYxZC5zZXRDb250ZW50KGh0bWxfNDVkNzZiOTljNjZjNDcwMjg2Zjc1MzYwNDU0M2FlNGMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDM5MzA4ZTg0YTA2NGYyZDkxYjVkMmI0OGZlYzM0ZTAuYmluZFBvcHVwKHBvcHVwX2NjY2I4MzliNDM3OTRhMWNhNTQxYTkxMTU4ZWI2ZjFkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBsYXllcl9jb250cm9sXzFjOTM2YTc0NTRkODQ3OGNhZDE3MTk3ZjY4YjI5M2RjID0gewogICAgICAgICAgICAgICAgYmFzZV9sYXllcnMgOiB7ICJzdGFtZW50b25lciIgOiB0aWxlX2xheWVyX2M5NTgwYWI3NzQ3YTRmNzhiNmY3OTQyZmQ2MzY4MDdhLCB9LAogICAgICAgICAgICAgICAgb3ZlcmxheXMgOiB7ICJVbnN1Y2Nlc3NmdWwiIDogZmVhdHVyZV9ncm91cF9iM2YwODBmOTg1N2E0YWE2OTQ0OTYxOGVkMWRmZDA3OCwiVW5zdWNjZXNzZnVsIC0gbG9uZ2xpc3RlZCIgOiBmZWF0dXJlX2dyb3VwXzBiNWU3NzdjOThiYzRmOTBhN2Y1Mjg2NzQwZjc4NTZhLCJGdW5kZWQiIDogZmVhdHVyZV9ncm91cF8wNjA1YmZlMjczYjI0Y2FmOWU3MGNiNTRlYzMxOWRhNCwgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgTC5jb250cm9sLmxheWVycygKICAgICAgICAgICAgICAgIGxheWVyX2NvbnRyb2xfMWM5MzZhNzQ1NGQ4NDc4Y2FkMTcxOTdmNjhiMjkzZGMuYmFzZV9sYXllcnMsCiAgICAgICAgICAgICAgICBsYXllcl9jb250cm9sXzFjOTM2YTc0NTRkODQ3OGNhZDE3MTk3ZjY4YjI5M2RjLm92ZXJsYXlzLAogICAgICAgICAgICAgICAge3Bvc2l0aW9uOiAndG9wcmlnaHQnLAogICAgICAgICAgICAgICAgIGNvbGxhcHNlZDogdHJ1ZSwKICAgICAgICAgICAgICAgICBhdXRvWkluZGV4OiB0cnVlCiAgICAgICAgICAgICAgICB9KS5hZGRUbyhtYXBfNTIyMjVhNzJiM2Q1NDQ4ZWJmZWQxMjcwMjlkMzc2YzQpOwogICAgICAgIAo8L3NjcmlwdD4="
                  style="height:600px;width: 100%;border:none !important;"
                  allowfullscreen=""
                  webkitallowfullscreen=""
                  mozallowfullscreen="">

Technology used

Each application was tagged with the technology that was outlined in the application. This was a
difficult judgement to make: the nature of many of the applications and the stage of their development
meant that the specific technology to be used was often not clear or not yet decided. Many applications
described their project in general terms as an "app" or "website", without going into specifics. In the
case of those projects describing a website or app, no applicants mentioned specific technologies
(eg languages, frameworks). In general, when using the word "app" applicants did not specifically mean
a mobile phone app.

Applications using particular technologies

            <iframe src="data:text/html;base64,DQogICAgICAgIDwhLS0gTG9hZCBDaGFydHMuanMgLS0+DQogICAgICAgPHNjcmlwdCBzcmM9J2h0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL0NoYXJ0LmpzLzIuNS4wL0NoYXJ0LmJ1bmRsZS5taW4uanMnPjwvc2NyaXB0Pg0KICAgIA0KICAgICAgICA8Y2FudmFzIGlkPSdjaGFydF90ZWNoJz48L2NhbnZhcz4NCiAgICAgICAgPHNjcmlwdD4NCiAgICAgICAgICAgIHZhciBjdHggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2hhcnRfdGVjaCcpLmdldENvbnRleHQoJzJkJyk7DQogICAgICAgICAgICBjdHguY2FudmFzLndpZHRoICA9IDgwMCAtICguMSAqIDgwMCk7DQogICAgICAgICAgICBjdHguY2FudmFzLmhlaWdodCA9IDUwMCAtICguMTUgKiA1MDApOw0KICAgICAgICAgICAgdmFyIG15TmV3Q2hhcnQgPSBuZXcgQ2hhcnQoY3R4LHsgdHlwZTogJ2hvcml6b250YWxCYXInLCBkYXRhOiB7DQogICAgJ2xhYmVscyc6IFsNCiAgICAgICAgJ0FwcCcsDQogICAgICAgICdXZWJzaXRlJywNCiAgICAgICAgJ0RpcmVjdG9yeScsDQogICAgICAgICdTaGFyaW5nJywNCiAgICAgICAgJ1NvY2lhbCBtZWRpYScsDQogICAgICAgICdIYXJkd2FyZScsDQogICAgICAgICdDaGF0JywNCiAgICAgICAgJ09wZW4gc291cmNlJywNCiAgICAgICAgJ0NvbnRlbnQnLA0KICAgICAgICAnRGF0YSBnYXRoZXJpbmcnDQogICAgXSwNCiAgICAnZGF0YXNldHMnOiBbDQogICAgICAgIHsNCiAgICAgICAgICAgICdiYWNrZ3JvdW5kQ29sb3InOiAncmdiKDI1MiwgMTU4LCAxODUpJywNCiAgICAgICAgICAgICdkYXRhJzogWw0KICAgICAgICAgICAgICAgIDI0LjAsDQogICAgICAgICAgICAgICAgMjAuMCwNCiAgICAgICAgICAgICAgICA3LjAsDQogICAgICAgICAgICAgICAgNi4wLA0KICAgICAgICAgICAgICAgIDYuMCwNCiAgICAgICAgICAgICAgICA2LjAsDQogICAgICAgICAgICAgICAgNS4wLA0KICAgICAgICAgICAgICAgIDMuMCwNCiAgICAgICAgICAgICAgICA0LjAsDQogICAgICAgICAgICAgICAgNi4wDQogICAgICAgICAgICBdLA0KICAgICAgICAgICAgJ2xhYmVsJzogJ1Vuc3VjY2Vzc2Z1bCcNCiAgICAgICAgfSwNCiAgICAgICAgew0KICAgICAgICAgICAgJ2JhY2tncm91bmRDb2xvcic6ICdyZ2IoMCwgMTI4LCAxNTYpJywNCiAgICAgICAgICAgICdkYXRhJzogWw0KICAgICAgICAgICAgICAgIDIwLjAsDQogICAgICAgICAgICAgICAgNC4wLA0KICAgICAgICAgICAgICAgIDMuMCwNCiAgICAgICAgICAgICAgICA0LjAsDQogICAgICAgICAgICAgICAgMy4wLA0KICAgICAgICAgICAgICAgIDEuMCwNCiAgICAgICAgICAgICAgICAyLjAsDQogICAgICAgICAgICAgICAgMy4wLA0KICAgICAgICAgICAgICAgIDMuMCwNCiAgICAgICAgICAgICAgICAwLjANCiAgICAgICAgICAgIF0sDQogICAgICAgICAgICAnbGFiZWwnOiAnVW5zdWNjZXNzZnVsIC0gbG9uZ2xpc3RlZCcNCiAgICAgICAgfSwNCiAgICAgICAgew0KICAgICAgICAgICAgJ2JhY2tncm91bmRDb2xvcic6ICdyZ2IoMjM0LDc3LDk0KScsDQogICAgICAgICAgICAnZGF0YSc6IFsNCiAgICAgICAgICAgICAgICA0LjAsDQogICAgICAgICAgICAgICAgMS4wLA0KICAgICAgICAgICAgICAgIDAuMCwNCiAgICAgICAgICAgICAgICAwLjAsDQogICAgICAgICAgICAgICAgMC4wLA0KICAgICAgICAgICAgICAgIDEuMCwNCiAgICAgICAgICAgICAgICAxLjAsDQogICAgICAgICAgICAgICAgMS4wLA0KICAgICAgICAgICAgICAgIDAuMCwNCiAgICAgICAgICAgICAgICAxLjANCiAgICAgICAgICAgIF0sDQogICAgICAgICAgICAnbGFiZWwnOiAnRnVuZGVkJw0KICAgICAgICB9DQogICAgXQ0KfSwgb3B0aW9uczogew0KICAgICdzY2FsZXMnOiB7DQogICAgICAgICd4QXhlcyc6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAndGlja3MnOiB7DQogICAgICAgICAgICAgICAgICAgICdmb250RmFtaWx5JzogJ1wnUm9ib3RvXCcsc2Fucy1zZXJpZicsDQogICAgICAgICAgICAgICAgICAgICdtaW4nOiAwLA0KICAgICAgICAgICAgICAgICAgICAnZm9udFNpemUnOiAyMA0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgJ2dyaWRMaW5lcyc6IHsNCiAgICAgICAgICAgICAgICAgICAgJ2RyYXdCb3JkZXInOiB0cnVlLA0KICAgICAgICAgICAgICAgICAgICAnZGlzcGxheSc6IGZhbHNlDQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAnc3RhY2tlZCc6IHRydWUNCiAgICAgICAgICAgIH0NCiAgICAgICAgXSwNCiAgICAgICAgJ3lBeGVzJzogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICd0aWNrcyc6IHsNCiAgICAgICAgICAgICAgICAgICAgJ2ZvbnRGYW1pbHknOiAnXCdSb2JvdG9cJyxzYW5zLXNlcmlmJywNCiAgICAgICAgICAgICAgICAgICAgJ2ZvbnRTaXplJzogMjANCiAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgICdncmlkTGluZXMnOiB7DQogICAgICAgICAgICAgICAgICAgICdkcmF3Qm9yZGVyJzogZmFsc2UsDQogICAgICAgICAgICAgICAgICAgICdkaXNwbGF5JzogZmFsc2UNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIF0NCiAgICB9LA0KICAgICdsZWdlbmQnOiB7DQogICAgICAgICdsYWJlbHMnOiB7DQogICAgICAgICAgICAnZm9udEZhbWlseSc6ICdcJ1JvYm90b1wnLHNhbnMtc2VyaWYnLA0KICAgICAgICAgICAgJ2ZvbnRTaXplJzogMTYNCiAgICAgICAgfSwNCiAgICAgICAgJ3Bvc2l0aW9uJzogJ2JvdHRvbScNCiAgICB9LA0KICAgICdyZXNwb25zaXZlJzogZmFsc2UNCn0gfSk7DQogICAgICAgIDwvc2NyaXB0Pg0KICAgIA=="
                  style="height:600px;width: 100%;border:none !important;"
                  allowfullscreen=""
                  webkitallowfullscreen=""
                  mozallowfullscreen="">

Tags were applied to all 141 applications, with 57 applications having one tag
applied and 84 having more than one. The most used tag was "app",
which was applied to 48 applications, followed by "website" (25),
"sharing" (10) and "directory" (10).
8 applications involved using hardware, while 9
used social media.

Unsuccessful
Unsuccessful - longlisted
Funded
All

app
24
20
4
48

website
20
4
1
25

directory
7
3
0
10

sharing
6
4
0
10

social media
6
3
0
9

hardware
6
1
1
8

chat
5
2
1
8

open source
3
3
1
7

content
4
3
0
7

data gathering
6
0
1
7

mobile app
3
2
0
5

video
4
1
0
5

webinars
3
1
0
4

online community
3
1
0
4

tablet
3
0
0
3

game
2
0
1
3

youtube
3
0
0
3

web app
2
1
0
3

media
3
0
0
3

smartphone
1
1
1
3

Types of approach

A better approach for understanding applicants' intentions is to look at the approach they are taking
in the work. These are focused on what the technology will actually do: provide information to users,
provide an actual service, or connect with other users.

Approaches used by applications

            <iframe src="data:text/html;base64,DQogICAgICAgIDwhLS0gTG9hZCBDaGFydHMuanMgLS0+DQogICAgICAgPHNjcmlwdCBzcmM9J2h0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL0NoYXJ0LmpzLzIuNS4wL0NoYXJ0LmJ1bmRsZS5taW4uanMnPjwvc2NyaXB0Pg0KICAgIA0KICAgICAgICA8Y2FudmFzIGlkPSdjaGFydF9hcHByb2FjaGVzJz48L2NhbnZhcz4NCiAgICAgICAgPHNjcmlwdD4NCiAgICAgICAgICAgIHZhciBjdHggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2hhcnRfYXBwcm9hY2hlcycpLmdldENvbnRleHQoJzJkJyk7DQogICAgICAgICAgICBjdHguY2FudmFzLndpZHRoICA9IDgwMCAtICguMSAqIDgwMCk7DQogICAgICAgICAgICBjdHguY2FudmFzLmhlaWdodCA9IDUwMCAtICguMTUgKiA1MDApOw0KICAgICAgICAgICAgdmFyIG15TmV3Q2hhcnQgPSBuZXcgQ2hhcnQoY3R4LHsgdHlwZTogJ2hvcml6b250YWxCYXInLCBkYXRhOiB7DQogICAgJ2xhYmVscyc6IFsNCiAgICAgICAgJ1Byb3ZpZGluZyBpbmZvcm1hdGlvbicsDQogICAgICAgICdBZHZpY2UnLA0KICAgICAgICAnUHJvdmlkaW5nIHNlcnZpY2VzJywNCiAgICAgICAgJ1BlZXIgc3VwcG9ydCcsDQogICAgICAgICdUcmFpbmluZycsDQogICAgICAgICdFZHVjYXRpb24nLA0KICAgICAgICAnRmluZGluZyBvcHBvcnR1bml0aWVzJywNCiAgICAgICAgJ0xlYXJuaW5nJywNCiAgICAgICAgJ0ZpbmRpbmcgc2VydmljZXMnLA0KICAgICAgICAnUHJvdmlkaW5nIHN1cHBvcnQnLA0KICAgICAgICAnU2tpbGxzJywNCiAgICAgICAgJ1JlcG9ydGluZycsDQogICAgICAgICdEaXJlY3RvcnknLA0KICAgICAgICAnT3JnYW5pc2F0aW9uJywNCiAgICAgICAgJ1Nob3djYXNlJywNCiAgICAgICAgJ1NlbGYtYXNzZXNzbWVudCcNCiAgICBdLA0KICAgICdkYXRhc2V0cyc6IFsNCiAgICAgICAgew0KICAgICAgICAgICAgJ2JhY2tncm91bmRDb2xvcic6ICdyZ2IoMjM0LDc3LDk0KScsDQogICAgICAgICAgICAnZGF0YSc6IFsNCiAgICAgICAgICAgICAgICAxLjAsDQogICAgICAgICAgICAgICAgMy4wLA0KICAgICAgICAgICAgICAgIDMuMCwNCiAgICAgICAgICAgICAgICAxLjAsDQogICAgICAgICAgICAgICAgMS4wLA0KICAgICAgICAgICAgICAgIDEuMCwNCiAgICAgICAgICAgICAgICAwLjAsDQogICAgICAgICAgICAgICAgMC4wLA0KICAgICAgICAgICAgICAgIDEuMCwNCiAgICAgICAgICAgICAgICAwLjAsDQogICAgICAgICAgICAgICAgMC4wLA0KICAgICAgICAgICAgICAgIDAuMCwNCiAgICAgICAgICAgICAgICAwLjAsDQogICAgICAgICAgICAgICAgMC4wLA0KICAgICAgICAgICAgICAgIDAuMCwNCiAgICAgICAgICAgICAgICAwLjANCiAgICAgICAgICAgIF0sDQogICAgICAgICAgICAnbGFiZWwnOiAnRnVuZGVkJw0KICAgICAgICB9LA0KICAgICAgICB7DQogICAgICAgICAgICAnYmFja2dyb3VuZENvbG9yJzogJ3JnYigyNTIsIDE1OCwgMTg1KScsDQogICAgICAgICAgICAnZGF0YSc6IFsNCiAgICAgICAgICAgICAgICAyMC4wLA0KICAgICAgICAgICAgICAgIDE0LjAsDQogICAgICAgICAgICAgICAgMTMuMCwNCiAgICAgICAgICAgICAgICA4LjAsDQogICAgICAgICAgICAgICAgMTEuMCwNCiAgICAgICAgICAgICAgICA4LjAsDQogICAgICAgICAgICAgICAgMy4wLA0KICAgICAgICAgICAgICAgIDUuMCwNCiAgICAgICAgICAgICAgICAxLjAsDQogICAgICAgICAgICAgICAgNC4wLA0KICAgICAgICAgICAgICAgIDIuMCwNCiAgICAgICAgICAgICAgICAxLjAsDQogICAgICAgICAgICAgICAgMi4wLA0KICAgICAgICAgICAgICAgIDEuMCwNCiAgICAgICAgICAgICAgICAxLjAsDQogICAgICAgICAgICAgICAgMi4wDQogICAgICAgICAgICBdLA0KICAgICAgICAgICAgJ2xhYmVsJzogJ1Vuc3VjY2Vzc2Z1bCcNCiAgICAgICAgfSwNCiAgICAgICAgew0KICAgICAgICAgICAgJ2JhY2tncm91bmRDb2xvcic6ICdyZ2IoMCwgMTI4LCAxNTYpJywNCiAgICAgICAgICAgICdkYXRhJzogWw0KICAgICAgICAgICAgICAgIDkuMCwNCiAgICAgICAgICAgICAgICA3LjAsDQogICAgICAgICAgICAgICAgNy4wLA0KICAgICAgICAgICAgICAgIDQuMCwNCiAgICAgICAgICAgICAgICAxLjAsDQogICAgICAgICAgICAgICAgMS4wLA0KICAgICAgICAgICAgICAgIDUuMCwNCiAgICAgICAgICAgICAgICAyLjAsDQogICAgICAgICAgICAgICAgNS4wLA0KICAgICAgICAgICAgICAgIDEuMCwNCiAgICAgICAgICAgICAgICAyLjAsDQogICAgICAgICAgICAgICAgMS4wLA0KICAgICAgICAgICAgICAgIDAuMCwNCiAgICAgICAgICAgICAgICAxLjAsDQogICAgICAgICAgICAgICAgMS4wLA0KICAgICAgICAgICAgICAgIDAuMA0KICAgICAgICAgICAgXSwNCiAgICAgICAgICAgICdsYWJlbCc6ICdVbnN1Y2Nlc3NmdWwgLSBsb25nbGlzdGVkJw0KICAgICAgICB9DQogICAgXQ0KfSwgb3B0aW9uczogew0KICAgICdzY2FsZXMnOiB7DQogICAgICAgICd4QXhlcyc6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAndGlja3MnOiB7DQogICAgICAgICAgICAgICAgICAgICdmb250RmFtaWx5JzogJ1wnUm9ib3RvXCcsc2Fucy1zZXJpZicsDQogICAgICAgICAgICAgICAgICAgICdtaW4nOiAwLA0KICAgICAgICAgICAgICAgICAgICAnZm9udFNpemUnOiAyMA0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgJ2dyaWRMaW5lcyc6IHsNCiAgICAgICAgICAgICAgICAgICAgJ2RyYXdCb3JkZXInOiB0cnVlLA0KICAgICAgICAgICAgICAgICAgICAnZGlzcGxheSc6IGZhbHNlDQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAnc3RhY2tlZCc6IHRydWUNCiAgICAgICAgICAgIH0NCiAgICAgICAgXSwNCiAgICAgICAgJ3lBeGVzJzogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICd0aWNrcyc6IHsNCiAgICAgICAgICAgICAgICAgICAgJ2ZvbnRGYW1pbHknOiAnXCdSb2JvdG9cJyxzYW5zLXNlcmlmJywNCiAgICAgICAgICAgICAgICAgICAgJ2ZvbnRTaXplJzogMjANCiAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgICdncmlkTGluZXMnOiB7DQogICAgICAgICAgICAgICAgICAgICdkcmF3Qm9yZGVyJzogZmFsc2UsDQogICAgICAgICAgICAgICAgICAgICdkaXNwbGF5JzogZmFsc2UNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIF0NCiAgICB9LA0KICAgICdsZWdlbmQnOiB7DQogICAgICAgICdsYWJlbHMnOiB7DQogICAgICAgICAgICAnZm9udEZhbWlseSc6ICdcJ1JvYm90b1wnLHNhbnMtc2VyaWYnLA0KICAgICAgICAgICAgJ2ZvbnRTaXplJzogMTYNCiAgICAgICAgfSwNCiAgICAgICAgJ3Bvc2l0aW9uJzogJ2JvdHRvbScNCiAgICB9LA0KICAgICdyZXNwb25zaXZlJzogZmFsc2UNCn0gfSk7DQogICAgICAgIDwvc2NyaXB0Pg0KICAgIA=="
                  style="height:600px;width: 100%;border:none !important;"
                  allowfullscreen=""
                  webkitallowfullscreen=""
                  mozallowfullscreen="">

30 applicants said that their project would involve providing information, with 24
applications involving advice and 23 providing services. 11
of the organisations that are providing advice also said they were providing information, so there is
overlap between the first two categories.

Funded
Unsuccessful
Unsuccessful - longlisted
All

providing information
1
20
9
30

advice
3
14
7
24

providing services
3
13
7
23

peer support
1
8
4
13

training
1
11
1
13

education
1
8
1
10

finding opportunities
0
3
5
8

learning
0
5
2
7

finding services
1
1
5
7

providing support
0
4
1
5

skills
0
2
2
4

reporting
0
1
1
2

directory
0
2
0
2

organisation
0
1
1
2

showcase
0
1
1
2

self-assessment
0
2
0
2

While providing information was the most popular category, only one of the successful applications
is using this approach. A smaller proportion of applications intending to provide information
made it through to the longlisting stage that for advice or services.

Focus of application

Applications were tagged with the problem or theme they are focusing on, based on both Comic Relief's four
key themes and Paul Hamlyn Foundation's priorities of migration and youth. The themes used were:

Health and wellbeing (Comic Relief)

Stronger communities (Comic Relief)

Children and young people (Comic Relief and Paul Hamlyn Foundation)

Women and girls (Comic Relief)

Migration (Paul Hamlyn Foundation)

Focus of applications

            <iframe src="data:text/html;base64,DQogICAgICAgIDwhLS0gTG9hZCBDaGFydHMuanMgLS0+DQogICAgICAgPHNjcmlwdCBzcmM9J2h0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL0NoYXJ0LmpzLzIuNS4wL0NoYXJ0LmJ1bmRsZS5taW4uanMnPjwvc2NyaXB0Pg0KICAgIA0KICAgICAgICA8Y2FudmFzIGlkPSdjaGFydF9mb2N1cyc+PC9jYW52YXM+DQogICAgICAgIDxzY3JpcHQ+DQogICAgICAgICAgICB2YXIgY3R4ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NoYXJ0X2ZvY3VzJykuZ2V0Q29udGV4dCgnMmQnKTsNCiAgICAgICAgICAgIGN0eC5jYW52YXMud2lkdGggID0gODAwIC0gKC4xICogODAwKTsNCiAgICAgICAgICAgIGN0eC5jYW52YXMuaGVpZ2h0ID0gNTAwIC0gKC4xNSAqIDUwMCk7DQogICAgICAgICAgICB2YXIgbXlOZXdDaGFydCA9IG5ldyBDaGFydChjdHgseyB0eXBlOiAnaG9yaXpvbnRhbEJhcicsIGRhdGE6IHsNCiAgICAnbGFiZWxzJzogWw0KICAgICAgICAnSGVhbHRoIGFuZCB3ZWxsYmVpbmcnLA0KICAgICAgICAnU3Ryb25nZXIgY29tbXVuaXRpZXMnLA0KICAgICAgICAnQ2hpbGRyZW4gYW5kIHlvdW5nIHBlb3BsZScsDQogICAgICAgICdXb21lbiBhbmQgZ2lybHMnLA0KICAgICAgICAnTWlncmF0aW9uJw0KICAgIF0sDQogICAgJ2RhdGFzZXRzJzogWw0KICAgICAgICB7DQogICAgICAgICAgICAnbGFiZWwnOiAnRnVuZGVkJywNCiAgICAgICAgICAgICdiYWNrZ3JvdW5kQ29sb3InOiAncmdiKDIzNCw3Nyw5NCknLA0KICAgICAgICAgICAgJ2RhdGEnOiBbDQogICAgICAgICAgICAgICAgNS4wLA0KICAgICAgICAgICAgICAgIDIuMCwNCiAgICAgICAgICAgICAgICAxLjAsDQogICAgICAgICAgICAgICAgMS4wLA0KICAgICAgICAgICAgICAgIDAuMA0KICAgICAgICAgICAgXQ0KICAgICAgICB9LA0KICAgICAgICB7DQogICAgICAgICAgICAnbGFiZWwnOiAnVW5zdWNjZXNzZnVsJywNCiAgICAgICAgICAgICdiYWNrZ3JvdW5kQ29sb3InOiAncmdiKDI1MiwgMTU4LCAxODUpJywNCiAgICAgICAgICAgICdkYXRhJzogWw0KICAgICAgICAgICAgICAgIDI5LjAsDQogICAgICAgICAgICAgICAgMjQuMCwNCiAgICAgICAgICAgICAgICAyMS4wLA0KICAgICAgICAgICAgICAgIDEyLjAsDQogICAgICAgICAgICAgICAgNi4wDQogICAgICAgICAgICBdDQogICAgICAgIH0sDQogICAgICAgIHsNCiAgICAgICAgICAgICdsYWJlbCc6ICdVbnN1Y2Nlc3NmdWwgLSBsb25nbGlzdGVkJywNCiAgICAgICAgICAgICdiYWNrZ3JvdW5kQ29sb3InOiAncmdiKDAsIDEyOCwgMTU2KScsDQogICAgICAgICAgICAnZGF0YSc6IFsNCiAgICAgICAgICAgICAgICAxMC4wLA0KICAgICAgICAgICAgICAgIDExLjAsDQogICAgICAgICAgICAgICAgMTEuMCwNCiAgICAgICAgICAgICAgICAzLjAsDQogICAgICAgICAgICAgICAgMS4wDQogICAgICAgICAgICBdDQogICAgICAgIH0NCiAgICBdDQp9LCBvcHRpb25zOiB7DQogICAgJ3NjYWxlcyc6IHsNCiAgICAgICAgJ3hBeGVzJzogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICdncmlkTGluZXMnOiB7DQogICAgICAgICAgICAgICAgICAgICdkaXNwbGF5JzogZmFsc2UsDQogICAgICAgICAgICAgICAgICAgICdkcmF3Qm9yZGVyJzogdHJ1ZQ0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgJ3RpY2tzJzogew0KICAgICAgICAgICAgICAgICAgICAnZm9udEZhbWlseSc6ICdcJ1JvYm90b1wnLHNhbnMtc2VyaWYnLA0KICAgICAgICAgICAgICAgICAgICAnZm9udFNpemUnOiAyMCwNCiAgICAgICAgICAgICAgICAgICAgJ21pbic6IDANCiAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgICdzdGFja2VkJzogdHJ1ZQ0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAneUF4ZXMnOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgJ2dyaWRMaW5lcyc6IHsNCiAgICAgICAgICAgICAgICAgICAgJ2Rpc3BsYXknOiBmYWxzZSwNCiAgICAgICAgICAgICAgICAgICAgJ2RyYXdCb3JkZXInOiBmYWxzZQ0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgJ3RpY2tzJzogew0KICAgICAgICAgICAgICAgICAgICAnZm9udEZhbWlseSc6ICdcJ1JvYm90b1wnLHNhbnMtc2VyaWYnLA0KICAgICAgICAgICAgICAgICAgICAnZm9udFNpemUnOiAyMA0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgXQ0KICAgIH0sDQogICAgJ2xlZ2VuZCc6IHsNCiAgICAgICAgJ2xhYmVscyc6IHsNCiAgICAgICAgICAgICdmb250RmFtaWx5JzogJ1wnUm9ib3RvXCcsc2Fucy1zZXJpZicsDQogICAgICAgICAgICAnZm9udFNpemUnOiAxNg0KICAgICAgICB9LA0KICAgICAgICAncG9zaXRpb24nOiAnYm90dG9tJw0KICAgIH0sDQogICAgJ3Jlc3BvbnNpdmUnOiBmYWxzZQ0KfSB9KTsNCiAgICAgICAgPC9zY3JpcHQ+DQogICAg"
                  style="height:600px;width: 100%;border:none !important;"
                  allowfullscreen=""
                  webkitallowfullscreen=""
                  mozallowfullscreen="">

Almost one-third of applications related to health and wellbeing, with five of the ten successful
applications working in this area. In addition to these key themes were some other problems being
addressed that occured in more than one application. These included loneliness (7 applications),
mental health (6) and homelessness (4).

Funded
Unsuccessful
Unsuccessful - longlisted
All

health and wellbeing
5
28
11
44

stronger communities
2
21
14
37

children and young people
1
22
10
33

women and girls
1
12
3
16

migration
0
5
2
7

Target audience

We identified five major target audiences across the applications. Most applications related to providing
a service to the organisations' beneficiaries directly, with 115 applications choosing this audience.
22 applications were aimed at professionals who work with those beneficiaries - e.g. teachers,
care workers, health workers. Ten applications are aimed at the general public, nine at organisations
and two at volunteers or campaigners. All of the successful applications work directly with beneficiaries.

Audience of applications

            <iframe src="data:text/html;base64,DQogICAgICAgIDwhLS0gTG9hZCBDaGFydHMuanMgLS0+DQogICAgICAgPHNjcmlwdCBzcmM9J2h0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL0NoYXJ0LmpzLzIuNS4wL0NoYXJ0LmJ1bmRsZS5taW4uanMnPjwvc2NyaXB0Pg0KICAgIA0KICAgICAgICA8Y2FudmFzIGlkPSdjaGFydF9hdWRpZW5jZSc+PC9jYW52YXM+DQogICAgICAgIDxzY3JpcHQ+DQogICAgICAgICAgICB2YXIgY3R4ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NoYXJ0X2F1ZGllbmNlJykuZ2V0Q29udGV4dCgnMmQnKTsNCiAgICAgICAgICAgIGN0eC5jYW52YXMud2lkdGggID0gODAwIC0gKC4xICogODAwKTsNCiAgICAgICAgICAgIGN0eC5jYW52YXMuaGVpZ2h0ID0gNTAwIC0gKC4xNSAqIDUwMCk7DQogICAgICAgICAgICB2YXIgbXlOZXdDaGFydCA9IG5ldyBDaGFydChjdHgseyB0eXBlOiAnaG9yaXpvbnRhbEJhcicsIGRhdGE6IHsNCiAgICAnbGFiZWxzJzogWw0KICAgICAgICAnQmVuZWZpY2lhcmllcycsDQogICAgICAgICdQcm9mZXNzaW9uYWxzJywNCiAgICAgICAgJ1B1YmxpYycsDQogICAgICAgICdPcmdhbmlzYXRpb25zJywNCiAgICAgICAgJ1ZvbHVudGVlcnMnDQogICAgXSwNCiAgICAnZGF0YXNldHMnOiBbDQogICAgICAgIHsNCiAgICAgICAgICAgICdsYWJlbCc6ICdGdW5kZWQnLA0KICAgICAgICAgICAgJ2JhY2tncm91bmRDb2xvcic6ICdyZ2IoMjM0LDc3LDk0KScsDQogICAgICAgICAgICAnZGF0YSc6IFsNCiAgICAgICAgICAgICAgICAxMC4wLA0KICAgICAgICAgICAgICAgIDEuMCwNCiAgICAgICAgICAgICAgICAwLjAsDQogICAgICAgICAgICAgICAgMC4wLA0KICAgICAgICAgICAgICAgIDAuMA0KICAgICAgICAgICAgXQ0KICAgICAgICB9LA0KICAgICAgICB7DQogICAgICAgICAgICAnbGFiZWwnOiAnVW5zdWNjZXNzZnVsJywNCiAgICAgICAgICAgICdiYWNrZ3JvdW5kQ29sb3InOiAncmdiKDI1MiwgMTU4LCAxODUpJywNCiAgICAgICAgICAgICdkYXRhJzogWw0KICAgICAgICAgICAgICAgIDc0LjAsDQogICAgICAgICAgICAgICAgMTYuMCwNCiAgICAgICAgICAgICAgICA4LjAsDQogICAgICAgICAgICAgICAgNy4wLA0KICAgICAgICAgICAgICAgIDEuMA0KICAgICAgICAgICAgXQ0KICAgICAgICB9LA0KICAgICAgICB7DQogICAgICAgICAgICAnbGFiZWwnOiAnVW5zdWNjZXNzZnVsIC0gbG9uZ2xpc3RlZCcsDQogICAgICAgICAgICAnYmFja2dyb3VuZENvbG9yJzogJ3JnYigwLCAxMjgsIDE1NiknLA0KICAgICAgICAgICAgJ2RhdGEnOiBbDQogICAgICAgICAgICAgICAgMzEuMCwNCiAgICAgICAgICAgICAgICA1LjAsDQogICAgICAgICAgICAgICAgMi4wLA0KICAgICAgICAgICAgICAgIDIuMCwNCiAgICAgICAgICAgICAgICAxLjANCiAgICAgICAgICAgIF0NCiAgICAgICAgfQ0KICAgIF0NCn0sIG9wdGlvbnM6IHsNCiAgICAnc2NhbGVzJzogew0KICAgICAgICAneEF4ZXMnOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgJ2dyaWRMaW5lcyc6IHsNCiAgICAgICAgICAgICAgICAgICAgJ2Rpc3BsYXknOiBmYWxzZSwNCiAgICAgICAgICAgICAgICAgICAgJ2RyYXdCb3JkZXInOiB0cnVlDQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAndGlja3MnOiB7DQogICAgICAgICAgICAgICAgICAgICdmb250RmFtaWx5JzogJ1wnUm9ib3RvXCcsc2Fucy1zZXJpZicsDQogICAgICAgICAgICAgICAgICAgICdmb250U2l6ZSc6IDIwLA0KICAgICAgICAgICAgICAgICAgICAnbWluJzogMA0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgJ3N0YWNrZWQnOiB0cnVlDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICd5QXhlcyc6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAnZ3JpZExpbmVzJzogew0KICAgICAgICAgICAgICAgICAgICAnZGlzcGxheSc6IGZhbHNlLA0KICAgICAgICAgICAgICAgICAgICAnZHJhd0JvcmRlcic6IGZhbHNlDQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAndGlja3MnOiB7DQogICAgICAgICAgICAgICAgICAgICdmb250RmFtaWx5JzogJ1wnUm9ib3RvXCcsc2Fucy1zZXJpZicsDQogICAgICAgICAgICAgICAgICAgICdmb250U2l6ZSc6IDIwDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICBdDQogICAgfSwNCiAgICAnbGVnZW5kJzogew0KICAgICAgICAnbGFiZWxzJzogew0KICAgICAgICAgICAgJ2ZvbnRGYW1pbHknOiAnXCdSb2JvdG9cJyxzYW5zLXNlcmlmJywNCiAgICAgICAgICAgICdmb250U2l6ZSc6IDE2DQogICAgICAgIH0sDQogICAgICAgICdwb3NpdGlvbic6ICdib3R0b20nDQogICAgfSwNCiAgICAncmVzcG9uc2l2ZSc6IGZhbHNlDQp9IH0pOw0KICAgICAgICA8L3NjcmlwdD4NCiAgICA="
                  style="height:600px;width: 100%;border:none !important;"
                  allowfullscreen=""
                  webkitallowfullscreen=""
                  mozallowfullscreen="">

Funded
Unsuccessful
Unsuccessful - longlisted
All

beneficiaries
10
72
33
115

professionals
1
15
6
22

public
0
6
4
10

organisations
0
6
3
9

volunteers
0
1
1
2

Beneficiaries

Looking at the 115 applications that directly targeted beneficiaries, we can see that 26 applications
targeted children and young people, with the same number targeting people with a particular physical
health condition. An additional five applications targeted people with a mental health condition.

Funded
Unsuccessful
Unsuccessful - longlisted
All

people with health condition
3
16
7
26

children and young people
1
18
7
26

women and girls
1
6
2
9

residents
0
5
2
7

migrants and refugees
0
5
2
7

older people
0
2
3
5

people in poverty
1
3
1
5

people with addiction
1
2
2
5

families
1
3
0
4

offenders
0
2
2
4

victims of abuse
0
2
1
3

parents
0
1
2
3

people with learning disability
0
2
0
2

lgbt people
0
2
0
2

carers
0
1
1
2

students
0
1
0
1

isolated people
0
0
1
1

Stage of development

To examine the stage of development that each project was in, a scale based on
research from the Nominet Trust.
The concept stage was added to the five developed by Nominet Trust to capture those applicants that
had not undertaken any development work on their project. The categories used were:

Concept - An idea for the product but no development undertaken

Build - going from concept to minimum viable product (MVP)

Demonstrate - early pilot testing and proving the value of the product or service

Develop - building the operational team and partnerships to support growth, creating a
sustainable business model

Readiness - preparing to scale up delivery

Scaling - increasing access to the product or service

Classifying the projects was not always straightforward, as some applications were unclear about the
stage that their project had reached.

Application stage of development

            <iframe src="data:text/html;base64,DQogICAgICAgIDwhLS0gTG9hZCBDaGFydHMuanMgLS0+DQogICAgICAgPHNjcmlwdCBzcmM9J2h0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL0NoYXJ0LmpzLzIuNS4wL0NoYXJ0LmJ1bmRsZS5taW4uanMnPjwvc2NyaXB0Pg0KICAgIA0KICAgICAgICA8Y2FudmFzIGlkPSdjaGFydF9zdGFnZXMnPjwvY2FudmFzPg0KICAgICAgICA8c2NyaXB0Pg0KICAgICAgICAgICAgdmFyIGN0eCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjaGFydF9zdGFnZXMnKS5nZXRDb250ZXh0KCcyZCcpOw0KICAgICAgICAgICAgY3R4LmNhbnZhcy53aWR0aCAgPSA4MDAgLSAoLjEgKiA4MDApOw0KICAgICAgICAgICAgY3R4LmNhbnZhcy5oZWlnaHQgPSA1MDAgLSAoLjE1ICogNTAwKTsNCiAgICAgICAgICAgIHZhciBteU5ld0NoYXJ0ID0gbmV3IENoYXJ0KGN0eCx7IHR5cGU6ICdsaW5lJywgZGF0YTogew0KICAgICdsYWJlbHMnOiBbDQogICAgICAgICdDb25jZXB0JywNCiAgICAgICAgJ0J1aWxkJywNCiAgICAgICAgJ0RlbW9uc3RyYXRlJywNCiAgICAgICAgJ0RldmVsb3AnLA0KICAgICAgICAnUmVhZGluZXNzJywNCiAgICAgICAgJ1NjYWxpbmcnDQogICAgXSwNCiAgICAnZGF0YXNldHMnOiBbDQogICAgICAgIHsNCiAgICAgICAgICAgICdsYWJlbCc6ICdGdW5kZWQnLA0KICAgICAgICAgICAgJ2xpbmVUZW5zaW9uJzogMCwNCiAgICAgICAgICAgICdkYXRhJzogWw0KICAgICAgICAgICAgICAgIDEsDQogICAgICAgICAgICAgICAgNSwNCiAgICAgICAgICAgICAgICAxLA0KICAgICAgICAgICAgICAgIDIsDQogICAgICAgICAgICAgICAgMSwNCiAgICAgICAgICAgICAgICAwDQogICAgICAgICAgICBdLA0KICAgICAgICAgICAgJ2JvcmRlckNvbG9yJzogJ3JnYigyMzQsNzcsOTQpJw0KICAgICAgICB9LA0KICAgICAgICB7DQogICAgICAgICAgICAnbGFiZWwnOiAnVW5zdWNjZXNzZnVsIC0gbG9uZ2xpc3RlZCcsDQogICAgICAgICAgICAnbGluZVRlbnNpb24nOiAwLA0KICAgICAgICAgICAgJ2RhdGEnOiBbDQogICAgICAgICAgICAgICAgOCwNCiAgICAgICAgICAgICAgICA4LA0KICAgICAgICAgICAgICAgIDEyLA0KICAgICAgICAgICAgICAgIDcsDQogICAgICAgICAgICAgICAgMSwNCiAgICAgICAgICAgICAgICAwDQogICAgICAgICAgICBdLA0KICAgICAgICAgICAgJ2JvcmRlckNvbG9yJzogJ3JnYigwLCAxMjgsIDE1NiknDQogICAgICAgIH0sDQogICAgICAgIHsNCiAgICAgICAgICAgICdsYWJlbCc6ICdVbnN1Y2Nlc3NmdWwnLA0KICAgICAgICAgICAgJ2xpbmVUZW5zaW9uJzogMCwNCiAgICAgICAgICAgICdkYXRhJzogWw0KICAgICAgICAgICAgICAgIDQyLA0KICAgICAgICAgICAgICAgIDE1LA0KICAgICAgICAgICAgICAgIDE0LA0KICAgICAgICAgICAgICAgIDE2LA0KICAgICAgICAgICAgICAgIDUsDQogICAgICAgICAgICAgICAgMw0KICAgICAgICAgICAgXSwNCiAgICAgICAgICAgICdib3JkZXJDb2xvcic6ICdyZ2IoMjUyLCAxNTgsIDE4NSknDQogICAgICAgIH0NCiAgICBdDQp9LCBvcHRpb25zOiB7DQogICAgJ3NjYWxlcyc6IHsNCiAgICAgICAgJ3hBeGVzJzogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICdncmlkTGluZXMnOiB7DQogICAgICAgICAgICAgICAgICAgICdkaXNwbGF5JzogZmFsc2UsDQogICAgICAgICAgICAgICAgICAgICdkcmF3Qm9yZGVyJzogZmFsc2UNCiAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgICd0aWNrcyc6IHsNCiAgICAgICAgICAgICAgICAgICAgJ2ZvbnRGYW1pbHknOiAnXCdSb2JvdG9cJyxzYW5zLXNlcmlmJywNCiAgICAgICAgICAgICAgICAgICAgJ2ZvbnRTaXplJzogMTYNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICd5QXhlcyc6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAnZ3JpZExpbmVzJzogew0KICAgICAgICAgICAgICAgICAgICAnZGlzcGxheSc6IGZhbHNlDQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAndGlja3MnOiB7DQogICAgICAgICAgICAgICAgICAgICdmb250RmFtaWx5JzogJ1wnUm9ib3RvXCcsc2Fucy1zZXJpZicsDQogICAgICAgICAgICAgICAgICAgICdmb250U2l6ZSc6IDIwDQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAnc3RhY2tlZCc6IHRydWUNCiAgICAgICAgICAgIH0NCiAgICAgICAgXQ0KICAgIH0sDQogICAgJ2xlZ2VuZCc6IHsNCiAgICAgICAgJ2xhYmVscyc6IHsNCiAgICAgICAgICAgICdmb250RmFtaWx5JzogJ1wnUm9ib3RvXCcsc2Fucy1zZXJpZicsDQogICAgICAgICAgICAnZm9udFNpemUnOiAxNg0KICAgICAgICB9LA0KICAgICAgICAncG9zaXRpb24nOiAnYm90dG9tJw0KICAgIH0sDQogICAgJ3Jlc3BvbnNpdmUnOiBmYWxzZQ0KfSB9KTsNCiAgICAgICAgPC9zY3JpcHQ+DQogICAg"
                  style="height:600px;width: 100%;border:none !important;"
                  allowfullscreen=""
                  webkitallowfullscreen=""
                  mozallowfullscreen="">

As would be expected for a fund of this nature, most applications were at an early stage of development.
51 applications were at the concept stage, with a further 55 at the build and demonstrate stages
and 25 at the develop stage. Reflecting the fund guidance, there was a clear preference for projects
that had moved beyond the concept stage, only one of the 51 applications at that stage were successful.

Funded
Unsuccessful - longlisted
Unsuccessful
All

Concept
1
11
39
51

Build
5
8
15
28

Demonstrate
1
14
12
27

Develop
2
6
17
25

Readiness
1
2
4
7

Scaling
0
0
3
3

All
10
41
90
141

Conclusions: demand for tech funding

The data gathered from applications to this fund offers a glimpse into demand for funding for
non-profits to scale up their digital ideas. Although some caution should be taken in drawing
conclusions for the whole sector based on applications to one funding stream, it could offer some
insights into work organisations are planning or hoping to undertake. The findings suggest the following
implications:

All sizes of organisations are interested in similar funding, but there appears to be particular
demand from non-profit organisations with over £1m income - nearly two-thirds of applications came
from this group.

Most potential applicants are likely to be registered charities, but there is a significant group
of non-profit organisations with other legal forms that have an interest in this funding, particularly
Community Interest Companies, who made up roughly one in six applicants.

Organisations based in London dominated applications to the fund, although this may be explained by
the larger average size of applicants. There may be a need to generate demand in smaller organisations
outside of London.

Applicants were agnostic about the technology used in their projects, or did not feel it was important
to spell out. This is probably positive - it suggests a focus on solving problems rather than the
technology itself.

A common aim of application projects was to provide information or advice to beneficiaries, although
a significant number want to provide services too them. Perhaps unexpectedly, there doesn't appear
to be a large demand for peer support or networking services.

Most application projects are aimed at directly supporting beneficiaries, with a minority instead
aiming to support professionals or organisations to then work with beneficiaries.

Most applications had taken their project past the concept stage and had a prototype or existing
product to develop. Although this again would have been influenced by the fund criteria, it does
suggest that there are organisations already willing to experiment and take risks in this area, and
then look to develop those ideas further.

Comic Relief Tech for Good
applications analysis

David Kane, CAST

April 2017

This is an analysis of applications received by Comic Relief and Paul Hamlyn Foundation to the Tech for Good funding stream in 2016/17. The programme seeks to fund
          projects which use digital technology to address social challenges.

It was designed to include a simple first stage application process, which consisted of a publically available video, 100 word summary and a visual presentation. This attracted 145 applications which were reviewed by staff at both Comic Relief
          and Paul Hamlyn Foundation to create a long list of our top 50 in November 2016 and to select our top 10 in March 2017.

The analysis aims to answer five key questions, including comparisons between the applications that were successfully funded and those that were longlisted. The key questions are:

What types of technology are being developed?

What approaches are adopted?

What is the focus of the application? (Linking these to the key themes for Comic Relief and Paul Hamlyn Foundation)

Who are the target audience for the projects?

What stage of development are the projects?

Additionally, the analysis presents data on the types of organisations applying for funding, the size of those applicants, and geographical analysis of the locations of the applicants.

Key findings

Applications generally came from registered charities, but one in six applications came from Community Interest Companies.

The majority of applicants had income greater than £1 million.

Two fifths of applicants are based in London.

Most applications aim to provide information or advice directly to beneficiaries.

The largest focus of applications was health and wellbeing.

Over half of applications were at the stage of having a minimum viable product or pilot product for their project.

Methodology

Data on the applications received to the programme was available in a spreadsheet format. The data was first supplemented with additional data from four sources:

Where the applicant supplied a YouTube video a transcription of the video was extracted. This transcription was used for tagging the data (see below) with the technology types and beneficiaries supported by the application, to supplement the
            summary description found.

The applicants were matched to charity numbers to allow charity registration data, such as the organisations' income and location, to be used. Charity data was used from CharityBase.

Applicants were also matched to company numbers where a charity number was not available. Company data was then attached using the Companies House information service.

Location data was added by geocoding the location field supplied with the data. Geocoding was done using the Google Maps Geocoding API.

A small number of applicant organisations could not be reconciled either to companies or charities. These organisations were manually examined to determine their organisation type, with a small number where the type of organisation was not able
          to be discovered.

Additional data cleaning also included removing a duplicate application, and removing three ineligible applications from the data. After cleaning, 141 applications were available for analysis.

Tagging applications

To answer the five key questions, tags were added to the application data. The tags were based on manually examining each application as well as performing keyword searches. The tags would be based, for example, on identifying particular types
          of technology used, or beneficiary groups. The tags to be added were not decided in advance but were instead built up organically based on the content. Additionally an assessment was made of the stage of development for the application project.

Analysis of applicants

Applications by status

Of the 141 organisations, 46 were longlisted for consideration and asked to apply to the fund, with 95 unsuccessful.

Final status of applications

          <iframe src="data:text/html;base64,DQogICAgICAgIDwhLS0gTG9hZCBDaGFydHMuanMgLS0+DQogICAgICAgPHNjcmlwdCBzcmM9J2h0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL0NoYXJ0LmpzLzIuNS4wL0NoYXJ0LmJ1bmRsZS5taW4uanMnPjwvc2NyaXB0Pg0KICAgIA0KICAgICAgICA8Y2FudmFzIGlkPSdjaGFydF9zdGF0dXNfcGllJz48L2NhbnZhcz4NCiAgICAgICAgPHNjcmlwdD4NCiAgICAgICAgICAgIHZhciBjdHggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2hhcnRfc3RhdHVzX3BpZScpLmdldENvbnRleHQoJzJkJyk7DQogICAgICAgICAgICBjdHguY2FudmFzLndpZHRoICA9IDgwMCAtICguMSAqIDgwMCk7DQogICAgICAgICAgICBjdHguY2FudmFzLmhlaWdodCA9IDQyMCAtICguMTUgKiA0MjApOw0KICAgICAgICAgICAgdmFyIG15TmV3Q2hhcnQgPSBuZXcgQ2hhcnQoY3R4LHsgdHlwZTogJ3BpZScsIGRhdGE6IHsNCiAgICAnbGFiZWxzJzogWw0KICAgICAgICAnVW5zdWNjZXNzZnVsJywNCiAgICAgICAgJ1Vuc3VjY2Vzc2Z1bCAtIGxvbmdsaXN0ZWQnLA0KICAgICAgICAnRnVuZGVkJw0KICAgIF0sDQogICAgJ2RhdGFzZXRzJzogWw0KICAgICAgICB7DQogICAgICAgICAgICAnbGFiZWwnOiAnQXBwbGljYXRpb25zJywNCiAgICAgICAgICAgICdiYWNrZ3JvdW5kQ29sb3InOiBbDQogICAgICAgICAgICAgICAgJ3JnYigyNTIsIDE1OCwgMTg1KScsDQogICAgICAgICAgICAgICAgJ3JnYigwLCAxMjgsIDE1NiknLA0KICAgICAgICAgICAgICAgICdyZ2IoMjM0LDc3LDk0KScNCiAgICAgICAgICAgIF0sDQogICAgICAgICAgICAnZGF0YSc6IFsNCiAgICAgICAgICAgICAgICA5NSwNCiAgICAgICAgICAgICAgICAzNiwNCiAgICAgICAgICAgICAgICAxMA0KICAgICAgICAgICAgXQ0KICAgICAgICB9DQogICAgXQ0KfSwgb3B0aW9uczogew0KICAgICdsZWdlbmQnOiB7DQogICAgICAgICdsYWJlbHMnOiB7DQogICAgICAgICAgICAnZm9udEZhbWlseSc6ICdcJ1JvYm90b1wnLHNhbnMtc2VyaWYnLA0KICAgICAgICAgICAgJ2ZvbnRTaXplJzogMTYNCiAgICAgICAgfSwNCiAgICAgICAgJ3Bvc2l0aW9uJzogJ2JvdHRvbScNCiAgICB9LA0KICAgICdyZXNwb25zaXZlJzogZmFsc2UNCn0gfSk7DQogICAgICAgIDwvc2NyaXB0Pg0KICAgIA=="
          style="height:600px;width: 100%;border:none !important;" allowfullscreen="" webkitallowfullscreen="" mozallowfullscreen="">

Of the 46 applications carried forward to longlisting, 22 were invited to submit a full written application and were assessed. Of these, 10 were funded.

Applications by status and organisation type

83 of the applications (59%) were by registered charities, with a further 23 by Community Interest Companies. The organisation type of 12 applicants could not be determined. Charities were slightly more likely than other types to be longlisted,
          and make up of the successful applications.

Applicants by organisation type and status

          <iframe src="data:text/html;base64,DQogICAgICAgIDwhLS0gTG9hZCBDaGFydHMuanMgLS0+DQogICAgICAgPHNjcmlwdCBzcmM9J2h0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL0NoYXJ0LmpzLzIuNS4wL0NoYXJ0LmJ1bmRsZS5taW4uanMnPjwvc2NyaXB0Pg0KICAgIA0KICAgICAgICA8Y2FudmFzIGlkPSdjaGFydF9vcmdfdHlwZV9zdGF0dXMnPjwvY2FudmFzPg0KICAgICAgICA8c2NyaXB0Pg0KICAgICAgICAgICAgdmFyIGN0eCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjaGFydF9vcmdfdHlwZV9zdGF0dXMnKS5nZXRDb250ZXh0KCcyZCcpOw0KICAgICAgICAgICAgY3R4LmNhbnZhcy53aWR0aCAgPSA4MDAgLSAoLjEgKiA4MDApOw0KICAgICAgICAgICAgY3R4LmNhbnZhcy5oZWlnaHQgPSA1MDAgLSAoLjE1ICogNTAwKTsNCiAgICAgICAgICAgIHZhciBteU5ld0NoYXJ0ID0gbmV3IENoYXJ0KGN0eCx7IHR5cGU6ICdob3Jpem9udGFsQmFyJywgZGF0YTogew0KICAgICdsYWJlbHMnOiBbDQogICAgICAgICdDaGFyaXR5JywNCiAgICAgICAgJ0NvbW11bml0eSBJbnRlcmVzdCBDb21wYW55JywNCiAgICAgICAgJ1Vua25vd24nLA0KICAgICAgICAnQ29tcGFueSBsaW1pdGVkIGJ5IHNoYXJlcycsDQogICAgICAgICdDb21wYW55IExpbWl0ZWQgYnkgR3VhcmFudGVlJywNCiAgICAgICAgJ1VuaXZlcnNpdHknLA0KICAgICAgICAnSG91c2luZyBBc3NvY2lhdGlvbicsDQogICAgICAgICdPdmVyc2VhcycNCiAgICBdLA0KICAgICdkYXRhc2V0cyc6IFsNCiAgICAgICAgew0KICAgICAgICAgICAgJ2xhYmVsJzogJ0Z1bmRlZCcsDQogICAgICAgICAgICAnYmFja2dyb3VuZENvbG9yJzogJ3JnYigyMzQsNzcsOTQpJywNCiAgICAgICAgICAgICdkYXRhJzogWw0KICAgICAgICAgICAgICAgIDcuMCwNCiAgICAgICAgICAgICAgICAzLjAsDQogICAgICAgICAgICAgICAgMC4wLA0KICAgICAgICAgICAgICAgIDAuMCwNCiAgICAgICAgICAgICAgICAwLjAsDQogICAgICAgICAgICAgICAgMC4wLA0KICAgICAgICAgICAgICAgIDAuMCwNCiAgICAgICAgICAgICAgICAwLjANCiAgICAgICAgICAgIF0NCiAgICAgICAgfSwNCiAgICAgICAgew0KICAgICAgICAgICAgJ2xhYmVsJzogJ1Vuc3VjY2Vzc2Z1bCAtIGxvbmdsaXN0ZWQnLA0KICAgICAgICAgICAgJ2JhY2tncm91bmRDb2xvcic6ICdyZ2IoMCwgMTI4LCAxNTYpJywNCiAgICAgICAgICAgICdkYXRhJzogWw0KICAgICAgICAgICAgICAgIDI0LjAsDQogICAgICAgICAgICAgICAgNC4wLA0KICAgICAgICAgICAgICAgIDQuMCwNCiAgICAgICAgICAgICAgICA0LjAsDQogICAgICAgICAgICAgICAgMC4wLA0KICAgICAgICAgICAgICAgIDAuMCwNCiAgICAgICAgICAgICAgICAwLjAsDQogICAgICAgICAgICAgICAgMC4wDQogICAgICAgICAgICBdDQogICAgICAgIH0sDQogICAgICAgIHsNCiAgICAgICAgICAgICdsYWJlbCc6ICdVbnN1Y2Nlc3NmdWwnLA0KICAgICAgICAgICAgJ2JhY2tncm91bmRDb2xvcic6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLA0KICAgICAgICAgICAgJ2RhdGEnOiBbDQogICAgICAgICAgICAgICAgNTIuMCwNCiAgICAgICAgICAgICAgICAxNi4wLA0KICAgICAgICAgICAgICAgIDguMCwNCiAgICAgICAgICAgICAgICA3LjAsDQogICAgICAgICAgICAgICAgNy4wLA0KICAgICAgICAgICAgICAgIDMuMCwNCiAgICAgICAgICAgICAgICAxLjAsDQogICAgICAgICAgICAgICAgMS4wDQogICAgICAgICAgICBdDQogICAgICAgIH0NCiAgICBdDQp9LCBvcHRpb25zOiB7DQogICAgJ3NjYWxlcyc6IHsNCiAgICAgICAgJ3hBeGVzJzogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICdncmlkTGluZXMnOiB7DQogICAgICAgICAgICAgICAgICAgICdkaXNwbGF5JzogZmFsc2UsDQogICAgICAgICAgICAgICAgICAgICdkcmF3Qm9yZGVyJzogdHJ1ZQ0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgJ3RpY2tzJzogew0KICAgICAgICAgICAgICAgICAgICAnZm9udEZhbWlseSc6ICdcJ1JvYm90b1wnLHNhbnMtc2VyaWYnLA0KICAgICAgICAgICAgICAgICAgICAnZm9udFNpemUnOiAyMCwNCiAgICAgICAgICAgICAgICAgICAgJ21pbic6IDANCiAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgICdzdGFja2VkJzogdHJ1ZQ0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAneUF4ZXMnOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgJ2dyaWRMaW5lcyc6IHsNCiAgICAgICAgICAgICAgICAgICAgJ2Rpc3BsYXknOiBmYWxzZSwNCiAgICAgICAgICAgICAgICAgICAgJ2RyYXdCb3JkZXInOiBmYWxzZQ0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgJ3RpY2tzJzogew0KICAgICAgICAgICAgICAgICAgICAnZm9udEZhbWlseSc6ICdcJ1JvYm90b1wnLHNhbnMtc2VyaWYnLA0KICAgICAgICAgICAgICAgICAgICAnZm9udFNpemUnOiAyMA0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgXQ0KICAgIH0sDQogICAgJ2xlZ2VuZCc6IHsNCiAgICAgICAgJ2xhYmVscyc6IHsNCiAgICAgICAgICAgICdmb250RmFtaWx5JzogJ1wnUm9ib3RvXCcsc2Fucy1zZXJpZicsDQogICAgICAgICAgICAnZm9udFNpemUnOiAxNg0KICAgICAgICB9LA0KICAgICAgICAncG9zaXRpb24nOiAnYm90dG9tJw0KICAgIH0sDQogICAgJ3Jlc3BvbnNpdmUnOiBmYWxzZQ0KfSB9KTsNCiAgICAgICAgPC9zY3JpcHQ+DQogICAg"
          style="height:600px;width: 100%;border:none !important;" allowfullscreen="" webkitallowfullscreen="" mozallowfullscreen="">

Size of organisation

Size of applicants was only available for the 83 applicants that were registered charities, and is based on their income in the latest return to the Charity Commission. Data was not available for all charities, as some were registered in Northern
          Ireland or registered too recently for financial information to be available. Of the 83 charity applications, 14 had an income of more than £10 million.

Applicants by size and status

          <iframe src="data:text/html;base64,DQogICAgICAgIDwhLS0gTG9hZCBDaGFydHMuanMgLS0+DQogICAgICAgPHNjcmlwdCBzcmM9J2h0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL0NoYXJ0LmpzLzIuNS4wL0NoYXJ0LmJ1bmRsZS5taW4uanMnPjwvc2NyaXB0Pg0KICAgIA0KICAgICAgICA8Y2FudmFzIGlkPSdjaGFydF9vcmdfc2l6ZSc+PC9jYW52YXM+DQogICAgICAgIDxzY3JpcHQ+DQogICAgICAgICAgICB2YXIgY3R4ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NoYXJ0X29yZ19zaXplJykuZ2V0Q29udGV4dCgnMmQnKTsNCiAgICAgICAgICAgIGN0eC5jYW52YXMud2lkdGggID0gODAwIC0gKC4xICogODAwKTsNCiAgICAgICAgICAgIGN0eC5jYW52YXMuaGVpZ2h0ID0gNTAwIC0gKC4xNSAqIDUwMCk7DQogICAgICAgICAgICB2YXIgbXlOZXdDaGFydCA9IG5ldyBDaGFydChjdHgseyB0eXBlOiAnaG9yaXpvbnRhbEJhcicsIGRhdGE6IHsNCiAgICAnbGFiZWxzJzogWw0KICAgICAgICAnVW5kZXIgMTBrJywNCiAgICAgICAgJzEwayAtIDEwMGsnLA0KICAgICAgICAnMTAwayAtIDFtJywNCiAgICAgICAgJzFtIC0gMTBtJywNCiAgICAgICAgJ092ZXIgMTBtJw0KICAgIF0sDQogICAgJ2RhdGFzZXRzJzogWw0KICAgICAgICB7DQogICAgICAgICAgICAnbGFiZWwnOiAnRnVuZGVkJywNCiAgICAgICAgICAgICdiYWNrZ3JvdW5kQ29sb3InOiAncmdiKDIzNCw3Nyw5NCknLA0KICAgICAgICAgICAgJ2RhdGEnOiBbDQogICAgICAgICAgICAgICAgMC4wLA0KICAgICAgICAgICAgICAgIDEuMCwNCiAgICAgICAgICAgICAgICAwLjAsDQogICAgICAgICAgICAgICAgMy4wLA0KICAgICAgICAgICAgICAgIDMuMA0KICAgICAgICAgICAgXQ0KICAgICAgICB9LA0KICAgICAgICB7DQogICAgICAgICAgICAnbGFiZWwnOiAnVW5zdWNjZXNzZnVsIC0gbG9uZ2xpc3RlZCcsDQogICAgICAgICAgICAnYmFja2dyb3VuZENvbG9yJzogJ3JnYigwLCAxMjgsIDE1NiknLA0KICAgICAgICAgICAgJ2RhdGEnOiBbDQogICAgICAgICAgICAgICAgMC4wLA0KICAgICAgICAgICAgICAgIDEuMCwNCiAgICAgICAgICAgICAgICA2LjAsDQogICAgICAgICAgICAgICAgMTAuMCwNCiAgICAgICAgICAgICAgICA2LjANCiAgICAgICAgICAgIF0NCiAgICAgICAgfSwNCiAgICAgICAgew0KICAgICAgICAgICAgJ2xhYmVsJzogJ1Vuc3VjY2Vzc2Z1bCcsDQogICAgICAgICAgICAnYmFja2dyb3VuZENvbG9yJzogJ3JnYigyNTIsIDE1OCwgMTg1KScsDQogICAgICAgICAgICAnZGF0YSc6IFsNCiAgICAgICAgICAgICAgICAxLjAsDQogICAgICAgICAgICAgICAgNi4wLA0KICAgICAgICAgICAgICAgIDE2LjAsDQogICAgICAgICAgICAgICAgMjEuMCwNCiAgICAgICAgICAgICAgICA1LjANCiAgICAgICAgICAgIF0NCiAgICAgICAgfQ0KICAgIF0NCn0sIG9wdGlvbnM6IHsNCiAgICAnc2NhbGVzJzogew0KICAgICAgICAneEF4ZXMnOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgJ2dyaWRMaW5lcyc6IHsNCiAgICAgICAgICAgICAgICAgICAgJ2Rpc3BsYXknOiBmYWxzZSwNCiAgICAgICAgICAgICAgICAgICAgJ2RyYXdCb3JkZXInOiB0cnVlDQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAndGlja3MnOiB7DQogICAgICAgICAgICAgICAgICAgICdmb250RmFtaWx5JzogJ1wnUm9ib3RvXCcsc2Fucy1zZXJpZicsDQogICAgICAgICAgICAgICAgICAgICdmb250U2l6ZSc6IDIwLA0KICAgICAgICAgICAgICAgICAgICAnbWluJzogMA0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgJ3N0YWNrZWQnOiB0cnVlDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICd5QXhlcyc6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAnZ3JpZExpbmVzJzogew0KICAgICAgICAgICAgICAgICAgICAnZGlzcGxheSc6IGZhbHNlLA0KICAgICAgICAgICAgICAgICAgICAnZHJhd0JvcmRlcic6IGZhbHNlDQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAndGlja3MnOiB7DQogICAgICAgICAgICAgICAgICAgICdmb250RmFtaWx5JzogJ1wnUm9ib3RvXCcsc2Fucy1zZXJpZicsDQogICAgICAgICAgICAgICAgICAgICdmb250U2l6ZSc6IDIwDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICBdDQogICAgfSwNCiAgICAnbGVnZW5kJzogew0KICAgICAgICAnbGFiZWxzJzogew0KICAgICAgICAgICAgJ2ZvbnRGYW1pbHknOiAnXCdSb2JvdG9cJyxzYW5zLXNlcmlmJywNCiAgICAgICAgICAgICdmb250U2l6ZSc6IDE2DQogICAgICAgIH0sDQogICAgICAgICdwb3NpdGlvbic6ICdib3R0b20nDQogICAgfSwNCiAgICAncmVzcG9uc2l2ZSc6IGZhbHNlDQp9IH0pOw0KICAgICAgICA8L3NjcmlwdD4NCiAgICA="
          style="height:600px;width: 100%;border:none !important;" allowfullscreen="" webkitallowfullscreen="" mozallowfullscreen="">

              Funded
              Unsuccessful - longlisted
              Unsuccessful
              All

              Under 10k
              0
              0
              1
              1

              10k - 100k
              1
              1
              6
              8

              100k - 1m
              0
              6
              16
              22

              1m - 10m
              3
              10
              21
              34

              Over 10m
              3
              6
              5
              14

              All
              7
              23
              49
              79

Applicant region

Around two-fifths of applicants (55) were based in London, according to the location provided with their application data. The next largest region by number of applicants was the North West (16), followed by South West (12), and then North East,
          South East and Yorkshire and the Humber (each with 10). The largest organisations were more likely to be from London (of half of those with more than £10m income), but organisations based in London still dominated the smaller income bands: 45%
          of organisations with income between £100k and £1m were based in London.

Applications by region and status

          <iframe src="data:text/html;base64,DQogICAgICAgIDwhLS0gTG9hZCBDaGFydHMuanMgLS0+DQogICAgICAgPHNjcmlwdCBzcmM9J2h0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL0NoYXJ0LmpzLzIuNS4wL0NoYXJ0LmJ1bmRsZS5taW4uanMnPjwvc2NyaXB0Pg0KICAgIA0KICAgICAgICA8Y2FudmFzIGlkPSdjaGFydF9yZWdpb24nPjwvY2FudmFzPg0KICAgICAgICA8c2NyaXB0Pg0KICAgICAgICAgICAgdmFyIGN0eCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjaGFydF9yZWdpb24nKS5nZXRDb250ZXh0KCcyZCcpOw0KICAgICAgICAgICAgY3R4LmNhbnZhcy53aWR0aCAgPSA4MDAgLSAoLjEgKiA4MDApOw0KICAgICAgICAgICAgY3R4LmNhbnZhcy5oZWlnaHQgPSA1MDAgLSAoLjE1ICogNTAwKTsNCiAgICAgICAgICAgIHZhciBteU5ld0NoYXJ0ID0gbmV3IENoYXJ0KGN0eCx7IHR5cGU6ICdob3Jpem9udGFsQmFyJywgZGF0YTogew0KICAgICdsYWJlbHMnOiBbDQogICAgICAgICdMb25kb24nLA0KICAgICAgICAnTm9ydGggV2VzdCcsDQogICAgICAgICdTb3V0aCBXZXN0JywNCiAgICAgICAgJ05vcnRoIEVhc3QnLA0KICAgICAgICAnU291dGggRWFzdCcsDQogICAgICAgICdZb3Jrc2hpcmUgYW5kIHRoZSBIdW1iZXInLA0KICAgICAgICAnU2NvdGxhbmQnLA0KICAgICAgICAnV2FsZXMnLA0KICAgICAgICAnRWFzdCBNaWRsYW5kcycsDQogICAgICAgICdOb3J0aGVybiBJcmVsYW5kJywNCiAgICAgICAgJ1dlc3QgTWlkbGFuZHMnLA0KICAgICAgICAnRWFzdGVybicNCiAgICBdLA0KICAgICdkYXRhc2V0cyc6IFsNCiAgICAgICAgew0KICAgICAgICAgICAgJ2xhYmVsJzogJ0Z1bmRlZCcsDQogICAgICAgICAgICAnYmFja2dyb3VuZENvbG9yJzogJ3JnYigyMzQsNzcsOTQpJywNCiAgICAgICAgICAgICdkYXRhJzogWw0KICAgICAgICAgICAgICAgIDQsDQogICAgICAgICAgICAgICAgMiwNCiAgICAgICAgICAgICAgICAzLA0KICAgICAgICAgICAgICAgIDAsDQogICAgICAgICAgICAgICAgMCwNCiAgICAgICAgICAgICAgICAwLA0KICAgICAgICAgICAgICAgIDEsDQogICAgICAgICAgICAgICAgMCwNCiAgICAgICAgICAgICAgICAwLA0KICAgICAgICAgICAgICAgIDAsDQogICAgICAgICAgICAgICAgMCwNCiAgICAgICAgICAgICAgICAwDQogICAgICAgICAgICBdDQogICAgICAgIH0sDQogICAgICAgIHsNCiAgICAgICAgICAgICdsYWJlbCc6ICdVbnN1Y2Nlc3NmdWwgLSBsb25nbGlzdGVkJywNCiAgICAgICAgICAgICdiYWNrZ3JvdW5kQ29sb3InOiAncmdiKDAsIDEyOCwgMTU2KScsDQogICAgICAgICAgICAnZGF0YSc6IFsNCiAgICAgICAgICAgICAgICAyMCwNCiAgICAgICAgICAgICAgICAxLA0KICAgICAgICAgICAgICAgIDUsDQogICAgICAgICAgICAgICAgMiwNCiAgICAgICAgICAgICAgICAyLA0KICAgICAgICAgICAgICAgIDEsDQogICAgICAgICAgICAgICAgMSwNCiAgICAgICAgICAgICAgICAyLA0KICAgICAgICAgICAgICAgIDAsDQogICAgICAgICAgICAgICAgMCwNCiAgICAgICAgICAgICAgICAyLA0KICAgICAgICAgICAgICAgIDANCiAgICAgICAgICAgIF0NCiAgICAgICAgfSwNCiAgICAgICAgew0KICAgICAgICAgICAgJ2xhYmVsJzogJ1Vuc3VjY2Vzc2Z1bCcsDQogICAgICAgICAgICAnYmFja2dyb3VuZENvbG9yJzogJ3JnYigyNTIsIDE1OCwgMTg1KScsDQogICAgICAgICAgICAnZGF0YSc6IFsNCiAgICAgICAgICAgICAgICAzMSwNCiAgICAgICAgICAgICAgICAxMiwNCiAgICAgICAgICAgICAgICA0LA0KICAgICAgICAgICAgICAgIDgsDQogICAgICAgICAgICAgICAgOCwNCiAgICAgICAgICAgICAgICA5LA0KICAgICAgICAgICAgICAgIDYsDQogICAgICAgICAgICAgICAgMywNCiAgICAgICAgICAgICAgICA0LA0KICAgICAgICAgICAgICAgIDQsDQogICAgICAgICAgICAgICAgMiwNCiAgICAgICAgICAgICAgICAzDQogICAgICAgICAgICBdDQogICAgICAgIH0NCiAgICBdDQp9LCBvcHRpb25zOiB7DQogICAgJ3NjYWxlcyc6IHsNCiAgICAgICAgJ3hBeGVzJzogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICdncmlkTGluZXMnOiB7DQogICAgICAgICAgICAgICAgICAgICdkaXNwbGF5JzogZmFsc2UsDQogICAgICAgICAgICAgICAgICAgICdkcmF3Qm9yZGVyJzogdHJ1ZQ0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgJ3RpY2tzJzogew0KICAgICAgICAgICAgICAgICAgICAnZm9udEZhbWlseSc6ICdcJ1JvYm90b1wnLHNhbnMtc2VyaWYnLA0KICAgICAgICAgICAgICAgICAgICAnZm9udFNpemUnOiAyMCwNCiAgICAgICAgICAgICAgICAgICAgJ21pbic6IDANCiAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgICdzdGFja2VkJzogdHJ1ZQ0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAneUF4ZXMnOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgJ2dyaWRMaW5lcyc6IHsNCiAgICAgICAgICAgICAgICAgICAgJ2Rpc3BsYXknOiBmYWxzZSwNCiAgICAgICAgICAgICAgICAgICAgJ2RyYXdCb3JkZXInOiBmYWxzZQ0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgJ3RpY2tzJzogew0KICAgICAgICAgICAgICAgICAgICAnZm9udEZhbWlseSc6ICdcJ1JvYm90b1wnLHNhbnMtc2VyaWYnLA0KICAgICAgICAgICAgICAgICAgICAnZm9udFNpemUnOiAyMA0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgXQ0KICAgIH0sDQogICAgJ2xlZ2VuZCc6IHsNCiAgICAgICAgJ2xhYmVscyc6IHsNCiAgICAgICAgICAgICdmb250RmFtaWx5JzogJ1wnUm9ib3RvXCcsc2Fucy1zZXJpZicsDQogICAgICAgICAgICAnZm9udFNpemUnOiAxNg0KICAgICAgICB9LA0KICAgICAgICAncG9zaXRpb24nOiAnYm90dG9tJw0KICAgIH0sDQogICAgJ3Jlc3BvbnNpdmUnOiBmYWxzZQ0KfSB9KTsNCiAgICAgICAgPC9zY3JpcHQ+DQogICAg"
          style="height:600px;width: 100%;border:none !important;" allowfullscreen="" webkitallowfullscreen="" mozallowfullscreen="">

The digital nature of the projects does mean that the location of the applicant does not necessarily tell us where the technology developed will actually be used.

Applicant locations

          <iframe src="data:text/html;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVMgPSBmYWxzZTsgTF9OT19UT1VDSCA9IGZhbHNlOyBMX0RJU0FCTEVfM0QgPSBmYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL3VucGtnLmNvbS9sZWFmbGV0QDEuMC4xL2Rpc3QvbGVhZmxldC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9hamF4Lmdvb2dsZWFwaXMuY29tL2FqYXgvbGlicy9qcXVlcnkvMS4xMS4xL2pxdWVyeS5taW4uanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vYm9vdHN0cmFwLzMuMi4wL2pzL2Jvb3RzdHJhcC5taW4uanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL0xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLzIuMC4yL2xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9sZWFmbGV0Lm1hcmtlcmNsdXN0ZXIvMS4wLjAvbGVhZmxldC5tYXJrZXJjbHVzdGVyLXNyYy5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvbGVhZmxldC5tYXJrZXJjbHVzdGVyLzEuMC4wL2xlYWZsZXQubWFya2VyY2x1c3Rlci5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vdW5wa2cuY29tL2xlYWZsZXRAMS4wLjEvZGlzdC9sZWFmbGV0LmNzcyIgLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC5taW4uY3NzIiAvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLXRoZW1lLm1pbi5jc3MiIC8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIgLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuY3NzIiAvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9sZWFmbGV0Lm1hcmtlcmNsdXN0ZXIvMS4wLjAvTWFya2VyQ2x1c3Rlci5EZWZhdWx0LmNzcyIgLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvbGVhZmxldC5tYXJrZXJjbHVzdGVyLzEuMC4wL01hcmtlckNsdXN0ZXIuY3NzIiAvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL3Jhd2dpdC5jb20vcHl0aG9uLXZpc3VhbGl6YXRpb24vZm9saXVtL21hc3Rlci9mb2xpdW0vdGVtcGxhdGVzL2xlYWZsZXQuYXdlc29tZS5yb3RhdGUuY3NzIiAvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgICAgICAgICA8c3R5bGU+ICNtYXBfNmMyN2Y3ZDljMzJiNDQ1ZWE0MjMzOWZkNWQwMTgwZWYgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzZjMjdmN2Q5YzMyYjQ0NWVhNDIzMzlmZDVkMDE4MGVmIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIHNvdXRoV2VzdCA9IEwubGF0TG5nKC05MCwgLTE4MCk7CiAgICAgICAgICAgICAgICB2YXIgbm9ydGhFYXN0ID0gTC5sYXRMbmcoOTAsIDE4MCk7CiAgICAgICAgICAgICAgICB2YXIgYm91bmRzID0gTC5sYXRMbmdCb3VuZHMoc291dGhXZXN0LCBub3J0aEVhc3QpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXBfNmMyN2Y3ZDljMzJiNDQ1ZWE0MjMzOWZkNWQwMTgwZWYgPSBMLm1hcCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtYXBfNmMyN2Y3ZDljMzJiNDQ1ZWE0MjMzOWZkNWQwMTgwZWYnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2NlbnRlcjogWzUzLjY0OTA0LC0xLjc4NDE2XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvb206IDYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhCb3VuZHM6IGJvdW5kcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyczogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZENvcHlKdW1wOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciB0aWxlX2xheWVyX2ZlYTA1ZjQyZWE2ZjQ3ZWNhYzQwOGVmODkxNTMzMzc4ID0gTC50aWxlTGF5ZXIoCiAgICAgICAgICAgICAgICAnaHR0cHM6Ly9zdGFtZW4tdGlsZXMte3N9LmEuc3NsLmZhc3RseS5uZXQvdG9uZXIve3p9L3t4fS97eX0ucG5nJywKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtYXhab29tOiAxOCwKICAgICAgICAgICAgICAgICAgICBtaW5ab29tOiAxLAogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVvdXNXb3JsZDogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgbm9XcmFwOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGlvbjogJ01hcCB0aWxlcyBieSA8YSBocmVmPSJodHRwOi8vc3RhbWVuLmNvbSI+U3RhbWVuIERlc2lnbjwvYT4sIHVuZGVyIDxhIGhyZWY9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LzMuMCI+Q0MgQlkgMy4wPC9hPi4gRGF0YSBieSA8YSBocmVmPSJodHRwOi8vb3BlbnN0cmVldG1hcC5vcmciPk9wZW5TdHJlZXRNYXA8L2E+LCB1bmRlciA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5zdHJlZXRtYXAub3JnL2NvcHlyaWdodCI+T0RiTDwvYT4uJywKICAgICAgICAgICAgICAgICAgICBkZXRlY3RSZXRpbmE6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNmMyN2Y3ZDljMzJiNDQ1ZWE0MjMzOWZkNWQwMTgwZWYpOwoKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgZmVhdHVyZV9ncm91cF83ZTA1NGE2MTA4ZDc0ZTQ4OGIxM2Q2ZWEzZWE4MjE4MSA9IEwuZmVhdHVyZUdyb3VwKAogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNmMyN2Y3ZDljMzJiNDQ1ZWE0MjMzOWZkNWQwMTgwZWYpOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iODFkOGE1YTBiMjc0ZTJjYmExZTcwN2U3YjA0ZjNmMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUzLjM5MDA0NDEsLTIuNTk2OTUwMV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjM0LDc3LDk0KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyMzQsNzcsOTQpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzdlMDU0YTYxMDhkNzRlNDg4YjEzZDZlYTNlYTgyMTgxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NlMzEwN2U2NjYzOTRlNGNiYzM1YzgxOTA4NWNjNjRlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2VkODU1ZDcyNDQ5MjRkYjFhM2FkNjAxOGMzNTU0OTgxID0gJCgnPGRpdiBpZD0iaHRtbF9lZDg1NWQ3MjQ0OTI0ZGIxYTNhZDYwMThjMzU1NDk4MSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U2lnbkhlYWx0aCAoV2FycmluZ3Rvbik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2NlMzEwN2U2NjYzOTRlNGNiYzM1YzgxOTA4NWNjNjRlLnNldENvbnRlbnQoaHRtbF9lZDg1NWQ3MjQ0OTI0ZGIxYTNhZDYwMThjMzU1NDk4MSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iODFkOGE1YTBiMjc0ZTJjYmExZTcwN2U3YjA0ZjNmMS5iaW5kUG9wdXAocG9wdXBfY2UzMTA3ZTY2NjM5NGU0Y2JjMzVjODE5MDg1Y2M2NGUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQ0ZWJlYWY3MzExYjRlOWFhMjQ5YjFhYWU3Nzc3NDk4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNTA3MzUwOSwtMC4xMjc3NTgzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyMzQsNzcsOTQpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDIzNCw3Nyw5NCknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfN2UwNTRhNjEwOGQ3NGU0ODhiMTNkNmVhM2VhODIxODEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzA3YmZlNDYyYjg0NDUzMGFlNjQ3MzJlZWQ1NDI4MjEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzYyMTBjOGI0NTA1NDJjNDhhZWI3NjYyMDg5YWRiZjQgPSAkKCc8ZGl2IGlkPSJodG1sXzM2MjEwYzhiNDUwNTQyYzQ4YWViNzY2MjA4OWFkYmY0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PeGZhbSAoTG9uZG9uKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzA3YmZlNDYyYjg0NDUzMGFlNjQ3MzJlZWQ1NDI4MjEuc2V0Q29udGVudChodG1sXzM2MjEwYzhiNDUwNTQyYzQ4YWViNzY2MjA4OWFkYmY0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQ0ZWJlYWY3MzExYjRlOWFhMjQ5YjFhYWU3Nzc3NDk4LmJpbmRQb3B1cChwb3B1cF83MDdiZmU0NjJiODQ0NTMwYWU2NDczMmVlZDU0MjgyMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWY5ZjU4YWMwYjNiNDNiYmI2ODZhZTU0NjgzYTkxNjAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41MDczNTA5LC0wLjEyNzc1ODNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDIzNCw3Nyw5NCknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjM0LDc3LDk0KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF83ZTA1NGE2MTA4ZDc0ZTQ4OGIxM2Q2ZWEzZWE4MjE4MSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xYzRlYTVhYjUxMTg0ZDViOTRjMzQ2NTllNWMyNjNmMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yNDdlNTlhNWUzYmI0YzIxODQ3NDg2NzdlOTliNTdjYiA9ICQoJzxkaXYgaWQ9Imh0bWxfMjQ3ZTU5YTVlM2JiNGMyMTg0NzQ4Njc3ZTk5YjU3Y2IiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRpc3J1cHREaXNhYmlsaXR5ICAoTG9uZG9uKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMWM0ZWE1YWI1MTE4NGQ1Yjk0YzM0NjU5ZTVjMjYzZjAuc2V0Q29udGVudChodG1sXzI0N2U1OWE1ZTNiYjRjMjE4NDc0ODY3N2U5OWI1N2NiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzlmOWY1OGFjMGIzYjQzYmJiNjg2YWU1NDY4M2E5MTYwLmJpbmRQb3B1cChwb3B1cF8xYzRlYTVhYjUxMTg0ZDViOTRjMzQ2NTllNWMyNjNmMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTc2NGJiNDRkYTgyNGNhNjllZWRlMmUwN2QwOGNlOTUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS40NTQ1MTMsLTIuNTg3OTFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDIzNCw3Nyw5NCknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjM0LDc3LDk0KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF83ZTA1NGE2MTA4ZDc0ZTQ4OGIxM2Q2ZWEzZWE4MjE4MSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mZTAxYzA4YzhkZDk0NDk4OGQwZGZkYmJlNWQ0NWZiYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85YWYwMjcwZjc3M2Y0NTVhOGVkODliZDU5NjBjYTE0OSA9ICQoJzxkaXYgaWQ9Imh0bWxfOWFmMDI3MGY3NzNmNDU1YThlZDg5YmQ1OTYwY2ExNDkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJyaXN0b2wgQnJhaWxsZSBUZWNobm9sb2d5IENJQyAoQnJpc3RvbCk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZlMDFjMDhjOGRkOTQ0OTg4ZDBkZmRiYmU1ZDQ1ZmJjLnNldENvbnRlbnQoaHRtbF85YWYwMjcwZjc3M2Y0NTVhOGVkODliZDU5NjBjYTE0OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81NzY0YmI0NGRhODI0Y2E2OWVlZGUyZTA3ZDA4Y2U5NS5iaW5kUG9wdXAocG9wdXBfZmUwMWMwOGM4ZGQ5NDQ5ODhkMGRmZGJiZTVkNDVmYmMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA3ODU5MDBlOWFiNzRlYzg5MTk5ZmIwZTk3YmEwYTFiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNTA3MzUwOSwtMC4xMjc3NTgzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyMzQsNzcsOTQpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDIzNCw3Nyw5NCknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfN2UwNTRhNjEwOGQ3NGU0ODhiMTNkNmVhM2VhODIxODEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmVmMWMxZjQ3ZGVhNDJiNmIxYmJiYjA0MTAzN2E0ZDkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjFjZTUyYjFmYWE0NGFlNGJlOTkyNzE1MTRkNjlmZTAgPSAkKCc8ZGl2IGlkPSJodG1sXzYxY2U1MmIxZmFhNDRhZTRiZTk5MjcxNTE0ZDY5ZmUwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5EZVBhdWwgVUsgKExvbmRvbik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZlZjFjMWY0N2RlYTQyYjZiMWJiYmIwNDEwMzdhNGQ5LnNldENvbnRlbnQoaHRtbF82MWNlNTJiMWZhYTQ0YWU0YmU5OTI3MTUxNGQ2OWZlMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wNzg1OTAwZTlhYjc0ZWM4OTE5OWZiMGU5N2JhMGExYi5iaW5kUG9wdXAocG9wdXBfZmVmMWMxZjQ3ZGVhNDJiNmIxYmJiYjA0MTAzN2E0ZDkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhiYWMzNzFiNDM2YjQ3YmE4ZmZhZWMzMDc4MmRiNTQyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTQuMDQ2NTc1LC0yLjgwMDczOTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDIzNCw3Nyw5NCknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjM0LDc3LDk0KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF83ZTA1NGE2MTA4ZDc0ZTQ4OGIxM2Q2ZWEzZWE4MjE4MSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kNTU4NmM2ZmIwZWE0MTk2ODFjMmQ1NTM4NjFmNjVhOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yY2M5MWFmYWY2NDA0MTg2OTFmNTBkOTAyNzZhNTFkZiA9ICQoJzxkaXYgaWQ9Imh0bWxfMmNjOTFhZmFmNjQwNDE4NjkxZjUwZDkwMjc2YTUxZGYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlRoZSBXZWxsIChMYW5jYXN0ZXIpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kNTU4NmM2ZmIwZWE0MTk2ODFjMmQ1NTM4NjFmNjVhOS5zZXRDb250ZW50KGh0bWxfMmNjOTFhZmFmNjQwNDE4NjkxZjUwZDkwMjc2YTUxZGYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOGJhYzM3MWI0MzZiNDdiYThmZmFlYzMwNzgyZGI1NDIuYmluZFBvcHVwKHBvcHVwX2Q1NTg2YzZmYjBlYTQxOTY4MWMyZDU1Mzg2MWY2NWE5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xODkyMDE4NTZkZDI0MzRmYjkyYTFmNTVlOTYyNmYzYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzU1Ljk1MzI1MiwtMy4xODgyNjddLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDIzNCw3Nyw5NCknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjM0LDc3LDk0KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF83ZTA1NGE2MTA4ZDc0ZTQ4OGIxM2Q2ZWEzZWE4MjE4MSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lY2UxMzc0NzBiOWE0ODA4YjI0OTQ3YWY3YWZkMWRlMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81ZmM5MmFmY2YwNWE0MmE0ODY5MGNlYmM2ZDM1ZTdlMSA9ICQoJzxkaXYgaWQ9Imh0bWxfNWZjOTJhZmNmMDVhNDJhNDg2OTBjZWJjNmQzNWU3ZTEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNoZWx0ZXIgU2NvdGxhbmQgKEVkaW5idXJnaCk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2VjZTEzNzQ3MGI5YTQ4MDhiMjQ5NDdhZjdhZmQxZGUxLnNldENvbnRlbnQoaHRtbF81ZmM5MmFmY2YwNWE0MmE0ODY5MGNlYmM2ZDM1ZTdlMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xODkyMDE4NTZkZDI0MzRmYjkyYTFmNTVlOTYyNmYzYy5iaW5kUG9wdXAocG9wdXBfZWNlMTM3NDcwYjlhNDgwOGIyNDk0N2FmN2FmZDFkZTEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzAzZjY0ZjllZjhhMDRiNzdhMWEzNzdmNWNmYjExYjkzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTAuNzE4NDEyLC0zLjUzMzg5OV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjM0LDc3LDk0KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyMzQsNzcsOTQpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzdlMDU0YTYxMDhkNzRlNDg4YjEzZDZlYTNlYTgyMTgxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM5Yzk5ZTU0MzFlMTRiYmY5MzY3ZGM1ZDcwYWY4NTRkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFiMDMzZmRhNTkzNTRkZTViOGM0MzhlMmI0NTEzOWJiID0gJCgnPGRpdiBpZD0iaHRtbF8xYjAzM2ZkYTU5MzU0ZGU1YjhjNDM4ZTJiNDUxMzliYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V0VTQyBGb3VuZGF0aW9uIC0gVGhlIFNwZWNpYWxpc3QgQ2VudHJlIGZvciBWaXN1YWwgSW1wYWlybWVudCAoRXhldGVyKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzljOTllNTQzMWUxNGJiZjkzNjdkYzVkNzBhZjg1NGQuc2V0Q29udGVudChodG1sXzFiMDMzZmRhNTkzNTRkZTViOGM0MzhlMmI0NTEzOWJiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzAzZjY0ZjllZjhhMDRiNzdhMWEzNzdmNWNmYjExYjkzLmJpbmRQb3B1cChwb3B1cF8zOWM5OWU1NDMxZTE0YmJmOTM2N2RjNWQ3MGFmODU0ZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWVmNDExMmVjNjEwNDFjM2E5YWJlYjZmZTUyMmNhNzMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41MDczNTA5LC0wLjEyNzc1ODNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDIzNCw3Nyw5NCknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjM0LDc3LDk0KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF83ZTA1NGE2MTA4ZDc0ZTQ4OGIxM2Q2ZWEzZWE4MjE4MSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83N2YxNDVkMWNkOTU0MjAyODliYzNiMjZiNWFjYjM5NiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83YjdjMTcwZjU5NzY0NzczYmY4ODBiYjljYTlhNjMxMCA9ICQoJzxkaXYgaWQ9Imh0bWxfN2I3YzE3MGY1OTc2NDc3M2JmODgwYmI5Y2E5YTYzMTAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlRoZSBBbGV4YW5kcmEgUm9zZSBDaGFyaXR5IChMb25kb24pPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83N2YxNDVkMWNkOTU0MjAyODliYzNiMjZiNWFjYjM5Ni5zZXRDb250ZW50KGh0bWxfN2I3YzE3MGY1OTc2NDc3M2JmODgwYmI5Y2E5YTYzMTApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOWVmNDExMmVjNjEwNDFjM2E5YWJlYjZmZTUyMmNhNzMuYmluZFBvcHVwKHBvcHVwXzc3ZjE0NWQxY2Q5NTQyMDI4OWJjM2IyNmI1YWNiMzk2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kMDMwN2YxMTRhMzE0ZDM5YmZkYmE3YWM0NTQwMGY0YiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjQ1NDUxMywtMi41ODc5MV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjM0LDc3LDk0KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyMzQsNzcsOTQpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzdlMDU0YTYxMDhkNzRlNDg4YjEzZDZlYTNlYTgyMTgxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQ3ZGVlNzNhM2ZiNTQ5Mzc5M2M1MjI1MTZkZjFhOTBlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY5MGMxYTMxM2I4ZTQxMTU5YWI1YjlmYjFiM2IxNTMwID0gJCgnPGRpdiBpZD0iaHRtbF82OTBjMWEzMTNiOGU0MTE1OWFiNWI5ZmIxYjNiMTUzMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V29tZW4mIzM5O3MgQWlkIChCcmlzdG9sKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDdkZWU3M2EzZmI1NDkzNzkzYzUyMjUxNmRmMWE5MGUuc2V0Q29udGVudChodG1sXzY5MGMxYTMxM2I4ZTQxMTU5YWI1YjlmYjFiM2IxNTMwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2QwMzA3ZjExNGEzMTRkMzliZmRiYTdhYzQ1NDAwZjRiLmJpbmRQb3B1cChwb3B1cF80N2RlZTczYTNmYjU0OTM3OTNjNTIyNTE2ZGYxYTkwZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgZmVhdHVyZV9ncm91cF9iZTBkMjU1YjljMWU0ODVlODdiNTRmMjcwYTViNjgwMCA9IEwuZmVhdHVyZUdyb3VwKAogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNmMyN2Y3ZDljMzJiNDQ1ZWE0MjMzOWZkNWQwMTgwZWYpOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zMGE5MzBjOTQzMTI0YzAwYjFhZjA0NGIzZDgwNmVjNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjUwNzM1MDksLTAuMTI3NzU4M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9iZTBkMjU1YjljMWU0ODVlODdiNTRmMjcwYTViNjgwMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mMzQxMzJiMjM1ZWI0ODViOGJkNmI2ZWNkMjczZjRjMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hNjc5NjllNmUxMTI0YmM0Yjc4Njg2NDBhNDYyZDZmYiA9ICQoJzxkaXYgaWQ9Imh0bWxfYTY3OTY5ZTZlMTEyNGJjNGI3ODY4NjQwYTQ2MmQ2ZmIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJyZWFzdCBDYW5jZXIgQ2FyZSAoTG9uZG9uKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjM0MTMyYjIzNWViNDg1YjhiZDZiNmVjZDI3M2Y0YzAuc2V0Q29udGVudChodG1sX2E2Nzk2OWU2ZTExMjRiYzRiNzg2ODY0MGE0NjJkNmZiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzMwYTkzMGM5NDMxMjRjMDBiMWFmMDQ0YjNkODA2ZWM3LmJpbmRQb3B1cChwb3B1cF9mMzQxMzJiMjM1ZWI0ODViOGJkNmI2ZWNkMjczZjRjMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDFmODE0ZTU0MzI3NGJkYmJlNzg0NWUxOGIxN2IyYjYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41MDczNTA5LC0wLjEyNzc1ODNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYmUwZDI1NWI5YzFlNDg1ZTg3YjU0ZjI3MGE1YjY4MDApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTMwMDE3ODYzOWY5NGU2OThkOTg1YWQ0OGI5MjlkZjIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjg4N2M0MzRjZDgxNGNkMGI0ZDc0NTM2NDk3OGFjMzkgPSAkKCc8ZGl2IGlkPSJodG1sXzI4ODdjNDM0Y2Q4MTRjZDBiNGQ3NDUzNjQ5NzhhYzM5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SSVNFIE11dHVhbCBDSUMgKExvbmRvbiwgVUspPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lMzAwMTc4NjM5Zjk0ZTY5OGQ5ODVhZDQ4YjkyOWRmMi5zZXRDb250ZW50KGh0bWxfMjg4N2M0MzRjZDgxNGNkMGI0ZDc0NTM2NDk3OGFjMzkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDFmODE0ZTU0MzI3NGJkYmJlNzg0NWUxOGIxN2IyYjYuYmluZFBvcHVwKHBvcHVwX2UzMDAxNzg2MzlmOTRlNjk4ZDk4NWFkNDhiOTI5ZGYyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hOTY0NWI2NDEyNTc0YmY4YmY0ZGU0NjRiNjIwNjQzMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjUzODg4OTk5OTk5OTk5LDAuMTQ3NDNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYmUwZDI1NWI5YzFlNDg1ZTg3YjU0ZjI3MGE1YjY4MDApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMWU1YzkxN2ZmMDA2NGI3YWIyNjBlNTJiYWZkMTZlNWUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTRmMWZjMjAxYmQwNDA3YmFjOWIwMGE4MzQ0ZmQ1ZjAgPSAkKCc8ZGl2IGlkPSJodG1sXzU0ZjFmYzIwMWJkMDQwN2JhYzliMDBhODM0NGZkNWYwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Db21tdW5pdHkgUmVzb3VyY2VzIGZvciBDaGFuZ2UgKERhZ2VuaGFtKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMWU1YzkxN2ZmMDA2NGI3YWIyNjBlNTJiYWZkMTZlNWUuc2V0Q29udGVudChodG1sXzU0ZjFmYzIwMWJkMDQwN2JhYzliMDBhODM0NGZkNWYwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2E5NjQ1YjY0MTI1NzRiZjhiZjRkZTQ2NGI2MjA2NDMyLmJpbmRQb3B1cChwb3B1cF8xZTVjOTE3ZmYwMDY0YjdhYjI2MGU1MmJhZmQxNmU1ZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTA4ZjhjYThhODAxNDczZDhkN2NjY2RjMTY0ZThkZGEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41MDczNTA5LC0wLjEyNzc1ODNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYmUwZDI1NWI5YzFlNDg1ZTg3YjU0ZjI3MGE1YjY4MDApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzAxYTA0Y2UwNjg4NGJiNGIwMDg2ZmZkMzZkMDZmOTggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTVkNzJkMDk1YzNjNGZhZjgxYTA0OTBjMDM2NWQyZjggPSAkKCc8ZGl2IGlkPSJodG1sXzE1ZDcyZDA5NWMzYzRmYWY4MWEwNDkwYzAzNjVkMmY4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CZXN0IEJlZ2lubmluZ3MgKExvbmRvbik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzMwMWEwNGNlMDY4ODRiYjRiMDA4NmZmZDM2ZDA2Zjk4LnNldENvbnRlbnQoaHRtbF8xNWQ3MmQwOTVjM2M0ZmFmODFhMDQ5MGMwMzY1ZDJmOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hMDhmOGNhOGE4MDE0NzNkOGQ3Y2NjZGMxNjRlOGRkYS5iaW5kUG9wdXAocG9wdXBfMzAxYTA0Y2UwNjg4NGJiNGIwMDg2ZmZkMzZkMDZmOTgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzVkOTg1MjZmMTZlNDQyODM4ZjY4YTAwZjlmMTM1ZjEzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTAuMzc1NDU2NSwtNC4xNDI2NTY1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2JlMGQyNTViOWMxZTQ4NWU4N2I1NGYyNzBhNWI2ODAwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E4NGEzZjYyNmFkMzRmOTFiYjgxNjU5MTQwNjEyZTNjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2QwZDg2OGNhZTYxZTRmNzg5Y2U4ZjE4NjIwNzhiZjEzID0gJCgnPGRpdiBpZD0iaHRtbF9kMGQ4NjhjYWU2MWU0Zjc4OWNlOGYxODYyMDc4YmYxMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UGx5bW91dGggTXVzaWMgWm9uZSAoUGx5bW91dGgpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hODRhM2Y2MjZhZDM0ZjkxYmI4MTY1OTE0MDYxMmUzYy5zZXRDb250ZW50KGh0bWxfZDBkODY4Y2FlNjFlNGY3ODljZThmMTg2MjA3OGJmMTMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNWQ5ODUyNmYxNmU0NDI4MzhmNjhhMDBmOWYxMzVmMTMuYmluZFBvcHVwKHBvcHVwX2E4NGEzZjYyNmFkMzRmOTFiYjgxNjU5MTQwNjEyZTNjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81NzdjZDQzNjIxZGU0MTVmYjQ4MGZjNDdmYmFhZDJlMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUwLjkwODU5NiwwLjI0OTQyMzVdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYmUwZDI1NWI5YzFlNDg1ZTg3YjU0ZjI3MGE1YjY4MDApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzFjYTEyNThhNTYzNDkyOWFmMTUyOGEwMzhkYjU5NWUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNThiODk1OWE4ZmFhNGEzYmIwYjhiZGQzZGI5OThlZjkgPSAkKCc8ZGl2IGlkPSJodG1sXzU4Yjg5NTlhOGZhYTRhM2JiMGI4YmRkM2RiOTk4ZWY5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Qb3NpdGl2ZU5lZ2F0aXZlcyAoRWFzdCBTdXNzZXgpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83MWNhMTI1OGE1NjM0OTI5YWYxNTI4YTAzOGRiNTk1ZS5zZXRDb250ZW50KGh0bWxfNThiODk1OWE4ZmFhNGEzYmIwYjhiZGQzZGI5OThlZjkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTc3Y2Q0MzYyMWRlNDE1ZmI0ODBmYzQ3ZmJhYWQyZTIuYmluZFBvcHVwKHBvcHVwXzcxY2ExMjU4YTU2MzQ5MjlhZjE1MjhhMDM4ZGI1OTVlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80MzYxMGZmOWIxN2E0MjNkOTEwMzU1NDg1MjMyOTk0NCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjM3MDkyMiwxLjEyNzc3MV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9iZTBkMjU1YjljMWU0ODVlODdiNTRmMjcwYTViNjgwMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yNjJiNWJlZjgzNTg0MzE5ODY4NDg2MzA1YWY4NTQ4MSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83OGVkZmM1YWU2ZGE0OWNlYTYwM2Y2NjUxMjFiOGZhZSA9ICQoJzxkaXYgaWQ9Imh0bWxfNzhlZGZjNWFlNmRhNDljZWE2MDNmNjY1MTIxYjhmYWUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJyaWdodCBTaGFkb3cgIChIZXJuZSBCYXkpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yNjJiNWJlZjgzNTg0MzE5ODY4NDg2MzA1YWY4NTQ4MS5zZXRDb250ZW50KGh0bWxfNzhlZGZjNWFlNmRhNDljZWE2MDNmNjY1MTIxYjhmYWUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDM2MTBmZjliMTdhNDIzZDkxMDM1NTQ4NTIzMjk5NDQuYmluZFBvcHVwKHBvcHVwXzI2MmI1YmVmODM1ODQzMTk4Njg0ODYzMDVhZjg1NDgxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wZDM5YjFkYzIyNDg0OTNjYTc2MjViYzMzNjY4OGEyZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUzLjI5MzE4MTk5OTk5OTk5LC0zLjcyNzY0XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2JlMGQyNTViOWMxZTQ4NWU4N2I1NGYyNzBhNWI2ODAwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzkxMjQ3ZWY2NzUyNDRhYmZhMzYxM2YyZjM4YmJjZGYyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzYyYmZmZDViNWE2NzQ2MzA5MTY1NGRjM2UyMWNjNzViID0gJCgnPGRpdiBpZD0iaHRtbF82MmJmZmQ1YjVhNjc0NjMwOTE2NTRkYzNlMjFjYzc1YiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tm9ydGggV2FsZXMgRGVhZiBBc3NvY2lhdGlvbiAoQ29sd3luIEJheSwgTm9ydGggV2FsZXMpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85MTI0N2VmNjc1MjQ0YWJmYTM2MTNmMmYzOGJiY2RmMi5zZXRDb250ZW50KGh0bWxfNjJiZmZkNWI1YTY3NDYzMDkxNjU0ZGMzZTIxY2M3NWIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMGQzOWIxZGMyMjQ4NDkzY2E3NjI1YmMzMzY2ODhhMmUuYmluZFBvcHVwKHBvcHVwXzkxMjQ3ZWY2NzUyNDRhYmZhMzYxM2YyZjM4YmJjZGYyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83OWZmNDkwOWRjYTQ0MGIzYTc4OTcxNDM4ZTY3ODEyMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjUwNzM1MDksLTAuMTI3NzU4M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9iZTBkMjU1YjljMWU0ODVlODdiNTRmMjcwYTViNjgwMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yMTFmY2U2ZWZlNDU0ZTYzOWZjYmZmZjczYjI2ZDc0MSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iYmM0ZTUyNDdhNGQ0ODhjYTY5ODFlYjBkNTNlMWExNSA9ICQoJzxkaXYgaWQ9Imh0bWxfYmJjNGU1MjQ3YTRkNDg4Y2E2OTgxZWIwZDUzZTFhMTUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlRlY2hub2xvZ3kgVHJ1c3QgKExvbmRvbik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzIxMWZjZTZlZmU0NTRlNjM5ZmNiZmZmNzNiMjZkNzQxLnNldENvbnRlbnQoaHRtbF9iYmM0ZTUyNDdhNGQ0ODhjYTY5ODFlYjBkNTNlMWExNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83OWZmNDkwOWRjYTQ0MGIzYTc4OTcxNDM4ZTY3ODEyMC5iaW5kUG9wdXAocG9wdXBfMjExZmNlNmVmZTQ1NGU2MzlmY2JmZmY3M2IyNmQ3NDEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzEyZmYxZWMzMzY3YzQ0NDc5YTk0YjBlYzI0ZTI0MGM5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNTU1NzczOTAwMDAwMDEsLTEuNzc5NzE3Nl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9iZTBkMjU1YjljMWU0ODVlODdiNTRmMjcwYTViNjgwMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83ZjQ3ZTRjNzVkMTg0NTE2ODA4MjVkOGJlYmY0MGExOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jNTc2MGRlOGMzN2Y0MDJhYjVjMTYwZjhjOGFlZDhhNSA9ICQoJzxkaXYgaWQ9Imh0bWxfYzU3NjBkZThjMzdmNDAyYWI1YzE2MGY4YzhhZWQ4YTUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNyZWF0ZSBTdHVkaW9zIERpZ2l0YWwgTWVkaWEgQ0lDIChTd2luZG9uKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfN2Y0N2U0Yzc1ZDE4NDUxNjgwODI1ZDhiZWJmNDBhMTkuc2V0Q29udGVudChodG1sX2M1NzYwZGU4YzM3ZjQwMmFiNWMxNjBmOGM4YWVkOGE1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzEyZmYxZWMzMzY3YzQ0NDc5YTk0YjBlYzI0ZTI0MGM5LmJpbmRQb3B1cChwb3B1cF83ZjQ3ZTRjNzVkMTg0NTE2ODA4MjVkOGJlYmY0MGExOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTExZTI3ZjEyNDFjNDFlMDlkOWRiM2NjM2E0YTc4OTggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41MDczNTA5LC0wLjEyNzc1ODNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYmUwZDI1NWI5YzFlNDg1ZTg3YjU0ZjI3MGE1YjY4MDApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2Q0NTVjOTczMjY1NDQwYmI4OWE5OGM5MjJiZjg2ZDkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWVlNTQ5N2I1MTJkNDY4Mjg3ODIyOTY2YmEzYWVjNTcgPSAkKCc8ZGl2IGlkPSJodG1sX2FlZTU0OTdiNTEyZDQ2ODI4NzgyMjk2NmJhM2FlYzU3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Xb21lbiBpbiBQcmlzb24gKExvbmRvbik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzdkNDU1Yzk3MzI2NTQ0MGJiODlhOThjOTIyYmY4NmQ5LnNldENvbnRlbnQoaHRtbF9hZWU1NDk3YjUxMmQ0NjgyODc4MjI5NjZiYTNhZWM1Nyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85MTFlMjdmMTI0MWM0MWUwOWQ5ZGIzY2MzYTRhNzg5OC5iaW5kUG9wdXAocG9wdXBfN2Q0NTVjOTczMjY1NDQwYmI4OWE5OGM5MjJiZjg2ZDkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQ3OWM3M2Y3MjliYTQ2NTE4OTZhZGFiZjRjYzhkMTFhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuMDc4MTU5OSwtNC4wNTgzMzhdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYmUwZDI1NWI5YzFlNDg1ZTg3YjU0ZjI3MGE1YjY4MDApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmNhNmVkN2Y5NWVkNDEyNTg5ZDJkOTEwYzNlNTNhNDQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjJmZDE1YmU3ZTBhNDUyNjk1ODRjMDczNDNjOTdjZmQgPSAkKCc8ZGl2IGlkPSJodG1sXzYyZmQxNWJlN2UwYTQ1MjY5NTg0YzA3MzQzYzk3Y2ZkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Tb3V0aCBXZXN0IEZhbWlseSBTdXBwb3J0IChCYXJuc3RhcGxlKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYmNhNmVkN2Y5NWVkNDEyNTg5ZDJkOTEwYzNlNTNhNDQuc2V0Q29udGVudChodG1sXzYyZmQxNWJlN2UwYTQ1MjY5NTg0YzA3MzQzYzk3Y2ZkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQ3OWM3M2Y3MjliYTQ2NTE4OTZhZGFiZjRjYzhkMTFhLmJpbmRQb3B1cChwb3B1cF9iY2E2ZWQ3Zjk1ZWQ0MTI1ODlkMmQ5MTBjM2U1M2E0NCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNWIwMTNiZGFkODEzNDczZGJjMTg4N2IyZDM2NWRjOTggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41MDczNTA5LC0wLjEyNzc1ODNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYmUwZDI1NWI5YzFlNDg1ZTg3YjU0ZjI3MGE1YjY4MDApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNWQ1ZWY2YWZjYjRkNDQ5OGJjNWNjMWFjODM1MDlhMTQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWM0MTFkMjNhMTNhNDZhMWI5NWI0MjlhZDI2NjkzZGUgPSAkKCc8ZGl2IGlkPSJodG1sXzVjNDExZDIzYTEzYTQ2YTFiOTViNDI5YWQyNjY5M2RlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NaW5pc3RyeSBvZiBTdG9yaWVzIChMb25kb24pPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81ZDVlZjZhZmNiNGQ0NDk4YmM1Y2MxYWM4MzUwOWExNC5zZXRDb250ZW50KGh0bWxfNWM0MTFkMjNhMTNhNDZhMWI5NWI0MjlhZDI2NjkzZGUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNWIwMTNiZGFkODEzNDczZGJjMTg4N2IyZDM2NWRjOTguYmluZFBvcHVwKHBvcHVwXzVkNWVmNmFmY2I0ZDQ0OThiYzVjYzFhYzgzNTA5YTE0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iY2VhYmQwYzQyMWQ0ZTRiODE4ZThjNjE1ZGE5YTljZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUyLjI1NDUyMjUsLTIuMjY2ODM4Ml0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9iZTBkMjU1YjljMWU0ODVlODdiNTRmMjcwYTViNjgwMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82ZmE0NGYyYTk2YTI0MTkyOWVhMjI4NzRlMDVmMGZlYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yOGI4NzQ1ZTA2YTg0MTY5ODc2MThjYjNmNjJlZjM2NSA9ICQoJzxkaXYgaWQ9Imh0bWxfMjhiODc0NWUwNmE4NDE2OTg3NjE4Y2IzZjYyZWYzNjUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNvY2lhbCBGaW5hbmNlIEx0ZCAod29yY2VzdGVyc2hpcmUpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82ZmE0NGYyYTk2YTI0MTkyOWVhMjI4NzRlMDVmMGZlYi5zZXRDb250ZW50KGh0bWxfMjhiODc0NWUwNmE4NDE2OTg3NjE4Y2IzZjYyZWYzNjUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYmNlYWJkMGM0MjFkNGU0YjgxOGU4YzYxNWRhOWE5Y2UuYmluZFBvcHVwKHBvcHVwXzZmYTQ0ZjJhOTZhMjQxOTI5ZWEyMjg3NGUwNWYwZmViKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82ZDQxZjlmMGNkYmU0ZDNkYjA4MTY4ZjQ0MjBmNWYzZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjUwNzM1MDksLTAuMTI3NzU4M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9iZTBkMjU1YjljMWU0ODVlODdiNTRmMjcwYTViNjgwMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xNDBlOTM3ODA2ZTI0ZmM5YmY0Y2NjMGZmMTg4MjlkMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83ODkxODNhYWYxZWI0MGJlYTVlYTIwMjQ2YWE2YzE0NiA9ICQoJzxkaXYgaWQ9Imh0bWxfNzg5MTgzYWFmMWViNDBiZWE1ZWEyMDI0NmFhNmMxNDYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNlbnRyZXBvaW50IChMb25kb24pPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xNDBlOTM3ODA2ZTI0ZmM5YmY0Y2NjMGZmMTg4MjlkMS5zZXRDb250ZW50KGh0bWxfNzg5MTgzYWFmMWViNDBiZWE1ZWEyMDI0NmFhNmMxNDYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNmQ0MWY5ZjBjZGJlNGQzZGIwODE2OGY0NDIwZjVmM2UuYmluZFBvcHVwKHBvcHVwXzE0MGU5Mzc4MDZlMjRmYzliZjRjY2MwZmYxODgyOWQxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mN2NjY2FkMjcwZTU0Y2Y0YTkxNmMyYzdlYzc5MTVjMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjM3NTgwMSwtMi4zNTk5MDM5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2JlMGQyNTViOWMxZTQ4NWU4N2I1NGYyNzBhNWI2ODAwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2I4MDk0MGYzZTViODRiNTNiYmFjYWQ3ZTUzNWQwMTU0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM1Y2M1NTY4ZmNlMTQ2NDU4M2EwNjFhMzU0MjkxMDBmID0gJCgnPGRpdiBpZD0iaHRtbF8zNWNjNTU2OGZjZTE0NjQ1ODNhMDYxYTM1NDI5MTAwZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmF0aCBDYXJlcnMgRW50ZXJwcmlzZXMgTHRkIChCYXRoKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjgwOTQwZjNlNWI4NGI1M2JiYWNhZDdlNTM1ZDAxNTQuc2V0Q29udGVudChodG1sXzM1Y2M1NTY4ZmNlMTQ2NDU4M2EwNjFhMzU0MjkxMDBmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Y3Y2NjYWQyNzBlNTRjZjRhOTE2YzJjN2VjNzkxNWMwLmJpbmRQb3B1cChwb3B1cF9iODA5NDBmM2U1Yjg0YjUzYmJhY2FkN2U1MzVkMDE1NCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWYyZjYyY2VkYTcxNGFlNGIxNWRhNDgxZjYzMmQxMzMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS40ODE1ODEwMDAwMDAwMSwtMy4xNzkwOV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9iZTBkMjU1YjljMWU0ODVlODdiNTRmMjcwYTViNjgwMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mZGQ3NGU5NjhjMzM0Y2RlYjI3MDI4NWYwYmNjMGQ4YiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81OGI0ZmM0ZTVlZGI0NmY0YjE5YjQyY2JmMWIxNTA2ZCA9ICQoJzxkaXYgaWQ9Imh0bWxfNThiNGZjNGU1ZWRiNDZmNGIxOWI0MmNiZjFiMTUwNmQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFjdGlvbiBvbiBIZWFyaW5nIExvc3MgQ3ltcnUgKENhcmRpZmYpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mZGQ3NGU5NjhjMzM0Y2RlYjI3MDI4NWYwYmNjMGQ4Yi5zZXRDb250ZW50KGh0bWxfNThiNGZjNGU1ZWRiNDZmNGIxOWI0MmNiZjFiMTUwNmQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMWYyZjYyY2VkYTcxNGFlNGIxNWRhNDgxZjYzMmQxMzMuYmluZFBvcHVwKHBvcHVwX2ZkZDc0ZTk2OGMzMzRjZGViMjcwMjg1ZjBiY2MwZDhiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82YmYxYWE2ZjE4NzA0YjY4YTM0YTZlYjY4ZTVjZDQ4MCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjUwNzM1MDksLTAuMTI3NzU4M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9iZTBkMjU1YjljMWU0ODVlODdiNTRmMjcwYTViNjgwMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84YjE3ZGYyNGZmYjY0YjkwODc3ZjQwMDhiYjcyYjc2ZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xMjA1NTA5MGIxZTA0MWQ2YTIyMmVkZjg3YzRhN2IyNyA9ICQoJzxkaXYgaWQ9Imh0bWxfMTIwNTUwOTBiMWUwNDFkNmEyMjJlZGY4N2M0YTdiMjciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlRpdGhlQmFybiBHaXZpbmcgRnVuZCAoTG9uZG9uKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOGIxN2RmMjRmZmI2NGI5MDg3N2Y0MDA4YmI3MmI3NmUuc2V0Q29udGVudChodG1sXzEyMDU1MDkwYjFlMDQxZDZhMjIyZWRmODdjNGE3YjI3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzZiZjFhYTZmMTg3MDRiNjhhMzRhNmViNjhlNWNkNDgwLmJpbmRQb3B1cChwb3B1cF84YjE3ZGYyNGZmYjY0YjkwODc3ZjQwMDhiYjcyYjc2ZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWU4OGEyZmU0M2E2NDc3ODlhZTA2NmEwMjc4N2Y3ZjEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41MDczNTA5LC0wLjEyNzc1ODNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYmUwZDI1NWI5YzFlNDg1ZTg3YjU0ZjI3MGE1YjY4MDApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmNlOWI0Y2RkOTA4NDE1MTlhZmUzZTE1N2I3MmY5NzIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmIyNjFhNGM0ZDQ2NGZiOGI0MjYyNzEyMzQ5OTljOTggPSAkKCc8ZGl2IGlkPSJodG1sX2ZiMjYxYTRjNGQ0NjRmYjhiNDI2MjcxMjM0OTk5Yzk4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MaWZlbGluZSBQcm9qZWN0IChMb25kb24pPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82Y2U5YjRjZGQ5MDg0MTUxOWFmZTNlMTU3YjcyZjk3Mi5zZXRDb250ZW50KGh0bWxfZmIyNjFhNGM0ZDQ2NGZiOGI0MjYyNzEyMzQ5OTljOTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMWU4OGEyZmU0M2E2NDc3ODlhZTA2NmEwMjc4N2Y3ZjEuYmluZFBvcHVwKHBvcHVwXzZjZTliNGNkZDkwODQxNTE5YWZlM2UxNTdiNzJmOTcyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lYzBjNzJjYzA3OTY0M2VmYTEzODMxZDUyOTgyOGFjMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjUwNzM1MDksLTAuMTI3NzU4M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9iZTBkMjU1YjljMWU0ODVlODdiNTRmMjcwYTViNjgwMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lMzI1NmZlOWVkYTE0NjU3OWU1NTY4NDRlYzQ4ZmQyNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83ZDY5NDU4YzA4MDE0ZDg2OWNiZDczMTY0YTNkZWRmMiA9ICQoJzxkaXYgaWQ9Imh0bWxfN2Q2OTQ1OGMwODAxNGQ4NjljYmQ3MzE2NGEzZGVkZjIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJ1ZGR5SHViIChMb25kb24pPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lMzI1NmZlOWVkYTE0NjU3OWU1NTY4NDRlYzQ4ZmQyNy5zZXRDb250ZW50KGh0bWxfN2Q2OTQ1OGMwODAxNGQ4NjljYmQ3MzE2NGEzZGVkZjIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZWMwYzcyY2MwNzk2NDNlZmExMzgzMWQ1Mjk4MjhhYzAuYmluZFBvcHVwKHBvcHVwX2UzMjU2ZmU5ZWRhMTQ2NTc5ZTU1Njg0NGVjNDhmZDI3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mOTM4YWJlODE1YTA0YmQzOTU4MjE2ZmI4NGQ3ZjMxNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjUwNzM1MDksLTAuMTI3NzU4M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9iZTBkMjU1YjljMWU0ODVlODdiNTRmMjcwYTViNjgwMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84MWNiODFmMmY3NGU0MGRmOTY3ZTQxODFkNDMxYTM1OSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85NjgwOGZjY2UwZWU0YWZiYjM3OWFkMjI5MDQwNWVmNSA9ICQoJzxkaXYgaWQ9Imh0bWxfOTY4MDhmY2NlMGVlNGFmYmIzNzlhZDIyOTA0MDVlZjUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFubmEgRnJldWQgTmF0aW9uYWwgQ2VudHJlIEZvciBDaGlsZHJlbiBhbmQgRmFtaWxpZXMgKExvbmRvbik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzgxY2I4MWYyZjc0ZTQwZGY5NjdlNDE4MWQ0MzFhMzU5LnNldENvbnRlbnQoaHRtbF85NjgwOGZjY2UwZWU0YWZiYjM3OWFkMjI5MDQwNWVmNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mOTM4YWJlODE1YTA0YmQzOTU4MjE2ZmI4NGQ3ZjMxNi5iaW5kUG9wdXAocG9wdXBfODFjYjgxZjJmNzRlNDBkZjk2N2U0MTgxZDQzMWEzNTkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzU4MWY0YjljYWI0MTQ3MGZiODA3NDQxNWZhMTZjODQ5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNTA3MzUwOSwtMC4xMjc3NTgzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2JlMGQyNTViOWMxZTQ4NWU4N2I1NGYyNzBhNWI2ODAwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzlkMWEwZTllNDc0OTQ1MjU4YjdkZjM0ZjExYmFhZmEwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzE5YTYwY2M2ZjNiODRmYWJhNWI4MDFmMGJhYjViZGM3ID0gJCgnPGRpdiBpZD0iaHRtbF8xOWE2MGNjNmYzYjg0ZmFiYTViODAxZjBiYWI1YmRjNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3BpY2UgSW5ub3ZhdGlvbnMgKExvbmRvbik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzlkMWEwZTllNDc0OTQ1MjU4YjdkZjM0ZjExYmFhZmEwLnNldENvbnRlbnQoaHRtbF8xOWE2MGNjNmYzYjg0ZmFiYTViODAxZjBiYWI1YmRjNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81ODFmNGI5Y2FiNDE0NzBmYjgwNzQ0MTVmYTE2Yzg0OS5iaW5kUG9wdXAocG9wdXBfOWQxYTBlOWU0NzQ5NDUyNThiN2RmMzRmMTFiYWFmYTApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzY0OWY5MjU5ZTY0MjQ3YmE5NTgxZDg3NjdkOWE1NTcxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTUuOTUzMjUyLC0zLjE4ODI2N10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9iZTBkMjU1YjljMWU0ODVlODdiNTRmMjcwYTViNjgwMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83MjNlY2FkYzdiODA0MThjOGRhNjdlMTE5NzIzMjA2MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jOGFhNTA4ZjkyZDQ0ZDBjYmY4ZmMzNWUyNDU1NzQwNSA9ICQoJzxkaXYgaWQ9Imh0bWxfYzhhYTUwOGY5MmQ0NGQwY2JmOGZjMzVlMjQ1NTc0MDUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPllvdW5nIFNjb3QgKEVkaW5idXJnaCk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzcyM2VjYWRjN2I4MDQxOGM4ZGE2N2UxMTk3MjMyMDYwLnNldENvbnRlbnQoaHRtbF9jOGFhNTA4ZjkyZDQ0ZDBjYmY4ZmMzNWUyNDU1NzQwNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82NDlmOTI1OWU2NDI0N2JhOTU4MWQ4NzY3ZDlhNTU3MS5iaW5kUG9wdXAocG9wdXBfNzIzZWNhZGM3YjgwNDE4YzhkYTY3ZTExOTcyMzIwNjApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2RjOWQ3YTA4ODM0ZjRmYjU5N2I0YWI0MTIzNDY3YWU3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNTMwNjI3LC0wLjAyODM1M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9iZTBkMjU1YjljMWU0ODVlODdiNTRmMjcwYTViNjgwMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yNDBjOWU5ZjNmYTI0ZTg0OThjNzIxNGQxZjEyZDUxYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84ZmMzMzdhYmQ0YWU0NzJhYjI2MjNhZDQzNmJlMThmMCA9ICQoJzxkaXYgaWQ9Imh0bWxfOGZjMzM3YWJkNGFlNDcyYWIyNjIzYWQ0MzZiZTE4ZjAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJyb21sZXkgYnkgQm93IENlbnRyZSAoQm93LCBUb3dlciBIYW1sZXRzLCBMb25kb24pPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yNDBjOWU5ZjNmYTI0ZTg0OThjNzIxNGQxZjEyZDUxYi5zZXRDb250ZW50KGh0bWxfOGZjMzM3YWJkNGFlNDcyYWIyNjIzYWQ0MzZiZTE4ZjApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZGM5ZDdhMDg4MzRmNGZiNTk3YjRhYjQxMjM0NjdhZTcuYmluZFBvcHVwKHBvcHVwXzI0MGM5ZTlmM2ZhMjRlODQ5OGM3MjE0ZDFmMTJkNTFiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lNGI5MjgzMzM0NmE0MGYyOWM1MzViNTBjNDdhZmU0OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjA2ODc4NSwtMS43OTQ0NzJdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYmUwZDI1NWI5YzFlNDg1ZTg3YjU0ZjI3MGE1YjY4MDApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDY3MWJjYzhkMTJlNDYyMGJmZWNkNTkzNDkzYmJhYjUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjMzNzdlOGFiZTY0NGVmYThlYmE0NzQ0OWJjNTZlZTkgPSAkKCc8ZGl2IGlkPSJodG1sX2YzMzc3ZThhYmU2NDRlZmE4ZWJhNDc0NDliYzU2ZWU5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5UcnVzc2VsbCBUcnVzdCAoU2FsaXNidXJ5KTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDY3MWJjYzhkMTJlNDYyMGJmZWNkNTkzNDkzYmJhYjUuc2V0Q29udGVudChodG1sX2YzMzc3ZThhYmU2NDRlZmE4ZWJhNDc0NDliYzU2ZWU5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2U0YjkyODMzMzQ2YTQwZjI5YzUzNWI1MGM0N2FmZTQ5LmJpbmRQb3B1cChwb3B1cF9kNjcxYmNjOGQxMmU0NjIwYmZlY2Q1OTM0OTNiYmFiNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDJlMDgyYTA2NjBlNGIxODg4NTkwN2M0ZDViMTM0NTcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1NS4wMTgyMzk5LC0xLjQ4NTg0MzZdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYmUwZDI1NWI5YzFlNDg1ZTg3YjU0ZjI3MGE1YjY4MDApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGMzMDk5ZjEzYTA0NDlmYmE4Y2RhZGI2ZmMwZGQwOGQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTk4YzA2YzViNmU3NDNkYTg3N2JhZjZmZGY4MTRkNjggPSAkKCc8ZGl2IGlkPSJodG1sXzE5OGMwNmM1YjZlNzQzZGE4NzdiYWY2ZmRmODE0ZDY4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ob3J0aCBUeW5lc2lkZSBWT0RBIChOb3J0aCBUeW5lc2lkZSk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzBjMzA5OWYxM2EwNDQ5ZmJhOGNkYWRiNmZjMGRkMDhkLnNldENvbnRlbnQoaHRtbF8xOThjMDZjNWI2ZTc0M2RhODc3YmFmNmZkZjgxNGQ2OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kMmUwODJhMDY2MGU0YjE4ODg1OTA3YzRkNWIxMzQ1Ny5iaW5kUG9wdXAocG9wdXBfMGMzMDk5ZjEzYTA0NDlmYmE4Y2RhZGI2ZmMwZGQwOGQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ZiZmU3NDc3MWZmYzRiNzI5NDljZDUwNDBiNTMwMzJhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTMuNzYzMjI1NCwtMi43MDQ0MDUyXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2JlMGQyNTViOWMxZTQ4NWU4N2I1NGYyNzBhNWI2ODAwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzY0Y2M4MzU5NjE2ZDRjODdiNWYzYzk1MzkxZDBjOWFmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzdiOGUxY2MyOWE4YTQxZmViMmVkOGY0NDdiZjkwYWVlID0gJCgnPGRpdiBpZD0iaHRtbF83YjhlMWNjMjlhOGE0MWZlYjJlZDhmNDQ3YmY5MGFlZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U2FmZXIgVG9nZXRoZXIgLyBIQVJWIChsYW5jYXNoaXJlKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjRjYzgzNTk2MTZkNGM4N2I1ZjNjOTUzOTFkMGM5YWYuc2V0Q29udGVudChodG1sXzdiOGUxY2MyOWE4YTQxZmViMmVkOGY0NDdiZjkwYWVlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2ZiZmU3NDc3MWZmYzRiNzI5NDljZDUwNDBiNTMwMzJhLmJpbmRQb3B1cChwb3B1cF82NGNjODM1OTYxNmQ0Yzg3YjVmM2M5NTM5MWQwYzlhZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjNhMTllY2YyYTJiNDNiOWI5ZWJkODFhNGI1NGJhNjQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1Mi40ODYyNDI5OTk5OTk5OSwtMS44OTA0MDFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYmUwZDI1NWI5YzFlNDg1ZTg3YjU0ZjI3MGE1YjY4MDApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2M3YmYwY2ExY2U2NGY1Y2FhYzBjODZmMTI1M2JlZjcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjU0ODI4YjU0MjU2NDlhYmIwYzJkOTg4OGRjYzAwMTggPSAkKCc8ZGl2IGlkPSJodG1sX2Y1NDgyOGI1NDI1NjQ5YWJiMGMyZDk4ODhkY2MwMDE4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DaGFuZ2VzIFVLIChCaXJtaW5naGFtKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfN2M3YmYwY2ExY2U2NGY1Y2FhYzBjODZmMTI1M2JlZjcuc2V0Q29udGVudChodG1sX2Y1NDgyOGI1NDI1NjQ5YWJiMGMyZDk4ODhkY2MwMDE4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzYzYTE5ZWNmMmEyYjQzYjliOWViZDgxYTRiNTRiYTY0LmJpbmRQb3B1cChwb3B1cF83YzdiZjBjYTFjZTY0ZjVjYWFjMGM4NmYxMjUzYmVmNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzQwNjNiY2Y0MzljNDViYjlkNDc5NDMxMTA1NjRjNTUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1My44MDA3NTU0LC0xLjU0OTA3NzRdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYmUwZDI1NWI5YzFlNDg1ZTg3YjU0ZjI3MGE1YjY4MDApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTE0ZGY4YTc3M2FlNDlkZjg5MmI2YmMyZjJlOWZkYmYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzA3ODIyZmEwZWZlNGE1ZGI0YmY2MTNkNjRmYTYwMmUgPSAkKCc8ZGl2IGlkPSJodG1sX2MwNzgyMmZhMGVmZTRhNWRiNGJmNjEzZDY0ZmE2MDJlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5WYWxsYSAoTGVlZHMpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xMTRkZjhhNzczYWU0OWRmODkyYjZiYzJmMmU5ZmRiZi5zZXRDb250ZW50KGh0bWxfYzA3ODIyZmEwZWZlNGE1ZGI0YmY2MTNkNjRmYTYwMmUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzQwNjNiY2Y0MzljNDViYjlkNDc5NDMxMTA1NjRjNTUuYmluZFBvcHVwKHBvcHVwXzExNGRmOGE3NzNhZTQ5ZGY4OTJiNmJjMmYyZTlmZGJmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hMzVkNjFhMWEyMjA0YzA1OTgxNjM3M2QwYWI0YWE4OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjUwNzM1MDksLTAuMTI3NzU4M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9iZTBkMjU1YjljMWU0ODVlODdiNTRmMjcwYTViNjgwMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jYzg4MGZhZTgwNGI0ZjJhOWUxZTM2NTM3NmU3MWRjYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85ZjA0ZjA3MGE5MWE0MjZiOWE0ZjA0ZTQ2Y2NiYTZlMiA9ICQoJzxkaXYgaWQ9Imh0bWxfOWYwNGYwNzBhOTFhNDI2YjlhNGYwNGU0NmNjYmE2ZTIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPnbigKJpbnNwaXJlZCAoTG9uZG9uKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2M4ODBmYWU4MDRiNGYyYTllMWUzNjUzNzZlNzFkY2Muc2V0Q29udGVudChodG1sXzlmMDRmMDcwYTkxYTQyNmI5YTRmMDRlNDZjY2JhNmUyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2EzNWQ2MWExYTIyMDRjMDU5ODE2MzczZDBhYjRhYTg5LmJpbmRQb3B1cChwb3B1cF9jYzg4MGZhZTgwNGI0ZjJhOWUxZTM2NTM3NmU3MWRjYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODE4NzVmNjc5NDRjNGRjMjlhYmQ2ZDI0ODcyNDEwZDkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41MDczNTA5LC0wLjEyNzc1ODNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYmUwZDI1NWI5YzFlNDg1ZTg3YjU0ZjI3MGE1YjY4MDApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMWE4N2I0NmQ1ODM3NDQxNWI1MjAxZGI0OWExOWFkMzggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzNmZjcyMGE0MTA1NDQzZDkxMjk4OTJlNzVmMDY2N2YgPSAkKCc8ZGl2IGlkPSJodG1sX2MzZmY3MjBhNDEwNTQ0M2Q5MTI5ODkyZTc1ZjA2NjdmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IZWxwVGV4dCAoTG9uZG9uKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMWE4N2I0NmQ1ODM3NDQxNWI1MjAxZGI0OWExOWFkMzguc2V0Q29udGVudChodG1sX2MzZmY3MjBhNDEwNTQ0M2Q5MTI5ODkyZTc1ZjA2NjdmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzgxODc1ZjY3OTQ0YzRkYzI5YWJkNmQyNDg3MjQxMGQ5LmJpbmRQb3B1cChwb3B1cF8xYTg3YjQ2ZDU4Mzc0NDE1YjUyMDFkYjQ5YTE5YWQzOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzAxNTEyZTFkNWQ3NGNmZjlkYjM0YThlZTVmNmNkNWIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41MDczNTA5LC0wLjEyNzc1ODNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYmUwZDI1NWI5YzFlNDg1ZTg3YjU0ZjI3MGE1YjY4MDApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDIzNDg4OTI3ZjA4NDM0M2I0Y2VjN2I5MDYyY2RjOTcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzY5Y2Q5ZTE4OWNhNGJlYmFkNDFmZDIwODE3NzVmOTEgPSAkKCc8ZGl2IGlkPSJodG1sXzM2OWNkOWUxODljYTRiZWJhZDQxZmQyMDgxNzc1ZjkxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BY3Rpb24gRm9yIENoaWxkcmVuIChMb25kb24pPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kMjM0ODg5MjdmMDg0MzQzYjRjZWM3YjkwNjJjZGM5Ny5zZXRDb250ZW50KGh0bWxfMzY5Y2Q5ZTE4OWNhNGJlYmFkNDFmZDIwODE3NzVmOTEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzAxNTEyZTFkNWQ3NGNmZjlkYjM0YThlZTVmNmNkNWIuYmluZFBvcHVwKHBvcHVwX2QyMzQ4ODkyN2YwODQzNDNiNGNlYzdiOTA2MmNkYzk3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mMzA1OTViZjc1MDM0OThiOTFmMGY0MWZhYzg2Nzc0NiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzU0Ljk3ODI1MiwtMS42MTc3OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9iZTBkMjU1YjljMWU0ODVlODdiNTRmMjcwYTViNjgwMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zYzAwMmJlNDU3OGU0MjVhOGZhYzJmNzM1OGQ1ODJhZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wZDgwMjJkOTY5ZWY0ZjljYTg2Y2MyZmMyZWE4NTMxYSA9ICQoJzxkaXYgaWQ9Imh0bWxfMGQ4MDIyZDk2OWVmNGY5Y2E4NmNjMmZjMmVhODUzMWEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRlbWVudGlhIENhcmUgKE5ld2Nhc3RsZSB1cG9uIFR5bmUpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zYzAwMmJlNDU3OGU0MjVhOGZhYzJmNzM1OGQ1ODJhZi5zZXRDb250ZW50KGh0bWxfMGQ4MDIyZDk2OWVmNGY5Y2E4NmNjMmZjMmVhODUzMWEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjMwNTk1YmY3NTAzNDk4YjkxZjBmNDFmYWM4Njc3NDYuYmluZFBvcHVwKHBvcHVwXzNjMDAyYmU0NTc4ZTQyNWE4ZmFjMmY3MzU4ZDU4MmFmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lY2NiZTBjMmIyYjU0M2ZhOGJhZjk4ZTkwNGUxZWFhZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjUwNzM1MDksLTAuMTI3NzU4M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9iZTBkMjU1YjljMWU0ODVlODdiNTRmMjcwYTViNjgwMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jMzUwNzFkMDRmYTE0NDZmYjRjMmIzMWM5NzU5ODU5MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kMmY1ZDk5ZGZjNGI0OWMxYjQ0NjA5YzE5ZTE5NmYxYSA9ICQoJzxkaXYgaWQ9Imh0bWxfZDJmNWQ5OWRmYzRiNDljMWI0NDYwOWMxOWUxOTZmMWEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVjaG8gVmVudHVyZXMgQy5JLkMuIChFYXN0IExvbmRvbik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2MzNTA3MWQwNGZhMTQ0NmZiNGMyYjMxYzk3NTk4NTkwLnNldENvbnRlbnQoaHRtbF9kMmY1ZDk5ZGZjNGI0OWMxYjQ0NjA5YzE5ZTE5NmYxYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lY2NiZTBjMmIyYjU0M2ZhOGJhZjk4ZTkwNGUxZWFhZC5iaW5kUG9wdXAocG9wdXBfYzM1MDcxZDA0ZmExNDQ2ZmI0YzJiMzFjOTc1OTg1OTApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzkwNDlhMTdmNTE5ODQ0ODRhNjAzOTg3MTZiOWU0ODdiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNTA3MzUwOSwtMC4xMjc3NTgzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2JlMGQyNTViOWMxZTQ4NWU4N2I1NGYyNzBhNWI2ODAwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzYzMjgyNmViZTA1MTRmYmM5NDlhYWJkNGJmMWQ2NDFhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzcwYzcyYjE3MmY3YzRjOGE5MWRkOGZiMTE0ZmU1YzJmID0gJCgnPGRpdiBpZD0iaHRtbF83MGM3MmIxNzJmN2M0YzhhOTFkZDhmYjExNGZlNWMyZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3RlcCB1cCB0byBTZXJ2ZSAoTG9uZG9uKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjMyODI2ZWJlMDUxNGZiYzk0OWFhYmQ0YmYxZDY0MWEuc2V0Q29udGVudChodG1sXzcwYzcyYjE3MmY3YzRjOGE5MWRkOGZiMTE0ZmU1YzJmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzkwNDlhMTdmNTE5ODQ0ODRhNjAzOTg3MTZiOWU0ODdiLmJpbmRQb3B1cChwb3B1cF82MzI4MjZlYmUwNTE0ZmJjOTQ5YWFiZDRiZjFkNjQxYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTU5OWFhZDJmZGViNDYzNDk3YTY0YTNmMmFiYThlMjAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41MDczNTA5LC0wLjEyNzc1ODNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYmUwZDI1NWI5YzFlNDg1ZTg3YjU0ZjI3MGE1YjY4MDApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmRkMDc2ZTFkMTdlNGZkOTkzYzAwYjc2MTM4NzI5NmEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGFmZWQ4YjZiY2MwNDcyN2E4NWU0NzA5MWZkZWY3ZjMgPSAkKCc8ZGl2IGlkPSJodG1sXzBhZmVkOGI2YmNjMDQ3MjdhODVlNDcwOTFmZGVmN2YzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NdWx0aXBsZSBTY2xlcm9zaXMgKE1TKSBTb2NpZXR5IChMb25kb24pPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mZGQwNzZlMWQxN2U0ZmQ5OTNjMDBiNzYxMzg3Mjk2YS5zZXRDb250ZW50KGh0bWxfMGFmZWQ4YjZiY2MwNDcyN2E4NWU0NzA5MWZkZWY3ZjMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTU5OWFhZDJmZGViNDYzNDk3YTY0YTNmMmFiYThlMjAuYmluZFBvcHVwKHBvcHVwX2ZkZDA3NmUxZDE3ZTRmZDk5M2MwMGI3NjEzODcyOTZhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBmZWF0dXJlX2dyb3VwXzc4YWUxYzVhZmY5ZjQ0MDA5NjdlZmZmMzJiNWVkOGY5ID0gTC5mZWF0dXJlR3JvdXAoCiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82YzI3ZjdkOWMzMmI0NDVlYTQyMzM5ZmQ1ZDAxODBlZik7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2RhZWU3ZGNhMzM5MDRmMmM5ZmVjZGUzMzVmOWY4NGY1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTAuODIyNTMwMDAwMDAwMDEsLTAuMTM3MTYzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF83OGFlMWM1YWZmOWY0NDAwOTY3ZWZmZjMyYjVlZDhmOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mODA0NjhiZmEwODE0NWJmYjdlM2ZjY2E5Y2UzNGY5NSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jNWM2NTBiZDljZjk0N2IzYjE4ZThkYTAxZGMyYmU2MyA9ICQoJzxkaXYgaWQ9Imh0bWxfYzVjNjUwYmQ5Y2Y5NDdiM2IxOGU4ZGEwMWRjMmJlNjMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJyaWdodG9uIE9hc2lzIFByb2plY3QgKEJyaWdodG9uKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjgwNDY4YmZhMDgxNDViZmI3ZTNmY2NhOWNlMzRmOTUuc2V0Q29udGVudChodG1sX2M1YzY1MGJkOWNmOTQ3YjNiMThlOGRhMDFkYzJiZTYzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2RhZWU3ZGNhMzM5MDRmMmM5ZmVjZGUzMzVmOWY4NGY1LmJpbmRQb3B1cChwb3B1cF9mODA0NjhiZmEwODE0NWJmYjdlM2ZjY2E5Y2UzNGY5NSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDhmMWY0YmI1NTk0NGQzM2IzZjNjZjRkMzgzZWU0NDggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS40NTQ1MTMsLTIuNTg3OTFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzc4YWUxYzVhZmY5ZjQ0MDA5NjdlZmZmMzJiNWVkOGY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzIwNDhlZmViOTk4NzRhNTI4NzNlZWQ0MDdmOTdmMzRmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc3ZmI5NzQ1NmZmZjQwZjZhMGEzNTcyYzE1MTg4ZTg5ID0gJCgnPGRpdiBpZD0iaHRtbF83N2ZiOTc0NTZmZmY0MGY2YTBhMzU3MmMxNTE4OGU4OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SW5hdXJhIChCcmlzdG9sICk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzIwNDhlZmViOTk4NzRhNTI4NzNlZWQ0MDdmOTdmMzRmLnNldENvbnRlbnQoaHRtbF83N2ZiOTc0NTZmZmY0MGY2YTBhMzU3MmMxNTE4OGU4OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kOGYxZjRiYjU1OTQ0ZDMzYjNmM2NmNGQzODNlZTQ0OC5iaW5kUG9wdXAocG9wdXBfMjA0OGVmZWI5OTg3NGE1Mjg3M2VlZDQwN2Y5N2YzNGYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzlmMDZkZGZmNjFlMTQ0MTJhNjE1NWU5MmIyOGY1YmU2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTAuODI3OTMxOSwtMC4xNjg3NDldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzc4YWUxYzVhZmY5ZjQ0MDA5NjdlZmZmMzJiNWVkOGY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE5ZDI1YWM5NDMwMDRiOGFiYWQ0ZmVmMmY4ZjhhNGU1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzE5MjMzOGQ3NDZlODQ4ZDJhYzg4ZDU2N2ZiOTI1Mzg1ID0gJCgnPGRpdiBpZD0iaHRtbF8xOTIzMzhkNzQ2ZTg0OGQyYWM4OGQ1NjdmYjkyNTM4NSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WU1DQSBSaWdodCBIZXJlIChCcmlnaHRvbiBhbmQgSG92ZSk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE5ZDI1YWM5NDMwMDRiOGFiYWQ0ZmVmMmY4ZjhhNGU1LnNldENvbnRlbnQoaHRtbF8xOTIzMzhkNzQ2ZTg0OGQyYWM4OGQ1NjdmYjkyNTM4NSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85ZjA2ZGRmZjYxZTE0NDEyYTYxNTVlOTJiMjhmNWJlNi5iaW5kUG9wdXAocG9wdXBfMTlkMjVhYzk0MzAwNGI4YWJhZDRmZWYyZjhmOGE0ZTUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ExOGYzNDdlYTZiYzRhNGM5NjJiYjE4YTFhMzQ1NjdkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTUuMDQ0MzIsLTcuMDIwMzU5OTk5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF83OGFlMWM1YWZmOWY0NDAwOTY3ZWZmZjMyYjVlZDhmOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83ZTlhNWQyZjgyNzI0N2I0YTAxMmIxNzAzZWFiNzBlZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85Y2RiNmY2MjUzZWQ0MDdkODRmNTQ3NGZlYzMxMWFhNSA9ICQoJzxkaXYgaWQ9Imh0bWxfOWNkYjZmNjI1M2VkNDA3ZDg0ZjU0NzRmZWMzMTFhYTUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNlcmVzIEV1cm9wZSAoTkkpIEx0ZCAoQmFsbHlrZWxseSBDbyBMb25kb25kZXJyeSBOb3J0aGVybiBJcmVsYW5kKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfN2U5YTVkMmY4MjcyNDdiNGEwMTJiMTcwM2VhYjcwZWUuc2V0Q29udGVudChodG1sXzljZGI2ZjYyNTNlZDQwN2Q4NGY1NDc0ZmVjMzExYWE1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2ExOGYzNDdlYTZiYzRhNGM5NjJiYjE4YTFhMzQ1NjdkLmJpbmRQb3B1cChwb3B1cF83ZTlhNWQyZjgyNzI0N2I0YTAxMmIxNzAzZWFiNzBlZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjgyMjlkNGI1YjczNDg5ZWI5NTBkYzI2NzhmZjE0ZWYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41MDczNTA5LC0wLjEyNzc1ODNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzc4YWUxYzVhZmY5ZjQ0MDA5NjdlZmZmMzJiNWVkOGY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzdiYzI3ZDVlNWQ2YzQ2ZThiYmJiYjE2ODc3MjUyNmU0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM4NDc1OGMwYTMzZDQ3ZmY4NjdlYjRiZjFhYTY4NGVkID0gJCgnPGRpdiBpZD0iaHRtbF8zODQ3NThjMGEzM2Q0N2ZmODY3ZWI0YmYxYWE2ODRlZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V29tZW4gT24gUHVycG9zZSAgIChMb25kb24pPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83YmMyN2Q1ZTVkNmM0NmU4YmJiYmIxNjg3NzI1MjZlNC5zZXRDb250ZW50KGh0bWxfMzg0NzU4YzBhMzNkNDdmZjg2N2ViNGJmMWFhNjg0ZWQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjgyMjlkNGI1YjczNDg5ZWI5NTBkYzI2NzhmZjE0ZWYuYmluZFBvcHVwKHBvcHVwXzdiYzI3ZDVlNWQ2YzQ2ZThiYmJiYjE2ODc3MjUyNmU0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xMjc3YWEzYWIwOTE0ZjE0OWI1YzQzNzQ0MmJkN2E1MCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzU0LjYxMjUzNywtMS4yOTA5NjFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzc4YWUxYzVhZmY5ZjQ0MDA5NjdlZmZmMzJiNWVkOGY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M3MGI5MTNkMTU2NTQ4MmNiYTI2ZTYxYjA1OGRmMzMzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM0MzQ1ZjAxNDJhNDQyNzM4NDQwZDlhZjZiN2E3NDMzID0gJCgnPGRpdiBpZD0iaHRtbF8zNDM0NWYwMTQyYTQ0MjczODQ0MGQ5YWY2YjdhNzQzMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QUJDIENvdW5zZWxsaW5nICZhbXA7IFBsYXkgVGhlcmFweSAmYW1wOyBGYW1pbHkgU29sdXRpb25zICZhbXA7IFRpbWUgNCBZb3UgQ291bnNlbGxpbmcgU2VydmljZXMgKEJpbGxpbmdoYW0sIFN0b2NrdG9uIG9uIFRlZXMpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jNzBiOTEzZDE1NjU0ODJjYmEyNmU2MWIwNThkZjMzMy5zZXRDb250ZW50KGh0bWxfMzQzNDVmMDE0MmE0NDI3Mzg0NDBkOWFmNmI3YTc0MzMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTI3N2FhM2FiMDkxNGYxNDliNWM0Mzc0NDJiZDdhNTAuYmluZFBvcHVwKHBvcHVwX2M3MGI5MTNkMTU2NTQ4MmNiYTI2ZTYxYjA1OGRmMzMzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yOThlYzQ0NmQwNmE0Y2QxOGJhMDlmMzg5NjRlMTA0OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjUwNzM1MDksLTAuMTI3NzU4M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNzhhZTFjNWFmZjlmNDQwMDk2N2VmZmYzMmI1ZWQ4ZjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjU3ZDU0ODNkOTgxNGRkOThiYmViZTY4M2ZmZjUyOTIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTcyNzBjYzAzMDQ2NDY2ZWFlNzlhYzA2MmM3NjY2NWEgPSAkKCc8ZGl2IGlkPSJodG1sXzk3MjcwY2MwMzA0NjQ2NmVhZTc5YWMwNjJjNzY2NjVhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5UaGUgSGVhbHRoIEVxdWFsaXR5IGFuZCBSaWdodHMgT3JnYW5pc2F0aW9uIChMb25kb24sIFVLKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjU3ZDU0ODNkOTgxNGRkOThiYmViZTY4M2ZmZjUyOTIuc2V0Q29udGVudChodG1sXzk3MjcwY2MwMzA0NjQ2NmVhZTc5YWMwNjJjNzY2NjVhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzI5OGVjNDQ2ZDA2YTRjZDE4YmEwOWYzODk2NGUxMDQ5LmJpbmRQb3B1cChwb3B1cF9iNTdkNTQ4M2Q5ODE0ZGQ5OGJiZWJlNjgzZmZmNTI5Mik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjgwZWM3N2FiMzQyNDU4MmFmODY1YmU2ODJlNjQzNTMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1My40ODA3NTkzLC0yLjI0MjYzMDVdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzc4YWUxYzVhZmY5ZjQ0MDA5NjdlZmZmMzJiNWVkOGY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ZlY2Q5NjY5Yzk1NjQ1NzBiOTkxYmI2ZWNkOWFjYTI4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E2ZDU3YjIzZWU1ODRiMGJhNWM5YWYxZTQ3YzY5NjI0ID0gJCgnPGRpdiBpZD0iaHRtbF9hNmQ1N2IyM2VlNTg0YjBiYTVjOWFmMWU0N2M2OTYyNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U29uZGVyIFJhZGlvIChNYW5jaGVzdGVyKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZmVjZDk2NjljOTU2NDU3MGI5OTFiYjZlY2Q5YWNhMjguc2V0Q29udGVudChodG1sX2E2ZDU3YjIzZWU1ODRiMGJhNWM5YWYxZTQ3YzY5NjI0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2I4MGVjNzdhYjM0MjQ1ODJhZjg2NWJlNjgyZTY0MzUzLmJpbmRQb3B1cChwb3B1cF9mZWNkOTY2OWM5NTY0NTcwYjk5MWJiNmVjZDlhY2EyOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzZkYzBjNjgwMmJlNDYyYzk3NGM2N2VjNjM0NmM1Y2IgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41MDczNTA5LC0wLjEyNzc1ODNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzc4YWUxYzVhZmY5ZjQ0MDA5NjdlZmZmMzJiNWVkOGY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RiZTk1YjgyNTVkOTRiN2NhMDMxZTM3MTc3OGU1MTVhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2RhNTJkZTYwY2RlMzQ4NjJiM2JjYTFmYjY2NTRhNjdhID0gJCgnPGRpdiBpZD0iaHRtbF9kYTUyZGU2MGNkZTM0ODYyYjNiY2ExZmI2NjU0YTY3YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2FyaXRhcyBBbmNob3IgSG91c2UgKExvbmRvbik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RiZTk1YjgyNTVkOTRiN2NhMDMxZTM3MTc3OGU1MTVhLnNldENvbnRlbnQoaHRtbF9kYTUyZGU2MGNkZTM0ODYyYjNiY2ExZmI2NjU0YTY3YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jNmRjMGM2ODAyYmU0NjJjOTc0YzY3ZWM2MzQ2YzVjYi5iaW5kUG9wdXAocG9wdXBfZGJlOTViODI1NWQ5NGI3Y2EwMzFlMzcxNzc4ZTUxNWEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzk3ODZmMzJhZmU3NTQyZGY4NDQwZWEwOTVmMjZmZWQ5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTMuOTU5OTY1MTAwMDAwMDEsLTEuMDg3Mjk3OV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNzhhZTFjNWFmZjlmNDQwMDk2N2VmZmYzMmI1ZWQ4ZjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmYzZDlhNGQ3MGYzNGFmY2E0M2VhNzc2NjVkYWFjYzMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzY1MDhhNGI5N2I2NDNhZjg3NDMzNzc4NTVmNTJjN2YgPSAkKCc8ZGl2IGlkPSJodG1sXzc2NTA4YTRiOTdiNjQzYWY4NzQzMzc3ODU1ZjUyYzdmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Jbm5vdmF0aW9ucyBpbiBEZW1lbnRpYSBDSUMgKFlvcmspPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82ZjNkOWE0ZDcwZjM0YWZjYTQzZWE3NzY2NWRhYWNjMy5zZXRDb250ZW50KGh0bWxfNzY1MDhhNGI5N2I2NDNhZjg3NDMzNzc4NTVmNTJjN2YpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTc4NmYzMmFmZTc1NDJkZjg0NDBlYTA5NWYyNmZlZDkuYmluZFBvcHVwKHBvcHVwXzZmM2Q5YTRkNzBmMzRhZmNhNDNlYTc3NjY1ZGFhY2MzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wMjljNGVkOGE5YTU0Y2I3OGMzN2QzMTE2ZGUzMzc5OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUyLjU2OTQ5ODQ5OTk5OTk5LC0wLjI0MDUyOTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzc4YWUxYzVhZmY5ZjQ0MDA5NjdlZmZmMzJiNWVkOGY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NkNGJhYTA2ZGNmYzQzMjZhNzg0MjI2N2QzYWQ4ZWM5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY3ZTYyZWM0OWM4NTQ4OTk4ZjVhN2JkMzMwNTg0NGQyID0gJCgnPGRpdiBpZD0iaHRtbF82N2U2MmVjNDljODU0ODk5OGY1YTdiZDMzMDU4NDRkMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2l0aXplbnMgQWR2aWNlIFBldGVyYm9yb3VnaCAoUGV0ZXJib3JvdWdoKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2Q0YmFhMDZkY2ZjNDMyNmE3ODQyMjY3ZDNhZDhlYzkuc2V0Q29udGVudChodG1sXzY3ZTYyZWM0OWM4NTQ4OTk4ZjVhN2JkMzMwNTg0NGQyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzAyOWM0ZWQ4YTlhNTRjYjc4YzM3ZDMxMTZkZTMzNzk5LmJpbmRQb3B1cChwb3B1cF9jZDRiYWEwNmRjZmM0MzI2YTc4NDIyNjdkM2FkOGVjOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMmQxNjFiZDhlMDAyNGM3MWE0YThkYmMyNTUwNWFlOGIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1NS44NDcyNTgsLTQuNDQwMTEzOTk5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF83OGFlMWM1YWZmOWY0NDAwOTY3ZWZmZjMyYjVlZDhmOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iMTVmNTNhYjNhNmM0NjgxYTJkMzljZDk3YThiZTI3ZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84NzAxZmEzYTg3YTE0ZDUyOGMyZDY1ZjU0NDgxNzM0YyA9ICQoJzxkaXYgaWQ9Imh0bWxfODcwMWZhM2E4N2ExNGQ1MjhjMmQ2NWY1NDQ4MTczNGMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJpcG9sYXIgU2NvdGxhbmQgKFBhaXNsZXkpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iMTVmNTNhYjNhNmM0NjgxYTJkMzljZDk3YThiZTI3ZS5zZXRDb250ZW50KGh0bWxfODcwMWZhM2E4N2ExNGQ1MjhjMmQ2NWY1NDQ4MTczNGMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMmQxNjFiZDhlMDAyNGM3MWE0YThkYmMyNTUwNWFlOGIuYmluZFBvcHVwKHBvcHVwX2IxNWY1M2FiM2E2YzQ2ODFhMmQzOWNkOTdhOGJlMjdlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81ZTA1MTlmZTBlMzY0N2Q1Yjc3ZGFjOTkwYzZjOTI4ZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjUwNzM1MDksLTAuMTI3NzU4M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNzhhZTFjNWFmZjlmNDQwMDk2N2VmZmYzMmI1ZWQ4ZjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjYyYjUwNzg5NTZjNGU1NzkyYzk3OGQ3MzU2NjdlNDYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfN2ZlYjhhMjgwZTRjNDJkMTk5NTg5ZmRiMTc1NDJjNzEgPSAkKCc8ZGl2IGlkPSJodG1sXzdmZWI4YTI4MGU0YzQyZDE5OTU4OWZkYjE3NTQyYzcxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CYWJ5IFBvaW50IChMb25kb24pPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yNjJiNTA3ODk1NmM0ZTU3OTJjOTc4ZDczNTY2N2U0Ni5zZXRDb250ZW50KGh0bWxfN2ZlYjhhMjgwZTRjNDJkMTk5NTg5ZmRiMTc1NDJjNzEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNWUwNTE5ZmUwZTM2NDdkNWI3N2RhYzk5MGM2YzkyOGYuYmluZFBvcHVwKHBvcHVwXzI2MmI1MDc4OTU2YzRlNTc5MmM5NzhkNzM1NjY3ZTQ2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kNWMyNGI2OGRhM2M0YjA4OWFmMzQ4YWIwMGJjMGM0OCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjU4NDE1MSwtMi45OTc2NjRdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzc4YWUxYzVhZmY5ZjQ0MDA5NjdlZmZmMzJiNWVkOGY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Y3NGU2YTQzNWQyMDQ0YTA4ZjBhYzMyMzQ0NTVkNGYyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzYwYTA0NjZkODEwOTRkYWFhM2FkMDlhODk0YmE3OWJiID0gJCgnPGRpdiBpZD0iaHRtbF82MGEwNDY2ZDgxMDk0ZGFhYTNhZDA5YTg5NGJhNzliYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TmV3IFBhdGh3YXlzIChOZXdwb3J0LCBHd2VudCk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Y3NGU2YTQzNWQyMDQ0YTA4ZjBhYzMyMzQ0NTVkNGYyLnNldENvbnRlbnQoaHRtbF82MGEwNDY2ZDgxMDk0ZGFhYTNhZDA5YTg5NGJhNzliYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kNWMyNGI2OGRhM2M0YjA4OWFmMzQ4YWIwMGJjMGM0OC5iaW5kUG9wdXAocG9wdXBfZjc0ZTZhNDM1ZDIwNDRhMDhmMGFjMzIzNDQ1NWQ0ZjIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2U4NDhmYzk4NTI1NzQwMWU4YzRjMGNmM2E1MThkMjNjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTQuNTIzNjEsLTEuNTU5NDU4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF83OGFlMWM1YWZmOWY0NDAwOTY3ZWZmZjMyYjVlZDhmOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wMjk0N2RjNmMzZDA0ZjE2OWZiZjc2YTQwZGZiOTM2NiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81ZTA1YmRkOTcyZDE0ZGNhYTYxOWRmMzJkMzhkMzZlNSA9ICQoJzxkaXYgaWQ9Imh0bWxfNWUwNWJkZDk3MmQxNGRjYWE2MTlkZjMyZDM4ZDM2ZTUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRhcmxpbmd0b24gTWluZCAoRGFybGluZ3Rvbik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzAyOTQ3ZGM2YzNkMDRmMTY5ZmJmNzZhNDBkZmI5MzY2LnNldENvbnRlbnQoaHRtbF81ZTA1YmRkOTcyZDE0ZGNhYTYxOWRmMzJkMzhkMzZlNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lODQ4ZmM5ODUyNTc0MDFlOGM0YzBjZjNhNTE4ZDIzYy5iaW5kUG9wdXAocG9wdXBfMDI5NDdkYzZjM2QwNGYxNjlmYmY3NmE0MGRmYjkzNjYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzY2ZDg3YTUxZWY5YzQ0NTZhMTVkMDlhMTE1ZWYzY2QxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuMDU5NzcxLC0xLjMxMDE0Ml0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNzhhZTFjNWFmZjlmNDQwMDk2N2VmZmYzMmI1ZWQ4ZjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjY1ZjBiOTg3NDkzNGEzZGFlZjQ4MWMxNmM2NGY2NmMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjI5YWI0YzRkODY0NGVlMjljODI2OGRhZWM3Y2E1MDggPSAkKCc8ZGl2IGlkPSJodG1sX2IyOWFiNGM0ZDg2NDRlZTI5YzgyNjhkYWVjN2NhNTA4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Db21tdW5pdHkgRmlyc3QgKFdpbmNoZXN0ZXIgKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjY1ZjBiOTg3NDkzNGEzZGFlZjQ4MWMxNmM2NGY2NmMuc2V0Q29udGVudChodG1sX2IyOWFiNGM0ZDg2NDRlZTI5YzgyNjhkYWVjN2NhNTA4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzY2ZDg3YTUxZWY5YzQ0NTZhMTVkMDlhMTE1ZWYzY2QxLmJpbmRQb3B1cChwb3B1cF8yNjVmMGI5ODc0OTM0YTNkYWVmNDgxYzE2YzY0ZjY2Yyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjlkNDE3ZTdjNDUzNDdlMjlmYWUzMThiNjcxNjdiMDggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1My41MjI4MiwtMS4xMjg0NjJdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzc4YWUxYzVhZmY5ZjQ0MDA5NjdlZmZmMzJiNWVkOGY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzVhNzVjZGFjMzY0ZDRiMTNhNDg3Y2Q0NWIwODE0NGFiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzk5YTNiM2FhYzA5NzQ3MTU4YzM1MjQ5ZTAxN2IzMjA1ID0gJCgnPGRpdiBpZD0iaHRtbF85OWEzYjNhYWMwOTc0NzE1OGMzNTI0OWUwMTdiMzIwNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2hvaWNlczREb25jYXN0ZXIgKERvbmNhc3RlciwgIFNvdXRoIFlvcmtzaGlyZSk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzVhNzVjZGFjMzY0ZDRiMTNhNDg3Y2Q0NWIwODE0NGFiLnNldENvbnRlbnQoaHRtbF85OWEzYjNhYWMwOTc0NzE1OGMzNTI0OWUwMTdiMzIwNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iOWQ0MTdlN2M0NTM0N2UyOWZhZTMxOGI2NzE2N2IwOC5iaW5kUG9wdXAocG9wdXBfNWE3NWNkYWMzNjRkNGIxM2E0ODdjZDQ1YjA4MTQ0YWIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzUxZmExODk0ZjI2NDQwNjY4ZWE4MGFlMTJjNzU3ODQ1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTMuNDA4MzcxNCwtMi45OTE1NzI2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF83OGFlMWM1YWZmOWY0NDAwOTY3ZWZmZjMyYjVlZDhmOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80NDljNmNmNGRkODA0Mjg5OTI2MjVkZDU0YWM3N2JlYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hM2I0MjkzNjE1YWM0ZGE5OThmOTYxZTUyYmI4ZWQ3ZiA9ICQoJzxkaXYgaWQ9Imh0bWxfYTNiNDI5MzYxNWFjNGRhOTk4Zjk2MWU1MmJiOGVkN2YiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlRoZSBXb21lbiYjMzk7cyBPcmdhbmlzYXRpb24gKExpdmVycG9vbCk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQ0OWM2Y2Y0ZGQ4MDQyODk5MjYyNWRkNTRhYzc3YmVhLnNldENvbnRlbnQoaHRtbF9hM2I0MjkzNjE1YWM0ZGE5OThmOTYxZTUyYmI4ZWQ3Zik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81MWZhMTg5NGYyNjQ0MDY2OGVhODBhZTEyYzc1Nzg0NS5iaW5kUG9wdXAocG9wdXBfNDQ5YzZjZjRkZDgwNDI4OTkyNjI1ZGQ1NGFjNzdiZWEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2E2Y2Y1OWRlYjU0YTQ5NDc5MWJlOGNlMzk4NDg2OTZiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTQuODU5MTE2MSwtMS41NzQwODg4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF83OGFlMWM1YWZmOWY0NDAwOTY3ZWZmZjMyYjVlZDhmOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85YjMzNWFkMTBjMmM0N2M1ODFjMTliMzQ2MzViMWZhOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yZTMzYjdlZWQ2NWY0ZmM2YWNhYjA2Y2MyOTk5ZTE1MiA9ICQoJzxkaXYgaWQ9Imh0bWxfMmUzM2I3ZWVkNjVmNGZjNmFjYWIwNmNjMjk5OWUxNTIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5vcnRoIEVhc3QgQXV0aXNtIFNvY2lldHkgKE5FQVMpIChDaGVzdGVyIGxlIFN0cmVldCwgQ291bnR5IER1cmhhbSk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzliMzM1YWQxMGMyYzQ3YzU4MWMxOWIzNDYzNWIxZmE5LnNldENvbnRlbnQoaHRtbF8yZTMzYjdlZWQ2NWY0ZmM2YWNhYjA2Y2MyOTk5ZTE1Mik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hNmNmNTlkZWI1NGE0OTQ3OTFiZThjZTM5ODQ4Njk2Yi5iaW5kUG9wdXAocG9wdXBfOWIzMzVhZDEwYzJjNDdjNTgxYzE5YjM0NjM1YjFmYTkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzVjN2I1YjMzYTEwMTQwMjNiYjY2MDYzZjYxM2Q4Y2JlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNTA3MzUwOSwtMC4xMjc3NTgzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF83OGFlMWM1YWZmOWY0NDAwOTY3ZWZmZjMyYjVlZDhmOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kNTI5ZjgwOWQyZjI0YjEzYmU1MDg2MjEzNDJhYTBmOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82N2YyYTNjMzQ5NjQ0MDExYjAwZjRkODkyODJkNzYwNSA9ICQoJzxkaXYgaWQ9Imh0bWxfNjdmMmEzYzM0OTY0NDAxMWIwMGY0ZDg5MjgyZDc2MDUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNhZsOpZGlyZWN0IFByb2R1Y2VycyYjMzk7IEZvdW5kYXRpb24gKCBMb25kb24sVUspPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kNTI5ZjgwOWQyZjI0YjEzYmU1MDg2MjEzNDJhYTBmOS5zZXRDb250ZW50KGh0bWxfNjdmMmEzYzM0OTY0NDAxMWIwMGY0ZDg5MjgyZDc2MDUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNWM3YjViMzNhMTAxNDAyM2JiNjYwNjNmNjEzZDhjYmUuYmluZFBvcHVwKHBvcHVwX2Q1MjlmODA5ZDJmMjRiMTNiZTUwODYyMTM0MmFhMGY5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wZGY4ZWRlNGNkNTA0OWQ1YmYzOGU1YTA1MGVkNDZkMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzU0Ljk3ODI1MiwtMS42MTc3OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNzhhZTFjNWFmZjlmNDQwMDk2N2VmZmYzMmI1ZWQ4ZjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmEwOTVkMGE1NjM0NDhkOThhNDc3NWU5OTE3NGM4NTYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDIyOTQzZGFiOTE2NGYxZWE0NmY2ODNiNzBiNTM2M2IgPSAkKCc8ZGl2IGlkPSJodG1sXzQyMjk0M2RhYjkxNjRmMWVhNDZmNjgzYjcwYjUzNjNiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Tb2NpYWwgRmluYW5jZSBMdGQgKE5ld2Nhc3RsZSk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzJhMDk1ZDBhNTYzNDQ4ZDk4YTQ3NzVlOTkxNzRjODU2LnNldENvbnRlbnQoaHRtbF80MjI5NDNkYWI5MTY0ZjFlYTQ2ZjY4M2I3MGI1MzYzYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wZGY4ZWRlNGNkNTA0OWQ1YmYzOGU1YTA1MGVkNDZkMC5iaW5kUG9wdXAocG9wdXBfMmEwOTVkMGE1NjM0NDhkOThhNDc3NWU5OTE3NGM4NTYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzAyNWYwMDVkN2E2YjQ5N2Q4YTg2N2IxMzRkNGM0MGM0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNTA3MzUwOSwtMC4xMjc3NTgzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF83OGFlMWM1YWZmOWY0NDAwOTY3ZWZmZjMyYjVlZDhmOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80MjVhMzYxZWE3Zjc0NWI0YTA5OTQxZTkxMTViYjY4NiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kMzY4NzcwZTcwMDU0YmRlYmUwMmM0ZjI1NjliM2FlMyA9ICQoJzxkaXYgaWQ9Imh0bWxfZDM2ODc3MGU3MDA1NGJkZWJlMDJjNGYyNTY5YjNhZTMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldvcmtpbmcgV2VsbCBUcnVzdCAoTG9uZG9uLCBVbml0ZWQgS2luZ2RvbSk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQyNWEzNjFlYTdmNzQ1YjRhMDk5NDFlOTExNWJiNjg2LnNldENvbnRlbnQoaHRtbF9kMzY4NzcwZTcwMDU0YmRlYmUwMmM0ZjI1NjliM2FlMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wMjVmMDA1ZDdhNmI0OTdkOGE4NjdiMTM0ZDRjNDBjNC5iaW5kUG9wdXAocG9wdXBfNDI1YTM2MWVhN2Y3NDViNGEwOTk0MWU5MTE1YmI2ODYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzI5OWU0MjFmZmU4MjRhMjc4NjUwYTI1NDExYmQwNzhiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTUuOTUzMjUyLC0zLjE4ODI2N10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNzhhZTFjNWFmZjlmNDQwMDk2N2VmZmYzMmI1ZWQ4ZjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODA0YzU3YWM0ODk3NGE0YTgxMGQxNmQ1MmZlMWQ5Y2MgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2YzNWRkYmQzZDExNGUwYjk5NzgyZDRjMTg3MWY1NWIgPSAkKCc8ZGl2IGlkPSJodG1sXzNmMzVkZGJkM2QxMTRlMGI5OTc4MmQ0YzE4NzFmNTViIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SZW1hZGUgaW4gRWRpbmJ1cmdoIChFZGluYnVyZ2gpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84MDRjNTdhYzQ4OTc0YTRhODEwZDE2ZDUyZmUxZDljYy5zZXRDb250ZW50KGh0bWxfM2YzNWRkYmQzZDExNGUwYjk5NzgyZDRjMTg3MWY1NWIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjk5ZTQyMWZmZTgyNGEyNzg2NTBhMjU0MTFiZDA3OGIuYmluZFBvcHVwKHBvcHVwXzgwNGM1N2FjNDg5NzRhNGE4MTBkMTZkNTJmZTFkOWNjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xZTcxZGQyNTIyNzI0N2E0YmI2ZjYzMDhkNTgzOTJhZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjg2NDI0NDksLTIuMjM4MTU2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF83OGFlMWM1YWZmOWY0NDAwOTY3ZWZmZjMyYjVlZDhmOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zMGY3OWYwY2MzMDM0M2EwOTU5ZDgwNzI2NDlhMTBiYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80NzVjZTU0Yjg3MDE0NGFlYTA5ZDQ3YTRlOWU4NTEyNCA9ICQoJzxkaXYgaWQ9Imh0bWxfNDc1Y2U1NGI4NzAxNDRhZWEwOWQ0N2E0ZTllODUxMjQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJlYWRhdGhvbiAoR2xvdWNlc3Rlcik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzMwZjc5ZjBjYzMwMzQzYTA5NTlkODA3MjY0OWExMGJiLnNldENvbnRlbnQoaHRtbF80NzVjZTU0Yjg3MDE0NGFlYTA5ZDQ3YTRlOWU4NTEyNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xZTcxZGQyNTIyNzI0N2E0YmI2ZjYzMDhkNTgzOTJhZS5iaW5kUG9wdXAocG9wdXBfMzBmNzlmMGNjMzAzNDNhMDk1OWQ4MDcyNjQ5YTEwYmIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2RkNWFiNGNhNGNiNDRjNzc5NWVhYTE2MDBhYTJkMzA4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTIuOTU0NzgzMTk5OTk5OTksLTEuMTU4MTA4Nl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNzhhZTFjNWFmZjlmNDQwMDk2N2VmZmYzMmI1ZWQ4ZjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDMwYTkyYjZiNDNhNGZiNmFiMGQ0MjRhZTdjODYzYzYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzEzYWY0OTkzMTc5NGMxNmIwZWFlMTBiM2IxODZiMmEgPSAkKCc8ZGl2IGlkPSJodG1sXzMxM2FmNDk5MzE3OTRjMTZiMGVhZTEwYjNiMTg2YjJhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ob3R0aW5naGFtIENvbW11bml0eSBIb3VzaW5nIEFzc29jaWF0aW9uIChOb3R0aW5naGFtKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDMwYTkyYjZiNDNhNGZiNmFiMGQ0MjRhZTdjODYzYzYuc2V0Q29udGVudChodG1sXzMxM2FmNDk5MzE3OTRjMTZiMGVhZTEwYjNiMTg2YjJhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2RkNWFiNGNhNGNiNDRjNzc5NWVhYTE2MDBhYTJkMzA4LmJpbmRQb3B1cChwb3B1cF8wMzBhOTJiNmI0M2E0ZmI2YWIwZDQyNGFlN2M4NjNjNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTQ5ZDE1ODY5MGFkNGQxNTk5Zjg4YzNmZDBmNTk1ZDkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1NS45NTMyNTIsLTMuMTg4MjY3XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF83OGFlMWM1YWZmOWY0NDAwOTY3ZWZmZjMyYjVlZDhmOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hOTMzOWY3ZWYxMmI0YzgzYWM4YWI1MGJlMGVmNmQxZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84ODFlNmY3ZGRhY2M0NTM2ODk1NWQ1ZWNhNDEzOTFhYiA9ICQoJzxkaXYgaWQ9Imh0bWxfODgxZTZmN2RkYWNjNDUzNjg5NTVkNWVjYTQxMzkxYWIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVkaW5idXJnaCBMZWlzdXJlIChFZGluYnVyZ2gpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hOTMzOWY3ZWYxMmI0YzgzYWM4YWI1MGJlMGVmNmQxZi5zZXRDb250ZW50KGh0bWxfODgxZTZmN2RkYWNjNDUzNjg5NTVkNWVjYTQxMzkxYWIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTQ5ZDE1ODY5MGFkNGQxNTk5Zjg4YzNmZDBmNTk1ZDkuYmluZFBvcHVwKHBvcHVwX2E5MzM5ZjdlZjEyYjRjODNhYzhhYjUwYmUwZWY2ZDFmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mMTVlMzg5ZWE2Mjg0MzYyOTQ3NDJlNzgwOGQ5MzFlOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjU0NTkyNjksMC43MDc3MTIzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF83OGFlMWM1YWZmOWY0NDAwOTY3ZWZmZjMyYjVlZDhmOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hNmZjYTgyZGM0MjI0NTVjYmZiM2Q2Nzk1NDQyMDdmOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lMTYwYWEyNTNhMDM0MzIwYjIyNDdkYjc5OGQ4YTgwYyA9ICQoJzxkaXYgaWQ9Imh0bWxfZTE2MGFhMjUzYTAzNDMyMGIyMjQ3ZGI3OThkOGE4MGMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJsYWRlIEVkdWNhdGlvbiAoU291dGhlbmQtb24tU2VhKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTZmY2E4MmRjNDIyNDU1Y2JmYjNkNjc5NTQ0MjA3Zjguc2V0Q29udGVudChodG1sX2UxNjBhYTI1M2EwMzQzMjBiMjI0N2RiNzk4ZDhhODBjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2YxNWUzODllYTYyODQzNjI5NDc0MmU3ODA4ZDkzMWU5LmJpbmRQb3B1cChwb3B1cF9hNmZjYTgyZGM0MjI0NTVjYmZiM2Q2Nzk1NDQyMDdmOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTM4MGViYzE4ZmYzNGY0MTkzOGYwZTA5OWZkMzRjOTIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41MjAyNjA2OTk5OTk5OSwtMC4wMjkzMzk2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF83OGFlMWM1YWZmOWY0NDAwOTY3ZWZmZjMyYjVlZDhmOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83Y2NmNDFhMjQ2NzI0ZjM0ODQxNTZiZWU4ZTQzZjI2ZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83MGQwOGU5YTBiNGY0MTFkOTRlNmE0YWUxZGY0NDVmMSA9ICQoJzxkaXYgaWQ9Imh0bWxfNzBkMDhlOWEwYjRmNDExZDk0ZTZhNGFlMWRmNDQ1ZjEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlllYXIgSGVyZSAoVG93ZXIgSGFtbGV0cywgTG9uZG9uKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfN2NjZjQxYTI0NjcyNGYzNDg0MTU2YmVlOGU0M2YyNmUuc2V0Q29udGVudChodG1sXzcwZDA4ZTlhMGI0ZjQxMWQ5NGU2YTRhZTFkZjQ0NWYxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2EzODBlYmMxOGZmMzRmNDE5MzhmMGUwOTlmZDM0YzkyLmJpbmRQb3B1cChwb3B1cF83Y2NmNDFhMjQ2NzI0ZjM0ODQxNTZiZWU4ZTQzZjI2ZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZGJmMDRjOGVlNmM4NDY3ZDk0ZTEzODFiN2I4NTlhNzUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1Mi4yMDUzMzcsMC4xMjE4MTddLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzc4YWUxYzVhZmY5ZjQ0MDA5NjdlZmZmMzJiNWVkOGY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FiN2U3ZjEwOWU4YTRhYTE4ZmQ2MjBlNzc1MjJhNDgyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzIwZWJkODUzODIwNDQ5Y2RiNGViYTI3NTIxOGIxN2RjID0gJCgnPGRpdiBpZD0iaHRtbF8yMGViZDg1MzgyMDQ0OWNkYjRlYmEyNzUyMThiMTdkYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UmVkIEJhbGxvb24gTGVhcm5lciBDZW50cmUgR3JvdXAgKENhbWJyaWRnZSk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2FiN2U3ZjEwOWU4YTRhYTE4ZmQ2MjBlNzc1MjJhNDgyLnNldENvbnRlbnQoaHRtbF8yMGViZDg1MzgyMDQ0OWNkYjRlYmEyNzUyMThiMTdkYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kYmYwNGM4ZWU2Yzg0NjdkOTRlMTM4MWI3Yjg1OWE3NS5iaW5kUG9wdXAocG9wdXBfYWI3ZTdmMTA5ZThhNGFhMThmZDYyMGU3NzUyMmE0ODIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzI1MjUzMTkxMmJjODRhYmI4NjFkNDZmNDM0M2I0NmNhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuMjgwMjMzLDEuMDc4OTA4OV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNzhhZTFjNWFmZjlmNDQwMDk2N2VmZmYzMmI1ZWQ4ZjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDlkOWExNDY0MGFmNDQzNjk2YTNiNDIxMzJlMTk0OGUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTZjYTdkMzIxYWJmNGI0NThiNjkyYjdmOTQ3NzE1N2MgPSAkKCc8ZGl2IGlkPSJodG1sX2U2Y2E3ZDMyMWFiZjRiNDU4YjY5MmI3Zjk0NzcxNTdjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SZWZ1Z2VlIExpdmUgKENhbnRlcmJ1cnkpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80OWQ5YTE0NjQwYWY0NDM2OTZhM2I0MjEzMmUxOTQ4ZS5zZXRDb250ZW50KGh0bWxfZTZjYTdkMzIxYWJmNGI0NThiNjkyYjdmOTQ3NzE1N2MpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjUyNTMxOTEyYmM4NGFiYjg2MWQ0NmY0MzQzYjQ2Y2EuYmluZFBvcHVwKHBvcHVwXzQ5ZDlhMTQ2NDBhZjQ0MzY5NmEzYjQyMTMyZTE5NDhlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lMGMzMGQzZGI1Mjc0MDVhYmNkMjRjMDhiZjI3ZWE1OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjUwNzM1MDksLTAuMTI3NzU4M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNzhhZTFjNWFmZjlmNDQwMDk2N2VmZmYzMmI1ZWQ4ZjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmY4NTU4MTk4YjA3NDAxNDhkNjM1OTQ2MWU0NzNhYjAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjlmOWMxZTY4MjM5NDIyZjg2NTkzZDNiNWMxMzRmYmQgPSAkKCc8ZGl2IGlkPSJodG1sX2I5ZjljMWU2ODIzOTQyMmY4NjU5M2QzYjVjMTM0ZmJkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Db21tb24gVmlzaW9uIChDb1ZpKSAoTG9uZG9uKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMmY4NTU4MTk4YjA3NDAxNDhkNjM1OTQ2MWU0NzNhYjAuc2V0Q29udGVudChodG1sX2I5ZjljMWU2ODIzOTQyMmY4NjU5M2QzYjVjMTM0ZmJkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2UwYzMwZDNkYjUyNzQwNWFiY2QyNGMwOGJmMjdlYTU5LmJpbmRQb3B1cChwb3B1cF8yZjg1NTgxOThiMDc0MDE0OGQ2MzU5NDYxZTQ3M2FiMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmViNzQ3MDBiNjk0NDM1ZjhiNDA1ZjQyNTQxMTI4ZjUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41MDczNTA5LC0wLjEyNzc1ODNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzc4YWUxYzVhZmY5ZjQ0MDA5NjdlZmZmMzJiNWVkOGY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzEwNDRiZTJiMzNlMzQyOGU5ZGU1Y2QwYmM3ZmY0YzM3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg3MGYyNzFmODhhMDQ2OWNiNWQ2NGUwOTVhMGQ2ODg0ID0gJCgnPGRpdiBpZD0iaHRtbF84NzBmMjcxZjg4YTA0NjljYjVkNjRlMDk1YTBkNjg4NCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3QgR2lsZXMgVHJ1c3QgIChMb25kb24pPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xMDQ0YmUyYjMzZTM0MjhlOWRlNWNkMGJjN2ZmNGMzNy5zZXRDb250ZW50KGh0bWxfODcwZjI3MWY4OGEwNDY5Y2I1ZDY0ZTA5NWEwZDY4ODQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNmViNzQ3MDBiNjk0NDM1ZjhiNDA1ZjQyNTQxMTI4ZjUuYmluZFBvcHVwKHBvcHVwXzEwNDRiZTJiMzNlMzQyOGU5ZGU1Y2QwYmM3ZmY0YzM3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kNWYyZWE1MjdkZjU0NGI2OGQzZTY0YzlmNWZmZDBjYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjUwNzM1MDksLTAuMTI3NzU4M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNzhhZTFjNWFmZjlmNDQwMDk2N2VmZmYzMmI1ZWQ4ZjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjI1M2YzOGJjNGQ1NDY4YzhhNWJmMGQ0ZmE0ODZlNDUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWYyYmNjYjlhZjQxNDU0MmExZGU4ZDYwOTkwMjUzMjYgPSAkKCc8ZGl2IGlkPSJodG1sXzVmMmJjY2I5YWY0MTQ1NDJhMWRlOGQ2MDk5MDI1MzI2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Nb21lbnR1bSBXb3JsZCBDSUMgKExvbmRvbik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2IyNTNmMzhiYzRkNTQ2OGM4YTViZjBkNGZhNDg2ZTQ1LnNldENvbnRlbnQoaHRtbF81ZjJiY2NiOWFmNDE0NTQyYTFkZThkNjA5OTAyNTMyNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kNWYyZWE1MjdkZjU0NGI2OGQzZTY0YzlmNWZmZDBjYi5iaW5kUG9wdXAocG9wdXBfYjI1M2YzOGJjNGQ1NDY4YzhhNWJmMGQ0ZmE0ODZlNDUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzAxZjJkMWU1Yzg2NTQxN2JiM2NjYWY4NzhmN2JkMjUxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMjAuNTkzNjg0LDc4Ljk2Mjg4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF83OGFlMWM1YWZmOWY0NDAwOTY3ZWZmZjMyYjVlZDhmOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85Y2JlNWUyMzc4Mjk0ZmI1ODMxMmViODNiOGI2ZjA1OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80NzE5MmU4ZDdlMWU0YjY1YTEyY2QwMWFiN2Q1MjZmOCA9ICQoJzxkaXYgaWQ9Imh0bWxfNDcxOTJlOGQ3ZTFlNGI2NWExMmNkMDFhYjdkNTI2ZjgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxlb25hcmQgQ2hlc2hpcmUgRElzYWJpbGl0eSAoSW5kaWEpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85Y2JlNWUyMzc4Mjk0ZmI1ODMxMmViODNiOGI2ZjA1OC5zZXRDb250ZW50KGh0bWxfNDcxOTJlOGQ3ZTFlNGI2NWExMmNkMDFhYjdkNTI2ZjgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDFmMmQxZTVjODY1NDE3YmIzY2NhZjg3OGY3YmQyNTEuYmluZFBvcHVwKHBvcHVwXzljYmU1ZTIzNzgyOTRmYjU4MzEyZWI4M2I4YjZmMDU4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iZTkwOGMwNzg0MDg0ZmZkYWZkNTA3MTBhYzJhNzYxZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjUwNzM1MDksLTAuMTI3NzU4M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNzhhZTFjNWFmZjlmNDQwMDk2N2VmZmYzMmI1ZWQ4ZjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmFiN2Q1MTUxOGI0NDY4ODgzZjg3YmRkMThjNDNjZDcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfN2Y4ODdiM2U4Y2E1NGM0ZDg1Y2ExNzQ0MDkzY2M0OGEgPSAkKCc8ZGl2IGlkPSJodG1sXzdmODg3YjNlOGNhNTRjNGQ4NWNhMTc0NDA5M2NjNDhhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Tb2NpYWwgU3BpZGVyIENJQyAoTG9uZG9uKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYmFiN2Q1MTUxOGI0NDY4ODgzZjg3YmRkMThjNDNjZDcuc2V0Q29udGVudChodG1sXzdmODg3YjNlOGNhNTRjNGQ4NWNhMTc0NDA5M2NjNDhhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2JlOTA4YzA3ODQwODRmZmRhZmQ1MDcxMGFjMmE3NjFlLmJpbmRQb3B1cChwb3B1cF9iYWI3ZDUxNTE4YjQ0Njg4ODNmODdiZGQxOGM0M2NkNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTM2ZDYxZDc1Zjc4NDdlNWE0ZmNhNzg0YzM3OGI1NGIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1NC45NzgyNTIsLTEuNjE3NzhdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzc4YWUxYzVhZmY5ZjQ0MDA5NjdlZmZmMzJiNWVkOGY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q0MjE1ZGRkM2U1OTQzZWI5MTIxNjU3YWQyN2E5Y2E1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRmY2Q5OTJhNjYzOTRhYTA5NzAxNGFjNzUzYmJhN2VhID0gJCgnPGRpdiBpZD0iaHRtbF80ZmNkOTkyYTY2Mzk0YWEwOTcwMTRhYzc1M2JiYTdlYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Y2hpcGNoYXNlIGhvdXNlIHBpcCBwcm9ncmFtbWUgcGVyY3kgaGVkbGV5IGZvdW5kYXRpb24gKHBlcmN5IGhlZGxleSBmb3VuZGF0aW9uIG5ld2Nhc3RsZSB1cG9uIHR5bmUpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kNDIxNWRkZDNlNTk0M2ViOTEyMTY1N2FkMjdhOWNhNS5zZXRDb250ZW50KGh0bWxfNGZjZDk5MmE2NjM5NGFhMDk3MDE0YWM3NTNiYmE3ZWEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZTM2ZDYxZDc1Zjc4NDdlNWE0ZmNhNzg0YzM3OGI1NGIuYmluZFBvcHVwKHBvcHVwX2Q0MjE1ZGRkM2U1OTQzZWI5MTIxNjU3YWQyN2E5Y2E1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80M2NjMzRiYjc0YWU0ODAwODBmZTBmODQxNmU1ODYxNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjUxMDUzODM5OTk5OTk5LC0wLjU5NTA0MDU5OTk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzc4YWUxYzVhZmY5ZjQ0MDA5NjdlZmZmMzJiNWVkOGY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2JjYjA1MDZkZmVhMjRlMGJiMDVlYWI2ODk3YjhjMjIxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ZjYTY1NTA3ZTI0ZjRjNTk4MjdlNjUwYmY3NGE0ZjU2ID0gJCgnPGRpdiBpZD0iaHRtbF9mY2E2NTUwN2UyNGY0YzU5ODI3ZTY1MGJmNzRhNGY1NiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+NTAtNTAgU1lOQyBDSUMgKFNsb3VnaCk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JjYjA1MDZkZmVhMjRlMGJiMDVlYWI2ODk3YjhjMjIxLnNldENvbnRlbnQoaHRtbF9mY2E2NTUwN2UyNGY0YzU5ODI3ZTY1MGJmNzRhNGY1Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80M2NjMzRiYjc0YWU0ODAwODBmZTBmODQxNmU1ODYxNy5iaW5kUG9wdXAocG9wdXBfYmNiMDUwNmRmZWEyNGUwYmIwNWVhYjY4OTdiOGMyMjEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzI1ZTBmMDhkYzAxNzQ5MzU5MTIxZTBkOWZhM2UzODA1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTMuODAwNzU1NCwtMS41NDkwNzc0XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF83OGFlMWM1YWZmOWY0NDAwOTY3ZWZmZjMyYjVlZDhmOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wYWZmNjg2OTZiZjU0ZjQ1OGI4N2RmM2JhOGY5MmMwYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xNGUwMmFlMTk0NTM0ZGIxODQ5NjMxZWE0Nzc3ZDM3YiA9ICQoJzxkaXYgaWQ9Imh0bWxfMTRlMDJhZTE5NDUzNGRiMTg0OTYzMWVhNDc3N2QzN2IiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPllvcmtzaGlyZSBNZW50b3JpbmcgKExlZWRzIGFuZCBIYWxpZmF4KTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMGFmZjY4Njk2YmY1NGY0NThiODdkZjNiYThmOTJjMGEuc2V0Q29udGVudChodG1sXzE0ZTAyYWUxOTQ1MzRkYjE4NDk2MzFlYTQ3NzdkMzdiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzI1ZTBmMDhkYzAxNzQ5MzU5MTIxZTBkOWZhM2UzODA1LmJpbmRQb3B1cChwb3B1cF8wYWZmNjg2OTZiZjU0ZjQ1OGI4N2RmM2JhOGY5MmMwYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMThhN2E0NzU5NDQxNDFmMGJkNTEwMjJkYjg1Y2YzOGEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1My42NDU3OTIsLTEuNzg1MDM1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF83OGFlMWM1YWZmOWY0NDAwOTY3ZWZmZjMyYjVlZDhmOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zMzNkMWY4NDhiYTI0NzFjYmU2ZTVhODllYmIwYjJjMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zYzg1MDRhYTlkZTA0YWNhOTUzYzEyOWI1OWVmOWQyMSA9ICQoJzxkaXYgaWQ9Imh0bWxfM2M4NTA0YWE5ZGUwNGFjYTk1M2MxMjliNTllZjlkMjEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxlZ2FjeSBTcG9ydCBDSUMgKEh1ZGRlcnNmaWVsZCk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzMzM2QxZjg0OGJhMjQ3MWNiZTZlNWE4OWViYjBiMmMzLnNldENvbnRlbnQoaHRtbF8zYzg1MDRhYTlkZTA0YWNhOTUzYzEyOWI1OWVmOWQyMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xOGE3YTQ3NTk0NDE0MWYwYmQ1MTAyMmRiODVjZjM4YS5iaW5kUG9wdXAocG9wdXBfMzMzZDFmODQ4YmEyNDcxY2JlNmU1YTg5ZWJiMGIyYzMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzc5MjBjZGJmN2Y0MTQ0MzQ4OGU0NjlhNzRmZjdlZjI0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTMuNTc2ODY0Njk5OTk5OTksLTIuNDI4MjE5Ml0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNzhhZTFjNWFmZjlmNDQwMDk2N2VmZmYzMmI1ZWQ4ZjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTNhZWVkZjdhMGE0NDY1Njg4MWRhMTQwZjQyYmRlNGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDQyY2ZjMDQzZmY1NDdiZThiMjVlOThhN2M0ZTkxYzEgPSAkKCc8ZGl2IGlkPSJodG1sXzQ0MmNmYzA0M2ZmNTQ3YmU4YjI1ZTk4YTdjNGU5MWMxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij53ZWxsLWdvb2Qgd2F0ZXIgYWlkIENJQyAoQm9sdG9uKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTNhZWVkZjdhMGE0NDY1Njg4MWRhMTQwZjQyYmRlNGEuc2V0Q29udGVudChodG1sXzQ0MmNmYzA0M2ZmNTQ3YmU4YjI1ZTk4YTdjNGU5MWMxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzc5MjBjZGJmN2Y0MTQ0MzQ4OGU0NjlhNzRmZjdlZjI0LmJpbmRQb3B1cChwb3B1cF9lM2FlZWRmN2EwYTQ0NjU2ODgxZGExNDBmNDJiZGU0YSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjhmOWYyYzhlNDg2NDg3NmI3NmM3MjczMjJiZjczZDcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS43OTk3NjMsLTQuNzQ0MDA4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF83OGFlMWM1YWZmOWY0NDAwOTY3ZWZmZjMyYjVlZDhmOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lYjY0Yzg1MjVkNjA0NGY0OTY3OGI2YWYyMDJhNzYwYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kYWUxYjMzMjJiYTk0YmI2YWQ3YjJjNjcwMThmYjg3NiA9ICQoJzxkaXYgaWQ9Imh0bWxfZGFlMWIzMzIyYmE5NGJiNmFkN2IyYzY3MDE4ZmI4NzYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBlbWJyb2tlc2hpcmUgTG9jYWwgQWN0aW9uIE5ldHdvcmsgZm9yIEVudGVycHJpc2UgYW5kIERldmVsb3BtZW50IChOYXJiZXJ0aCk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ViNjRjODUyNWQ2MDQ0ZjQ5Njc4YjZhZjIwMmE3NjBjLnNldENvbnRlbnQoaHRtbF9kYWUxYjMzMjJiYTk0YmI2YWQ3YjJjNjcwMThmYjg3Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iOGY5ZjJjOGU0ODY0ODc2Yjc2YzcyNzMyMmJmNzNkNy5iaW5kUG9wdXAocG9wdXBfZWI2NGM4NTI1ZDYwNDRmNDk2NzhiNmFmMjAyYTc2MGMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzJkYzZhMmJmMzFjMDQ4ZWY4MmE3YzhiZTQ2NGVlZWU0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNTA3MzUwOSwtMC4xMjc3NTgzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF83OGFlMWM1YWZmOWY0NDAwOTY3ZWZmZjMyYjVlZDhmOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hZjY0ZTUwNjFmMTU0YzAzYjEzNDlmZGE0OTgxNWI5ZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zNWRlOTFkOTJjYmM0MDE2OGRhY2NmOTQxNTYwYzc1ZSA9ICQoJzxkaXYgaWQ9Imh0bWxfMzVkZTkxZDkyY2JjNDAxNjhkYWNjZjk0MTU2MGM3NWUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlByb2plY3RzIEZvciBBbGwgKExvbmRvbik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2FmNjRlNTA2MWYxNTRjMDNiMTM0OWZkYTQ5ODE1YjlmLnNldENvbnRlbnQoaHRtbF8zNWRlOTFkOTJjYmM0MDE2OGRhY2NmOTQxNTYwYzc1ZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yZGM2YTJiZjMxYzA0OGVmODJhN2M4YmU0NjRlZWVlNC5iaW5kUG9wdXAocG9wdXBfYWY2NGU1MDYxZjE1NGMwM2IxMzQ5ZmRhNDk4MTViOWYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzU1ODc1MmU4YTQyMTQ0YjI5YWI3N2M1YjcxNDJmNGE0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTMuODAwNzU1NCwtMS41NDkwNzc0XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF83OGFlMWM1YWZmOWY0NDAwOTY3ZWZmZjMyYjVlZDhmOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jZmY4MTYzNzA3Yzg0MDU2YWU0ZDk3OTIzYmQwNTczYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iYmU2N2U4ZDI4Y2Q0NDgxYmYxOGU3YjMzNzk1NDZlZSA9ICQoJzxkaXYgaWQ9Imh0bWxfYmJlNjdlOGQyOGNkNDQ4MWJmMThlN2IzMzc5NTQ2ZWUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9ibG9uZyAoTGVlZHMpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jZmY4MTYzNzA3Yzg0MDU2YWU0ZDk3OTIzYmQwNTczYS5zZXRDb250ZW50KGh0bWxfYmJlNjdlOGQyOGNkNDQ4MWJmMThlN2IzMzc5NTQ2ZWUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTU4NzUyZThhNDIxNDRiMjlhYjc3YzViNzE0MmY0YTQuYmluZFBvcHVwKHBvcHVwX2NmZjgxNjM3MDdjODQwNTZhZTRkOTc5MjNiZDA1NzNhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mN2YyNzc5NmExZTM0NTZmOWYyZDUxOGVjM2I5M2UzYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUzLjM4MTEyODk5OTk5OTk5LC0xLjQ3MDA4NV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNzhhZTFjNWFmZjlmNDQwMDk2N2VmZmYzMmI1ZWQ4ZjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjQxNjllYWE0YjRmNDhiYjhmMzU2OTdlYmQzM2Y5MzAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzBjYjJlNjFlNDIxNDVkYWIzNGNlMDdmNzcwMGM5OTggPSAkKCc8ZGl2IGlkPSJodG1sXzMwY2IyZTYxZTQyMTQ1ZGFiMzRjZTA3Zjc3MDBjOTk4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SZWNvdmVyeSBFbnRlcnByaXNlcyAoU2hlZmZpZWxkICk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY0MTY5ZWFhNGI0ZjQ4YmI4ZjM1Njk3ZWJkMzNmOTMwLnNldENvbnRlbnQoaHRtbF8zMGNiMmU2MWU0MjE0NWRhYjM0Y2UwN2Y3NzAwYzk5OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mN2YyNzc5NmExZTM0NTZmOWYyZDUxOGVjM2I5M2UzYy5iaW5kUG9wdXAocG9wdXBfNjQxNjllYWE0YjRmNDhiYjhmMzU2OTdlYmQzM2Y5MzApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2FhNDQ3NzMyOTlmZjQzZWE4NWZkY2Q4NTMwNTk2YTlmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNDU0NTEzLC0yLjU4NzkxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF83OGFlMWM1YWZmOWY0NDAwOTY3ZWZmZjMyYjVlZDhmOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85OGY2OGZjNmIzODc0M2Y3YWQ2OTFjMjkyZDgwY2UwNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wMmYzYjgyNDI2ZGM0MGNhYTJiYjkyMDgzMjFjZTY5MiA9ICQoJzxkaXYgaWQ9Imh0bWxfMDJmM2I4MjQyNmRjNDBjYWEyYmI5MjA4MzIxY2U2OTIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPktub3dsZSBXZXN0IE1lZGlhIENlbnRyZSAoQnJpc3RvbCk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk4ZjY4ZmM2YjM4NzQzZjdhZDY5MWMyOTJkODBjZTA1LnNldENvbnRlbnQoaHRtbF8wMmYzYjgyNDI2ZGM0MGNhYTJiYjkyMDgzMjFjZTY5Mik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hYTQ0NzczMjk5ZmY0M2VhODVmZGNkODUzMDU5NmE5Zi5iaW5kUG9wdXAocG9wdXBfOThmNjhmYzZiMzg3NDNmN2FkNjkxYzI5MmQ4MGNlMDUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzVkZjliODhiN2FjOTQ5MDY5Nzg2N2RhMGJkZjA4MDc4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNTQ2NTA2MywtMC4xMDU4MDU4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF83OGFlMWM1YWZmOWY0NDAwOTY3ZWZmZjMyYjVlZDhmOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kMWRjZmExM2Y3ZDA0YTMxYWQ4YzQ5NzdlMjM1MGVjMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80Yzk2ZTRjM2Q4MmI0MmIyYTEzYTljOTgyZTFiOWRjNyA9ICQoJzxkaXYgaWQ9Imh0bWxfNGM5NmU0YzNkODJiNDJiMmExM2E5Yzk4MmUxYjlkYzciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxvbmRvbiBWaWxsYWdlIE5ldHdvcmsgKElzbGluZ3RvbjogTG9uZG9uKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDFkY2ZhMTNmN2QwNGEzMWFkOGM0OTc3ZTIzNTBlYzIuc2V0Q29udGVudChodG1sXzRjOTZlNGMzZDgyYjQyYjJhMTNhOWM5ODJlMWI5ZGM3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzVkZjliODhiN2FjOTQ5MDY5Nzg2N2RhMGJkZjA4MDc4LmJpbmRQb3B1cChwb3B1cF9kMWRjZmExM2Y3ZDA0YTMxYWQ4YzQ5NzdlMjM1MGVjMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjc4MTQzOGE0ZTY1NDZmMTlkYTIyNGQzNDJlYTI3MDIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1NS4wNDYzODksLTEuNDUxMjk4OV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNzhhZTFjNWFmZjlmNDQwMDk2N2VmZmYzMmI1ZWQ4ZjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDhiYTZlOWU5ZDUxNGI1NzgzNjdmYjJkNjhmZTA4YzQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2FjOWUzZjMwNDdhNGI0YWIxMDViOGFmNGViYjEzZWYgPSAkKCc8ZGl2IGlkPSJodG1sXzNhYzllM2YzMDQ3YTRiNGFiMTA1YjhhZjRlYmIxM2VmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QYXJrIFZpZXcgUHJvamVjdCAgKFdoaXRsZXkgQmF5LCBOb3J0aCBUeW5lc2lkZSwgVHluZSAmYW1wOyBXZWFyKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDhiYTZlOWU5ZDUxNGI1NzgzNjdmYjJkNjhmZTA4YzQuc2V0Q29udGVudChodG1sXzNhYzllM2YzMDQ3YTRiNGFiMTA1YjhhZjRlYmIxM2VmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzI3ODE0MzhhNGU2NTQ2ZjE5ZGEyMjRkMzQyZWEyNzAyLmJpbmRQb3B1cChwb3B1cF80OGJhNmU5ZTlkNTE0YjU3ODM2N2ZiMmQ2OGZlMDhjNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfN2Y0ODRkYTRlYzExNGM3ODg0M2NkOGE0MjYzNjg5ZTUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1NS44NjQyMzcsLTQuMjUxODA2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF83OGFlMWM1YWZmOWY0NDAwOTY3ZWZmZjMyYjVlZDhmOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xYTdjNzAwMDJlZDc0ZmQzOWU5Y2ZiNTVlNmZlZGI3ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lYjk3ZTc1MWI5ZWY0NWJlYjM2MjQ3YjcyMzZhNTU5YiA9ICQoJzxkaXYgaWQ9Imh0bWxfZWI5N2U3NTFiOWVmNDViZWIzNjI0N2I3MjM2YTU1OWIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNpbW9uIENvbW11bml0eSBTY290bGFuZCAoR2xhc2dvdyk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzFhN2M3MDAwMmVkNzRmZDM5ZTljZmI1NWU2ZmVkYjdkLnNldENvbnRlbnQoaHRtbF9lYjk3ZTc1MWI5ZWY0NWJlYjM2MjQ3YjcyMzZhNTU5Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83ZjQ4NGRhNGVjMTE0Yzc4ODQzY2Q4YTQyNjM2ODllNS5iaW5kUG9wdXAocG9wdXBfMWE3YzcwMDAyZWQ3NGZkMzllOWNmYjU1ZTZmZWRiN2QpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzBjZmM4OTZkZWYyOTQ1MTNhZGM2YTA4MzFhNmJlYjQ3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNTA3MzUwOSwtMC4xMjc3NTgzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF83OGFlMWM1YWZmOWY0NDAwOTY3ZWZmZjMyYjVlZDhmOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80OWU2Yzg1YmU3NmI0YzY2ODE5Y2U1MzBmMDBmMGQ1MSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85ZTY5Njg3ZDkxMWQ0NjE3ODhmNTEwYjY4MmYzZGFiNCA9ICQoJzxkaXYgaWQ9Imh0bWxfOWU2OTY4N2Q5MTFkNDYxNzg4ZjUxMGI2ODJmM2RhYjQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFjdGlvbiBmb3IgU3RhbW1lcmluZyBDaGlsZHJlbiAoTG9uZG9uKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDllNmM4NWJlNzZiNGM2NjgxOWNlNTMwZjAwZjBkNTEuc2V0Q29udGVudChodG1sXzllNjk2ODdkOTExZDQ2MTc4OGY1MTBiNjgyZjNkYWI0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzBjZmM4OTZkZWYyOTQ1MTNhZGM2YTA4MzFhNmJlYjQ3LmJpbmRQb3B1cChwb3B1cF80OWU2Yzg1YmU3NmI0YzY2ODE5Y2U1MzBmMDBmMGQ1MSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTExMDY0MjcxMTlkNGY1NDk2NGU3Zjk1MzRmNDI3NDIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1NS45NTMyNTIsLTMuMTg4MjY3XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF83OGFlMWM1YWZmOWY0NDAwOTY3ZWZmZjMyYjVlZDhmOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jN2ZkMWJiMDZkZDc0NTllYTdmZjNmZDFhMTBjNDAxMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80Y2I0MDM5NWE1MjE0NGE5OWJjNzljNzNiYzcwNDgzZSA9ICQoJzxkaXYgaWQ9Imh0bWxfNGNiNDAzOTVhNTIxNDRhOTliYzc5YzczYmM3MDQ4M2UiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlN0cmVldHdvcmsgVUsgKEVkaW5idXJnaCk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2M3ZmQxYmIwNmRkNzQ1OWVhN2ZmM2ZkMWExMGM0MDEwLnNldENvbnRlbnQoaHRtbF80Y2I0MDM5NWE1MjE0NGE5OWJjNzljNzNiYzcwNDgzZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hMTEwNjQyNzExOWQ0ZjU0OTY0ZTdmOTUzNGY0Mjc0Mi5iaW5kUG9wdXAocG9wdXBfYzdmZDFiYjA2ZGQ3NDU5ZWE3ZmYzZmQxYTEwYzQwMTApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzFlODc1YmE1NjI5NDQyOTg5NWIzNDVkYjZhMTFlMjBhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTAuNzY4MDM1LDAuMjkwNDcyXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF83OGFlMWM1YWZmOWY0NDAwOTY3ZWZmZjMyYjVlZDhmOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yZjM0M2Q4OTQyN2Q0MWMxODQ2NTQ1ZmY3MzNiNWU2OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85OGNlYTYyMjg4NGE0NGU4OWI5NmRjMGJlNWI4ZjQ5YyA9ICQoJzxkaXYgaWQ9Imh0bWxfOThjZWE2MjI4ODRhNDRlODliOTZkYzBiZTViOGY0OWMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlRoZSBXYXlmaW5kZXIgR3JvdXAgQ0lDIChFYXN0Ym91cm5lKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMmYzNDNkODk0MjdkNDFjMTg0NjU0NWZmNzMzYjVlNjguc2V0Q29udGVudChodG1sXzk4Y2VhNjIyODg0YTQ0ZTg5Yjk2ZGMwYmU1YjhmNDljKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzFlODc1YmE1NjI5NDQyOTg5NWIzNDVkYjZhMTFlMjBhLmJpbmRQb3B1cChwb3B1cF8yZjM0M2Q4OTQyN2Q0MWMxODQ2NTQ1ZmY3MzNiNWU2OCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzdkZDU5OTNjNzBkNDQ4MmJmMWFkMmNkYmE3NTA0MjMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1Ni4yMDA4NDE5OTk5OTk5OSwtMy4xNTk4Nl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNzhhZTFjNWFmZjlmNDQwMDk2N2VmZmYzMmI1ZWQ4ZjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzczZDJkNzg3NTc5NDk4NmEwYTI2MzJlNDliZTY2YWUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWNhOGRkNGYxOTc5NDVlMjlkMzA4OGRhZDhkNTgwNzIgPSAkKCc8ZGl2IGlkPSJodG1sX2VjYThkZDRmMTk3OTQ1ZTI5ZDMwODhkYWQ4ZDU4MDcyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DaXRpemVucyBBZHZpY2UgYW5kIFJpZ2h0cyBGaWZlIChHbGVucm90aGVzLCBGaWZlKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzczZDJkNzg3NTc5NDk4NmEwYTI2MzJlNDliZTY2YWUuc2V0Q29udGVudChodG1sX2VjYThkZDRmMTk3OTQ1ZTI5ZDMwODhkYWQ4ZDU4MDcyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2M3ZGQ1OTkzYzcwZDQ0ODJiZjFhZDJjZGJhNzUwNDIzLmJpbmRQb3B1cChwb3B1cF9jNzNkMmQ3ODc1Nzk0OTg2YTBhMjYzMmU0OWJlNjZhZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWYwZDRlNTViMzMzNGM3NTkzMWUxNmVlYTNhOGMwMjYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS43NTIwMjA5LC0xLjI1NzcyNjNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzc4YWUxYzVhZmY5ZjQ0MDA5NjdlZmZmMzJiNWVkOGY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzgwYmFlMDQ3ODZjMjRmYjVhZDQ4NmJkNWVlNjlmNTM3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U2MDk1ZGMwNmVlNzQ4NWM4OTg3NmJkNGUzZDAzNTI0ID0gJCgnPGRpdiBpZD0iaHRtbF9lNjA5NWRjMDZlZTc0ODVjODk4NzZiZDRlM2QwMzUyNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RGlnaXRhbCBmb3IgR29vZCAoT3hmb3JkKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODBiYWUwNDc4NmMyNGZiNWFkNDg2YmQ1ZWU2OWY1Mzcuc2V0Q29udGVudChodG1sX2U2MDk1ZGMwNmVlNzQ4NWM4OTg3NmJkNGUzZDAzNTI0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzlmMGQ0ZTU1YjMzMzRjNzU5MzFlMTZlZWEzYThjMDI2LmJpbmRQb3B1cChwb3B1cF84MGJhZTA0Nzg2YzI0ZmI1YWQ0ODZiZDVlZTY5ZjUzNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNWQ0MTkzMGZhMTUxNGMwNTk1YmU3YTAxZmE2Mzg1YjEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41MDczNTA5LC0wLjEyNzc1ODNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzc4YWUxYzVhZmY5ZjQ0MDA5NjdlZmZmMzJiNWVkOGY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg5Mzc3MDZiYTEyMjQ2ZjViZjk4MTM0ZGQ2NjYwNDhlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzcwYmZjMTMyZGU5NDQ4MGFiYTkyYzdhNzMyMTA2ZTI5ID0gJCgnPGRpdiBpZD0iaHRtbF83MGJmYzEzMmRlOTQ0ODBhYmE5MmM3YTczMjEwNmUyOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SmFyb2tlbG8gUHVibGljIEJlbmVmaXQgQXNzb2NpYXRpb24gKExvbmRvbiApPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84OTM3NzA2YmExMjI0NmY1YmY5ODEzNGRkNjY2MDQ4ZS5zZXRDb250ZW50KGh0bWxfNzBiZmMxMzJkZTk0NDgwYWJhOTJjN2E3MzIxMDZlMjkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNWQ0MTkzMGZhMTUxNGMwNTk1YmU3YTAxZmE2Mzg1YjEuYmluZFBvcHVwKHBvcHVwXzg5Mzc3MDZiYTEyMjQ2ZjViZjk4MTM0ZGQ2NjYwNDhlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kZmY1NGZkMjVmZTg0Yzk1OTkzZTFkNzRjZDVjNWE4OCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUzLjgwMDc1NTQsLTEuNTQ5MDc3NF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNzhhZTFjNWFmZjlmNDQwMDk2N2VmZmYzMmI1ZWQ4ZjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfM2MyYjk3ZWZhOWQ1NGNjYTliOTkzYzNlMGUzZGJkM2YgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTg0ZGNhMjRiZDg4NGYwNzgyZTM2YzY1ZmNhYzdlMTYgPSAkKCc8ZGl2IGlkPSJodG1sX2U4NGRjYTI0YmQ4ODRmMDc4MmUzNmM2NWZjYWM3ZTE2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BdHRpZ28gQ0lDIChMZWVkcyk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzNjMmI5N2VmYTlkNTRjY2E5Yjk5M2MzZTBlM2RiZDNmLnNldENvbnRlbnQoaHRtbF9lODRkY2EyNGJkODg0ZjA3ODJlMzZjNjVmY2FjN2UxNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kZmY1NGZkMjVmZTg0Yzk1OTkzZTFkNzRjZDVjNWE4OC5iaW5kUG9wdXAocG9wdXBfM2MyYjk3ZWZhOWQ1NGNjYTliOTkzYzNlMGUzZGJkM2YpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzlkYzg0MDk1NDQ4YjQxZjRiYWMyNWYzODU3MDVlM2EwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTQuOTUyNjgsLTEuNjAzNDExXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF83OGFlMWM1YWZmOWY0NDAwOTY3ZWZmZjMyYjVlZDhmOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lZGY3N2IyMzRhMTY0NTI0YjUwYzc5ZWU1NTdlODAyOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81NjY0Mjg2ZGQzM2I0ZTVhODEwZWM5ZmQwZjVkM2ExNSA9ICQoJzxkaXYgaWQ9Imh0bWxfNTY2NDI4NmRkMzNiNGU1YTgxMGVjOWZkMGY1ZDNhMTUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVxdWFsIEFydHMgKEdhdGVzaGVhZCk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2VkZjc3YjIzNGExNjQ1MjRiNTBjNzllZTU1N2U4MDI4LnNldENvbnRlbnQoaHRtbF81NjY0Mjg2ZGQzM2I0ZTVhODEwZWM5ZmQwZjVkM2ExNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85ZGM4NDA5NTQ0OGI0MWY0YmFjMjVmMzg1NzA1ZTNhMC5iaW5kUG9wdXAocG9wdXBfZWRmNzdiMjM0YTE2NDUyNGI1MGM3OWVlNTU3ZTgwMjgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2E5NzAxNTZjNTQ4NDQwZTBhMWI1YzhlZjdjNDQ4MDBiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNDQxNDU3OSwtMC4wMTE3MDA2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF83OGFlMWM1YWZmOWY0NDAwOTY3ZWZmZjMyYjVlZDhmOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83YjkyMjE3Yjk4MDE0NjliOTNlMzNjOGY1NTRmMzM1NiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85NDI1YWE3NjJlOTM0YzZjOTI5NWZkMGFmNmI3MTI4NCA9ICQoJzxkaXYgaWQ9Imh0bWxfOTQyNWFhNzYyZTkzNGM2YzkyOTVmZDBhZjZiNzEyODQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJlIFRvdGFsbHkgWW91IChMZXdpc2hhbSk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzdiOTIyMTdiOTgwMTQ2OWI5M2UzM2M4ZjU1NGYzMzU2LnNldENvbnRlbnQoaHRtbF85NDI1YWE3NjJlOTM0YzZjOTI5NWZkMGFmNmI3MTI4NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hOTcwMTU2YzU0ODQ0MGUwYTFiNWM4ZWY3YzQ0ODAwYi5iaW5kUG9wdXAocG9wdXBfN2I5MjIxN2I5ODAxNDY5YjkzZTMzYzhmNTU0ZjMzNTYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzliNTkxM2I0NDAxNjRkN2RiYmU3NTg2NjAzM2YyNjA0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTMuNDgwNzU5MywtMi4yNDI2MzA1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF83OGFlMWM1YWZmOWY0NDAwOTY3ZWZmZjMyYjVlZDhmOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84MDA4MmQ4ZTQ2NWI0NWFkYWIzMmIzN2Y0NDYzNjAzNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83NDYwN2I2ZmIxN2E0OGQxOGYzYjBkZjNiMmIwYTAwYiA9ICQoJzxkaXYgaWQ9Imh0bWxfNzQ2MDdiNmZiMTdhNDhkMThmM2IwZGYzYjJiMGEwMGIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmluMnJlY292ZXJ5IENJQyAoTWFuY2hlc3Rlcik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzgwMDgyZDhlNDY1YjQ1YWRhYjMyYjM3ZjQ0NjM2MDM3LnNldENvbnRlbnQoaHRtbF83NDYwN2I2ZmIxN2E0OGQxOGYzYjBkZjNiMmIwYTAwYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85YjU5MTNiNDQwMTY0ZDdkYmJlNzU4NjYwMzNmMjYwNC5iaW5kUG9wdXAocG9wdXBfODAwODJkOGU0NjViNDVhZGFiMzJiMzdmNDQ2MzYwMzcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2I0OGM0MGRkMjVlMjRkZmY4MTJiYWJhNzMxNTZkMTY2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTMuNDA4MzcxNCwtMi45OTE1NzI2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF83OGFlMWM1YWZmOWY0NDAwOTY3ZWZmZjMyYjVlZDhmOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82OTY1YTljZWJkMjI0NDE2YTgzNGU4ZGJhMDg0YWVlOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mOGJjNjFkYTEzYzU0NjIxODRjY2M1NjEzOGQ3MThjYyA9ICQoJzxkaXYgaWQ9Imh0bWxfZjhiYzYxZGExM2M1NDYyMTg0Y2NjNTYxMzhkNzE4Y2MiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRlc2lyZSBhbmQgSW5zcGlyZSAoTGl2ZXJwb29sKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjk2NWE5Y2ViZDIyNDQxNmE4MzRlOGRiYTA4NGFlZTkuc2V0Q29udGVudChodG1sX2Y4YmM2MWRhMTNjNTQ2MjE4NGNjYzU2MTM4ZDcxOGNjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2I0OGM0MGRkMjVlMjRkZmY4MTJiYWJhNzMxNTZkMTY2LmJpbmRQb3B1cChwb3B1cF82OTY1YTljZWJkMjI0NDE2YTgzNGU4ZGJhMDg0YWVlOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZGYwZWIxMzA4YmQ0NGI5MzkwYzNjOTZiM2IzNDZkZjcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41MDczNTA5LC0wLjEyNzc1ODNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzc4YWUxYzVhZmY5ZjQ0MDA5NjdlZmZmMzJiNWVkOGY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzA4ZGZjZjI5YzY3NjRmY2NiM2UzNDZkMWIyZTIxNWU1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzYwZTU4ZDJmNDNiMDQ4YjViYTk2MzhjMTBkYWJlMzY5ID0gJCgnPGRpdiBpZD0iaHRtbF82MGU1OGQyZjQzYjA0OGI1YmE5NjM4YzEwZGFiZTM2OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VG93ZXIgSGFtbGV0cyBDb21tdW5pdHkgVHJhbnNwb3J0IChMb25kb24pPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wOGRmY2YyOWM2NzY0ZmNjYjNlMzQ2ZDFiMmUyMTVlNS5zZXRDb250ZW50KGh0bWxfNjBlNThkMmY0M2IwNDhiNWJhOTYzOGMxMGRhYmUzNjkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZGYwZWIxMzA4YmQ0NGI5MzkwYzNjOTZiM2IzNDZkZjcuYmluZFBvcHVwKHBvcHVwXzA4ZGZjZjI5YzY3NjRmY2NiM2UzNDZkMWIyZTIxNWU1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83MWU4M2EyMjg5YjI0NmJiYWIwNzM5ZWZmZGNlM2RiMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUyLjUzNjE2NzQsLTIuMDEwNzkzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF83OGFlMWM1YWZmOWY0NDAwOTY3ZWZmZjMyYjVlZDhmOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jMjU5YjFkNzExOTY0ODc1YTA0NjUxMDQ1YTlkMzY4ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xY2MwZmYzOGRmMDg0YmI4YTVkMmFmZjI3YzFhZTkyOSA9ICQoJzxkaXYgaWQ9Imh0bWxfMWNjMGZmMzhkZjA4NGJiOGE1ZDJhZmYyN2MxYWU5MjkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJ1aWxkaW5nIEJyaWRnZXMgVHJhaW5pbmcgKFNhbmR3ZWxsIGFuZCBCaXJtaW5naGFtKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzI1OWIxZDcxMTk2NDg3NWEwNDY1MTA0NWE5ZDM2OGQuc2V0Q29udGVudChodG1sXzFjYzBmZjM4ZGYwODRiYjhhNWQyYWZmMjdjMWFlOTI5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzcxZTgzYTIyODliMjQ2YmJhYjA3MzllZmZkY2UzZGIzLmJpbmRQb3B1cChwb3B1cF9jMjU5YjFkNzExOTY0ODc1YTA0NjUxMDQ1YTlkMzY4ZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWYwNzYwNTlhN2YxNDAyZmI0Mzg3M2QyMmIwZjcyZTEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS42MjE0NCwtMy45NDM2NDU5OTk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzc4YWUxYzVhZmY5ZjQ0MDA5NjdlZmZmMzJiNWVkOGY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzNmNmIyMGFjODU5ZDRhM2Y4YmViYjYwNDAyMTcwMjVjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzE2NWUyZTU3OWMxNDQxNmI5MDVhOGE5ZjY5NDNiOGYzID0gJCgnPGRpdiBpZD0iaHRtbF8xNjVlMmU1NzljMTQ0MTZiOTA1YThhOWY2OTQzYjhmMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VGhlIE11bGxhbnkgRnVuZCAoU3dhbnNlYSk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzNmNmIyMGFjODU5ZDRhM2Y4YmViYjYwNDAyMTcwMjVjLnNldENvbnRlbnQoaHRtbF8xNjVlMmU1NzljMTQ0MTZiOTA1YThhOWY2OTQzYjhmMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85ZjA3NjA1OWE3ZjE0MDJmYjQzODczZDIyYjBmNzJlMS5iaW5kUG9wdXAocG9wdXBfM2Y2YjIwYWM4NTlkNGEzZjhiZWJiNjA0MDIxNzAyNWMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzZlMGMyNGI5OTQ3ZDQ3MjJhZjUyMTQ3YzIwZTRiMzI3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNTA3MzUwOSwtMC4xMjc3NTgzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF83OGFlMWM1YWZmOWY0NDAwOTY3ZWZmZjMyYjVlZDhmOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jMDlkY2FiNmY4NGM0Y2MxYmI1MmY3MTRiNzBiOTdkNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wMDhmMmE4NTg2NmM0N2ZjYTFiZjZhN2I0NzEwMDM1OCA9ICQoJzxkaXYgaWQ9Imh0bWxfMDA4ZjJhODU4NjZjNDdmY2ExYmY2YTdiNDcxMDAzNTgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkdpbmdlcmJyZWFkIChMb25kb24pPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jMDlkY2FiNmY4NGM0Y2MxYmI1MmY3MTRiNzBiOTdkNy5zZXRDb250ZW50KGh0bWxfMDA4ZjJhODU4NjZjNDdmY2ExYmY2YTdiNDcxMDAzNTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNmUwYzI0Yjk5NDdkNDcyMmFmNTIxNDdjMjBlNGIzMjcuYmluZFBvcHVwKHBvcHVwX2MwOWRjYWI2Zjg0YzRjYzFiYjUyZjcxNGI3MGI5N2Q3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hMzFmY2MwYmUxYzY0OTBmODMwNmQ4NjdmZjBhNzRkMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjUwNzM1MDksLTAuMTI3NzU4M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNzhhZTFjNWFmZjlmNDQwMDk2N2VmZmYzMmI1ZWQ4ZjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTM3MzIyZTVkMWMyNDFlNGI1YzZiYzFiZWM3ZGU1NDUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTY2ZGM1OTc3NDY5NDc1NGJlZmRkNzFhNGJiZjk3ZWEgPSAkKCc8ZGl2IGlkPSJodG1sXzU2NmRjNTk3NzQ2OTQ3NTRiZWZkZDcxYTRiYmY5N2VhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Vbml2ZXJzaXR5IENvbGxlZ2UgTG9uZG9uIChVQ0wpIChMb25kb24gLSBVSyk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2EzNzMyMmU1ZDFjMjQxZTRiNWM2YmMxYmVjN2RlNTQ1LnNldENvbnRlbnQoaHRtbF81NjZkYzU5Nzc0Njk0NzU0YmVmZGQ3MWE0YmJmOTdlYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hMzFmY2MwYmUxYzY0OTBmODMwNmQ4NjdmZjBhNzRkMC5iaW5kUG9wdXAocG9wdXBfYTM3MzIyZTVkMWMyNDFlNGI1YzZiYzFiZWM3ZGU1NDUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzUxYjhlNzBlYTIzMzQ1YjdhNzM5Y2IwZDM5ZDA0MGM0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTIuMjQwNDc3LC0wLjkwMjY1NjAwMDAwMDAwMDFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzc4YWUxYzVhZmY5ZjQ0MDA5NjdlZmZmMzJiNWVkOGY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzAzMmQzNDhhMDI0OTQ3Y2JhNDkyYjEzZjRiMjI1ODJlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FlMTllYTg1MGU5MTQ0ZDZiNWNiNDU4ZGViMDZhZWZiID0gJCgnPGRpdiBpZD0iaHRtbF9hZTE5ZWE4NTBlOTE0NGQ2YjVjYjQ1OGRlYjA2YWVmYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VGhlIENocnlzYWxpcyBGb3VuZGF0aW9uIChOb3J0aGFtcHRvbik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzAzMmQzNDhhMDI0OTQ3Y2JhNDkyYjEzZjRiMjI1ODJlLnNldENvbnRlbnQoaHRtbF9hZTE5ZWE4NTBlOTE0NGQ2YjVjYjQ1OGRlYjA2YWVmYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81MWI4ZTcwZWEyMzM0NWI3YTczOWNiMGQzOWQwNDBjNC5iaW5kUG9wdXAocG9wdXBfMDMyZDM0OGEwMjQ5NDdjYmE0OTJiMTNmNGIyMjU4MmUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNiMDgwY2RjODUyZDQ4ZGNiZTY5YWIyYjIyNTZjOWUwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTIuNDA2ODIyLC0xLjUxOTY5M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNzhhZTFjNWFmZjlmNDQwMDk2N2VmZmYzMmI1ZWQ4ZjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2ExN2NlNDY2YzRlNGVkYmFkMTliY2I4NTVhMWFmMzYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2JjOGVhZDAzNmUxNGMwOWI5NDUwMjFhZDExYmZiOWQgPSAkKCc8ZGl2IGlkPSJodG1sXzNiYzhlYWQwMzZlMTRjMDliOTQ1MDIxYWQxMWJmYjlkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DZW50cmFsIEVuZ2xhbmQgTGF3IENlbnRyZSAoQ292ZW50cnkpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83YTE3Y2U0NjZjNGU0ZWRiYWQxOWJjYjg1NWExYWYzNi5zZXRDb250ZW50KGh0bWxfM2JjOGVhZDAzNmUxNGMwOWI5NDUwMjFhZDExYmZiOWQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfM2IwODBjZGM4NTJkNDhkY2JlNjlhYjJiMjI1NmM5ZTAuYmluZFBvcHVwKHBvcHVwXzdhMTdjZTQ2NmM0ZTRlZGJhZDE5YmNiODU1YTFhZjM2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yNTE0MTMzM2JlMjQ0MzEzOGUxMDczZTljNTcyYmM0OCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUzLjY0NTc5MiwtMS43ODUwMzVdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzc4YWUxYzVhZmY5ZjQ0MDA5NjdlZmZmMzJiNWVkOGY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzNmZTk2YzJlZTIyNTQwYjBiOWI0NzE4NDRlZGRmYTcxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFkMWUzYmY1ZDViMjQ2NmM5ODQ3NjE4NTI2MGUzZGZlID0gJCgnPGRpdiBpZD0iaHRtbF8xZDFlM2JmNWQ1YjI0NjZjOTg0NzYxODUyNjBlM2RmZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VW5pdmVyc2l0eSBvZiBIdWRkZXJzZmllbGQsIENlbnRyZSBvZiBTdXN0YWluYWJsZSAmYW1wOyBSZXNpbGllbnQgQ29tbXVuaXRpZXMgKEh1ZGRlcnNmaWVsZCk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzNmZTk2YzJlZTIyNTQwYjBiOWI0NzE4NDRlZGRmYTcxLnNldENvbnRlbnQoaHRtbF8xZDFlM2JmNWQ1YjI0NjZjOTg0NzYxODUyNjBlM2RmZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yNTE0MTMzM2JlMjQ0MzEzOGUxMDczZTljNTcyYmM0OC5iaW5kUG9wdXAocG9wdXBfM2ZlOTZjMmVlMjI1NDBiMGI5YjQ3MTg0NGVkZGZhNzEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhiZTY0NjhiODdlMjRkYTdiMTdiMzk1MzU0YTEwMDE0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTIuOTU0NzgzMTk5OTk5OTksLTEuMTU4MTA4Nl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNzhhZTFjNWFmZjlmNDQwMDk2N2VmZmYzMmI1ZWQ4ZjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjJhNGQ4ZWNjYWVjNGM1N2FmMjJhM2NkMTY4MWEzYjggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTNjZTVmZmFkZDgzNDlmOWE2NTUyOTMxNTgzOGZmOTIgPSAkKCc8ZGl2IGlkPSJodG1sXzkzY2U1ZmZhZGQ4MzQ5ZjlhNjU1MjkzMTU4MzhmZjkyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IYXJtbGVzcyBDSUMgKE5vdHRpbmdoYW0pPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82MmE0ZDhlY2NhZWM0YzU3YWYyMmEzY2QxNjgxYTNiOC5zZXRDb250ZW50KGh0bWxfOTNjZTVmZmFkZDgzNDlmOWE2NTUyOTMxNTgzOGZmOTIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOGJlNjQ2OGI4N2UyNGRhN2IxN2IzOTUzNTRhMTAwMTQuYmluZFBvcHVwKHBvcHVwXzYyYTRkOGVjY2FlYzRjNTdhZjIyYTNjZDE2ODFhM2I4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80ZWRkYjk5YzcyNWE0YmE5ODYwOWFlNTNlOWMyMWJhNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjUwNzM1MDksLTAuMTI3NzU4M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNzhhZTFjNWFmZjlmNDQwMDk2N2VmZmYzMmI1ZWQ4ZjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjk2MjkyODk3ZGQ5NDFlMWIyYTc4NzM4MjYyMTZjZTkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2ExNjFmNWExMTNiNGJjOGI2MTgxMWM1NTAxOTc4MGEgPSAkKCc8ZGl2IGlkPSJodG1sXzNhMTYxZjVhMTEzYjRiYzhiNjE4MTFjNTUwMTk3ODBhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CcmlkZ2VzIFNlbGYgTWFuYWdlbWVudCBMaW1pdGVkIChMb25kb24pPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82OTYyOTI4OTdkZDk0MWUxYjJhNzg3MzgyNjIxNmNlOS5zZXRDb250ZW50KGh0bWxfM2ExNjFmNWExMTNiNGJjOGI2MTgxMWM1NTAxOTc4MGEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNGVkZGI5OWM3MjVhNGJhOTg2MDlhZTUzZTljMjFiYTYuYmluZFBvcHVwKHBvcHVwXzY5NjI5Mjg5N2RkOTQxZTFiMmE3ODczODI2MjE2Y2U5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kNGIyNTQzMjM2ZWM0YTBkYTgxNTdhYWNkZjQ3ODk3NyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUzLjQwODM3MTQsLTIuOTkxNTcyNl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNzhhZTFjNWFmZjlmNDQwMDk2N2VmZmYzMmI1ZWQ4ZjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTJmYTM0ZTRjOTk2NGExMTgyNDBkZjlhZDQ1MWJkMWYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTViNDNmNjRmN2RlNGI4YmI0ZDU2NWQ3MjRkZGRmNDkgPSAkKCc8ZGl2IGlkPSJodG1sXzU1YjQzZjY0ZjdkZTRiOGJiNGQ1NjVkNzI0ZGRkZjQ5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Gb3VuZGF0aW9uIFNjaG9vbCBvZiBNYXJ0aWFsIEFydHMgKExpdmVycG9vbCk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2UyZmEzNGU0Yzk5NjRhMTE4MjQwZGY5YWQ0NTFiZDFmLnNldENvbnRlbnQoaHRtbF81NWI0M2Y2NGY3ZGU0YjhiYjRkNTY1ZDcyNGRkZGY0OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kNGIyNTQzMjM2ZWM0YTBkYTgxNTdhYWNkZjQ3ODk3Ny5iaW5kUG9wdXAocG9wdXBfZTJmYTM0ZTRjOTk2NGExMTgyNDBkZjlhZDQ1MWJkMWYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzRiNTg5MWMzMTVmNDRjNmRiOTM5MTdiZWY5OTE3YzY2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNTA3MzUwOSwtMC4xMjc3NTgzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF83OGFlMWM1YWZmOWY0NDAwOTY3ZWZmZjMyYjVlZDhmOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82ZGM2YzM2ZTA0NWM0YTE4OWM2Njc2M2Q2YjQwZTlmZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wZGFmZTEwZDliMTQ0Mjc1YjNkZWVkMzlhOGUzMmRlMCA9ICQoJzxkaXYgaWQ9Imh0bWxfMGRhZmUxMGQ5YjE0NDI3NWIzZGVlZDM5YThlMzJkZTAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9yY2hhcmQgSGlsbCBDb2xsZWdlIChMb25kb24pPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82ZGM2YzM2ZTA0NWM0YTE4OWM2Njc2M2Q2YjQwZTlmZi5zZXRDb250ZW50KGh0bWxfMGRhZmUxMGQ5YjE0NDI3NWIzZGVlZDM5YThlMzJkZTApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNGI1ODkxYzMxNWY0NGM2ZGI5MzkxN2JlZjk5MTdjNjYuYmluZFBvcHVwKHBvcHVwXzZkYzZjMzZlMDQ1YzRhMTg5YzY2NzYzZDZiNDBlOWZmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84Mjc5MTA5MzM4MDk0N2JmYWIwZjM4MzE1NjI2YmI5ZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUzLjQwODM3MTQsLTIuOTkxNTcyNl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNzhhZTFjNWFmZjlmNDQwMDk2N2VmZmYzMmI1ZWQ4ZjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTg2ZDJlMTkyM2E5NDllMzliNGRlZDM3MWRiZjM1MTEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTIzMGY2ZWY4NzM4NDZlZmJhNjQ2N2JiMzM3ZTg3OWYgPSAkKCc8ZGl2IGlkPSJodG1sXzUyMzBmNmVmODczODQ2ZWZiYTY0NjdiYjMzN2U4NzlmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NcG93ZXIgUGVvcGxlIENJQyAoTGl2ZXJwb29sKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTg2ZDJlMTkyM2E5NDllMzliNGRlZDM3MWRiZjM1MTEuc2V0Q29udGVudChodG1sXzUyMzBmNmVmODczODQ2ZWZiYTY0NjdiYjMzN2U4NzlmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzgyNzkxMDkzMzgwOTQ3YmZhYjBmMzgzMTU2MjZiYjllLmJpbmRQb3B1cChwb3B1cF81ODZkMmUxOTIzYTk0OWUzOWI0ZGVkMzcxZGJmMzUxMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzlmYTk4ODFmNmRlNDg2MmEyZDI1MDFmN2U3NWU2Y2EgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41MDczNTA5LC0wLjEyNzc1ODNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzc4YWUxYzVhZmY5ZjQ0MDA5NjdlZmZmMzJiNWVkOGY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NhNWFjNmYxYmE4MDQxM2JiYWQzZjk3ZmQwM2Q0YjZiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzUwZDM3YTQ1NWVmNTRiNGFhY2IzMmY5N2ZhNDIxZGE2ID0gJCgnPGRpdiBpZD0iaHRtbF81MGQzN2E0NTVlZjU0YjRhYWNiMzJmOTdmYTQyMWRhNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3RyZWV0SW52ZXN0IChMb25kb24pPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jYTVhYzZmMWJhODA0MTNiYmFkM2Y5N2ZkMDNkNGI2Yi5zZXRDb250ZW50KGh0bWxfNTBkMzdhNDU1ZWY1NGI0YWFjYjMyZjk3ZmE0MjFkYTYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzlmYTk4ODFmNmRlNDg2MmEyZDI1MDFmN2U3NWU2Y2EuYmluZFBvcHVwKHBvcHVwX2NhNWFjNmYxYmE4MDQxM2JiYWQzZjk3ZmQwM2Q0YjZiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lNzM1MjAzY2M2OTQ0MzZhYjQxOGM2MmY4YWFjYzViNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjYwNDk2NzQwMDAwMDAxLC0wLjA3MjI3ODVdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzc4YWUxYzVhZmY5ZjQ0MDA5NjdlZmZmMzJiNWVkOGY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzdmZGU4M2Y3MGFkMDQxMGViNjE4NzY4MTgxZGY5MmE3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2UwZjdmZWRhZWNlMjRmZjliMTlhYjBjYzY0Mzg2OTFjID0gJCgnPGRpdiBpZD0iaHRtbF9lMGY3ZmVkYWVjZTI0ZmY5YjE5YWIwY2M2NDM4NjkxYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U21hcnQgU2Nob29sIENvdW5jaWxzIChUb3R0ZW5oYW0sIExvbmRvbik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzdmZGU4M2Y3MGFkMDQxMGViNjE4NzY4MTgxZGY5MmE3LnNldENvbnRlbnQoaHRtbF9lMGY3ZmVkYWVjZTI0ZmY5YjE5YWIwY2M2NDM4NjkxYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lNzM1MjAzY2M2OTQ0MzZhYjQxOGM2MmY4YWFjYzViNi5iaW5kUG9wdXAocG9wdXBfN2ZkZTgzZjcwYWQwNDEwZWI2MTg3NjgxODFkZjkyYTcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2VlM2E0Mjc3NWJjMjQxYzhiZTQ0ODY4N2M1ZGU3N2RhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNDQxNDU3OSwtMC4wMTE3MDA2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF83OGFlMWM1YWZmOWY0NDAwOTY3ZWZmZjMyYjVlZDhmOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jNmNlMDgyMmQzY2Y0YTc1OGQ1MGFkNjM1OTkxMThmNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wMGRhMDdjYzA0NmE0NDYwOGQzZTRkMTdlZjc1MjMzNCA9ICQoJzxkaXYgaWQ9Imh0bWxfMDBkYTA3Y2MwNDZhNDQ2MDhkM2U0ZDE3ZWY3NTIzMzQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1lbW9yeVRyYWNrcyAoTGV3aXNoYW0pPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jNmNlMDgyMmQzY2Y0YTc1OGQ1MGFkNjM1OTkxMThmNi5zZXRDb250ZW50KGh0bWxfMDBkYTA3Y2MwNDZhNDQ2MDhkM2U0ZDE3ZWY3NTIzMzQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZWUzYTQyNzc1YmMyNDFjOGJlNDQ4Njg3YzVkZTc3ZGEuYmluZFBvcHVwKHBvcHVwX2M2Y2UwODIyZDNjZjRhNzU4ZDUwYWQ2MzU5OTExOGY2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81NjZkY2U0MTk4ZDM0ODU3OWFiNzBjMzM5MzBjMDEwMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzU0LjU5NzI4NTAwMDAwMDAxLC01LjkzMDEyXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF83OGFlMWM1YWZmOWY0NDAwOTY3ZWZmZjMyYjVlZDhmOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84NjY2YTVmYjQxODc0OTc3OTc4ZWRiMjM0Y2UwYmUzMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wODgyOTUwYzRiN2E0OTE4OGNhN2RmNjNiNWQ0YjBlNiA9ICQoJzxkaXYgaWQ9Imh0bWxfMDg4Mjk1MGM0YjdhNDkxODhjYTdkZjYzYjVkNGIwZTYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZhYkxhYiBCZWxmYXN0ICAoQmVsZmFzdCApPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84NjY2YTVmYjQxODc0OTc3OTc4ZWRiMjM0Y2UwYmUzMS5zZXRDb250ZW50KGh0bWxfMDg4Mjk1MGM0YjdhNDkxODhjYTdkZjYzYjVkNGIwZTYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTY2ZGNlNDE5OGQzNDg1NzlhYjcwYzMzOTMwYzAxMDMuYmluZFBvcHVwKHBvcHVwXzg2NjZhNWZiNDE4NzQ5Nzc5NzhlZGIyMzRjZTBiZTMxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iOWI4ZGI4Y2I2MTI0MTZiOWNkMDJlNWIyYjY0NjRkZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUzLjQ4MDc1OTMsLTIuMjQyNjMwNV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNzhhZTFjNWFmZjlmNDQwMDk2N2VmZmYzMmI1ZWQ4ZjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNWUzNjM4MDAwZDY4NGUyMDlkNjM1ZDdmYzExZTg2YTQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWIyNjY3ZjljODI4NGY0ZjkwNDJmZThhZTczOGUwNTcgPSAkKCc8ZGl2IGlkPSJodG1sXzViMjY2N2Y5YzgyODRmNGY5MDQyZmU4YWU3MzhlMDU3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5RdWVlciBNZWRpYSAgKE1hbmNoZXN0ZXIgKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNWUzNjM4MDAwZDY4NGUyMDlkNjM1ZDdmYzExZTg2YTQuc2V0Q29udGVudChodG1sXzViMjY2N2Y5YzgyODRmNGY5MDQyZmU4YWU3MzhlMDU3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2I5YjhkYjhjYjYxMjQxNmI5Y2QwMmU1YjJiNjQ2NGRkLmJpbmRQb3B1cChwb3B1cF81ZTM2MzgwMDBkNjg0ZTIwOWQ2MzVkN2ZjMTFlODZhNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzJmNDhiMGM2MmViNGI5YWFhMGQ1YTJlODc1M2E5ZTkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41MDczNTA5LC0wLjEyNzc1ODNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzc4YWUxYzVhZmY5ZjQ0MDA5NjdlZmZmMzJiNWVkOGY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzljYmZlMDYzMTNhMjQwOWViMWIyODQ4ODhkODBjOWUzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg3YThhOTYxYTMzZjQ5ZTg4ODZhNDg2NTRhNzBmMzE5ID0gJCgnPGRpdiBpZD0iaHRtbF84N2E4YTk2MWEzM2Y0OWU4ODg2YTQ4NjU0YTcwZjMxOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UmVkUiBVSyAoTG9uZG9uKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOWNiZmUwNjMxM2EyNDA5ZWIxYjI4NDg4OGQ4MGM5ZTMuc2V0Q29udGVudChodG1sXzg3YThhOTYxYTMzZjQ5ZTg4ODZhNDg2NTRhNzBmMzE5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzMyZjQ4YjBjNjJlYjRiOWFhYTBkNWEyZTg3NTNhOWU5LmJpbmRQb3B1cChwb3B1cF85Y2JmZTA2MzEzYTI0MDllYjFiMjg0ODg4ZDgwYzllMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjQyN2Q0NzYxNWJkNGJiYWJjNzk3ZTVhN2I5MjYyMzUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1My4yMzUwNDgsLTEuNDIxNjI5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF83OGFlMWM1YWZmOWY0NDAwOTY3ZWZmZjMyYjVlZDhmOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mNmM2ODk3NzI1NGU0NzVkODczYmNhODYxNTllOWU0YSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lN2UxZmI3ZGI4MDU0NjQ3OGRjYjhhMWQ4ZDAzNDkyNSA9ICQoJzxkaXYgaWQ9Imh0bWxfZTdlMWZiN2RiODA1NDY0NzhkY2I4YTFkOGQwMzQ5MjUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFzaGdhdGUgSG9zcGljZWNhcmUgKENoZXN0ZXJmaWVsZCk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Y2YzY4OTc3MjU0ZTQ3NWQ4NzNiY2E4NjE1OWU5ZTRhLnNldENvbnRlbnQoaHRtbF9lN2UxZmI3ZGI4MDU0NjQ3OGRjYjhhMWQ4ZDAzNDkyNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iNDI3ZDQ3NjE1YmQ0YmJhYmM3OTdlNWE3YjkyNjIzNS5iaW5kUG9wdXAocG9wdXBfZjZjNjg5NzcyNTRlNDc1ZDg3M2JjYTg2MTU5ZTllNGEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhlNmI2YjMyNjhmNzRkZThiOTYxMmYzMDg4ZTFlYjhkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNTA3MzUwOSwtMC4xMjc3NTgzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF83OGFlMWM1YWZmOWY0NDAwOTY3ZWZmZjMyYjVlZDhmOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zMWNiNjRjMjA5MTg0NmUzOTk0N2IzZThlZTNlZjZhZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xODI5NmRiNjk1NTI0Njk5OGI5ZmQyMjdiMzg1NGMzOCA9ICQoJzxkaXYgaWQ9Imh0bWxfMTgyOTZkYjY5NTUyNDY5OThiOWZkMjI3YjM4NTRjMzgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPklubm92YXRlbWVkdGVjICAoTG9uZG9uKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzFjYjY0YzIwOTE4NDZlMzk5NDdiM2U4ZWUzZWY2YWYuc2V0Q29udGVudChodG1sXzE4Mjk2ZGI2OTU1MjQ2OTk4YjlmZDIyN2IzODU0YzM4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzhlNmI2YjMyNjhmNzRkZThiOTYxMmYzMDg4ZTFlYjhkLmJpbmRQb3B1cChwb3B1cF8zMWNiNjRjMjA5MTg0NmUzOTk0N2IzZThlZTNlZjZhZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTgxNjIxNjFlOWY1NDk1Y2I2MTRmNjk4NDk1YzBjZWEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1NC41OTcyODUwMDAwMDAwMSwtNS45MzAxMl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNzhhZTFjNWFmZjlmNDQwMDk2N2VmZmYzMmI1ZWQ4ZjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjQyNzVkZTYxYWZlNDM4NGEwMzQ3YmE5ZjgwMGRjYTQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjA4YWJjYjgzYmNkNGQzMmE1Yjk2MDJhOGRhY2NiZjkgPSAkKCc8ZGl2IGlkPSJodG1sXzYwOGFiY2I4M2JjZDRkMzJhNWI5NjAyYThkYWNjYmY5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FeHRlcm4gV29ya3MgKEJlbGZhc3QsIE4uSXJlbGFuZCxVSyk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzI0Mjc1ZGU2MWFmZTQzODRhMDM0N2JhOWY4MDBkY2E0LnNldENvbnRlbnQoaHRtbF82MDhhYmNiODNiY2Q0ZDMyYTViOTYwMmE4ZGFjY2JmOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lODE2MjE2MWU5ZjU0OTVjYjYxNGY2OTg0OTVjMGNlYS5iaW5kUG9wdXAocG9wdXBfMjQyNzVkZTYxYWZlNDM4NGEwMzQ3YmE5ZjgwMGRjYTQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzUxNmE2M2E3NWRiOTQ2ZWQ5Y2NhYzkwZWIxOWM0ZmE4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNTI1NTE2MiwwLjAzNTIxNjNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzc4YWUxYzVhZmY5ZjQ0MDA5NjdlZmZmMzJiNWVkOGY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U2ZDdhZTM1YzYyNjQwOTY5MDQ5YzkxNzU3ZWY3NWI4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFjZTEzMmVlM2JhODRlOTRhOWUxNzdkZjM2MDNjZmYyID0gJCgnPGRpdiBpZD0iaHRtbF8xY2UxMzJlZTNiYTg0ZTk0YTllMTc3ZGYzNjAzY2ZmMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QXN0b24tTWFuc2ZpZWxkIChMb25kb24gQm9yb3VnaCBvZiBOZXdoYW0pPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lNmQ3YWUzNWM2MjY0MDk2OTA0OWM5MTc1N2VmNzViOC5zZXRDb250ZW50KGh0bWxfMWNlMTMyZWUzYmE4NGU5NGE5ZTE3N2RmMzYwM2NmZjIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTE2YTYzYTc1ZGI5NDZlZDljY2FjOTBlYjE5YzRmYTguYmluZFBvcHVwKHBvcHVwX2U2ZDdhZTM1YzYyNjQwOTY5MDQ5YzkxNzU3ZWY3NWI4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83ODgxYTkxZmRhOTA0NDkzOTRiZDAxMzljYTk1YmQwNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzU0LjU3NDIyNywtMS4yMzQ5NTZdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzc4YWUxYzVhZmY5ZjQ0MDA5NjdlZmZmMzJiNWVkOGY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU4MDlmYTcxMjMzMDRhY2I5M2ZjMWM5YjViYTUwNTgyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzI3MDM5ODNhY2UxYjQ4MGU5MmZlYTRlNzk3YTY2YzQzID0gJCgnPGRpdiBpZD0iaHRtbF8yNzAzOTgzYWNlMWI0ODBlOTJmZWE0ZTc5N2E2NmM0MyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SGFsbyBQcm9qZWN0IENoYXJpdHkgIChNaWRkbGVzYnJvdWdoKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTgwOWZhNzEyMzMwNGFjYjkzZmMxYzliNWJhNTA1ODIuc2V0Q29udGVudChodG1sXzI3MDM5ODNhY2UxYjQ4MGU5MmZlYTRlNzk3YTY2YzQzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzc4ODFhOTFmZGE5MDQ0OTM5NGJkMDEzOWNhOTViZDA2LmJpbmRQb3B1cChwb3B1cF81ODA5ZmE3MTIzMzA0YWNiOTNmYzFjOWI1YmE1MDU4Mik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfM2MxZjMyY2VjODFkNGFiM2FlNTE2YzNlM2ZhY2EyYzMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MC43MTkxNjQsLTEuODgwNzY5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF83OGFlMWM1YWZmOWY0NDAwOTY3ZWZmZjMyYjVlZDhmOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83NjhiOTE4NDUzNDM0ZmQ3YjgwYjg4YjZlNjBjNWFmNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84NTRiMGJiZjE5M2I0Y2VkYjk5NzZkMDM4OTVjZmE2YSA9ICQoJzxkaXYgaWQ9Imh0bWxfODU0YjBiYmYxOTNiNGNlZGI5OTc2ZDAzODk1Y2ZhNmEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkhvcGUgSG9wZSBIb3VzaW5nLCBUcmFpbmluZyBhbmQgU3VwcG9ydCBMVEQgKEJvdXJuZW1vdXRoICZhbXA7IFBvb2xlIChEb3JzZXQpKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzY4YjkxODQ1MzQzNGZkN2I4MGI4OGI2ZTYwYzVhZjYuc2V0Q29udGVudChodG1sXzg1NGIwYmJmMTkzYjRjZWRiOTk3NmQwMzg5NWNmYTZhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzNjMWYzMmNlYzgxZDRhYjNhZTUxNmMzZTNmYWNhMmMzLmJpbmRQb3B1cChwb3B1cF83NjhiOTE4NDUzNDM0ZmQ3YjgwYjg4YjZlNjBjNWFmNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMGI2ZTM4YTBiM2Y0NGExN2EwNDVmZWQ2ZjUzZTkyZmQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1Mi4wNjI5MDA5LC0xLjMzOTc3NV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNzhhZTFjNWFmZjlmNDQwMDk2N2VmZmYzMmI1ZWQ4ZjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjJmODIyNDE2ZjdhNGVhOGIxYzRlYWE3YTJjMjQzOTMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTc1ZDdkM2MwNDg5NDRjMGJlODdjZTk4ZjI4MWY4MzEgPSAkKCc8ZGl2IGlkPSJodG1sX2U3NWQ3ZDNjMDQ4OTQ0YzBiZTg3Y2U5OGYyODFmODMxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BZG9wdGlvbiBVSyAoQmFuYnVyeSk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2YyZjgyMjQxNmY3YTRlYThiMWM0ZWFhN2EyYzI0MzkzLnNldENvbnRlbnQoaHRtbF9lNzVkN2QzYzA0ODk0NGMwYmU4N2NlOThmMjgxZjgzMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wYjZlMzhhMGIzZjQ0YTE3YTA0NWZlZDZmNTNlOTJmZC5iaW5kUG9wdXAocG9wdXBfZjJmODIyNDE2ZjdhNGVhOGIxYzRlYWE3YTJjMjQzOTMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2E5ZjhmNjllYmEwYjRkMjg4MWU1OWM5MjU2YWJiODY2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNTA3MzUwOSwtMC4xMjc3NTgzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF83OGFlMWM1YWZmOWY0NDAwOTY3ZWZmZjMyYjVlZDhmOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jYzQwNzk1MzIzNDU0ZmY5ODkyY2IwMjNhMWI5ZmNhZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jZTk5MTFlMDE5NGM0NjNlYTc5OGY3Y2IwZDQ3OTg5NCA9ICQoJzxkaXYgaWQ9Imh0bWxfY2U5OTExZTAxOTRjNDYzZWE3OThmN2NiMGQ0Nzk4OTQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNvY2lhbCBMaWZlIChMb25kb24pPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jYzQwNzk1MzIzNDU0ZmY5ODkyY2IwMjNhMWI5ZmNhZC5zZXRDb250ZW50KGh0bWxfY2U5OTExZTAxOTRjNDYzZWE3OThmN2NiMGQ0Nzk4OTQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTlmOGY2OWViYTBiNGQyODgxZTU5YzkyNTZhYmI4NjYuYmluZFBvcHVwKHBvcHVwX2NjNDA3OTUzMjM0NTRmZjk4OTJjYjAyM2ExYjlmY2FkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82OTVjYTdmMTg4ODg0N2UzYmFiYjk5ZTZmMTFjYThlOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjUwNzM1MDksLTAuMTI3NzU4M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNzhhZTFjNWFmZjlmNDQwMDk2N2VmZmYzMmI1ZWQ4ZjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDBmOGIyODI1MjFjNDFlNjg3N2JmNzUzYTNkOGE3MDQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGUzNDFlMmRmNGZjNDkyODgyNzk0OTI1NDA0NWE1ZTUgPSAkKCc8ZGl2IGlkPSJodG1sXzhlMzQxZTJkZjRmYzQ5Mjg4Mjc5NDkyNTQwNDVhNWU1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MaXR0bGUgQW5nZWwgVGhlYXRyZSAoTG9uZG9uKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDBmOGIyODI1MjFjNDFlNjg3N2JmNzUzYTNkOGE3MDQuc2V0Q29udGVudChodG1sXzhlMzQxZTJkZjRmYzQ5Mjg4Mjc5NDkyNTQwNDVhNWU1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzY5NWNhN2YxODg4ODQ3ZTNiYWJiOTllNmYxMWNhOGU5LmJpbmRQb3B1cChwb3B1cF8wMGY4YjI4MjUyMWM0MWU2ODc3YmY3NTNhM2Q4YTcwNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzc3Y2YwNmY3OThkNDY5YmFmNzBlZWRmZDg4Y2ExOGYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41NDY1MDYzLC0wLjEwNTgwNThdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzc4YWUxYzVhZmY5ZjQ0MDA5NjdlZmZmMzJiNWVkOGY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzI0N2Y4ZDdjNWNiZDQxMzZhMTM4MzllYWZkYWE2NjRlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NmZDI5NmIwODQxNTQxNWFiNmYwNWRhMmQzMTkwM2Y2ID0gJCgnPGRpdiBpZD0iaHRtbF9jZmQyOTZiMDg0MTU0MTVhYjZmMDVkYTJkMzE5MDNmNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SGVscCBvbiBZb3VyIERvb3JzdGVwIChJc2xpbmd0b24sIExvbmRvbik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzI0N2Y4ZDdjNWNiZDQxMzZhMTM4MzllYWZkYWE2NjRlLnNldENvbnRlbnQoaHRtbF9jZmQyOTZiMDg0MTU0MTVhYjZmMDVkYTJkMzE5MDNmNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zNzdjZjA2Zjc5OGQ0NjliYWY3MGVlZGZkODhjYTE4Zi5iaW5kUG9wdXAocG9wdXBfMjQ3ZjhkN2M1Y2JkNDEzNmExMzgzOWVhZmRhYTY2NGUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNjZTYxYWE2Mjc4NDQ3ZmRhMTYxMGI1NGEzMjFlMzVjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTMuNDgwNzU5MywtMi4yNDI2MzA1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF83OGFlMWM1YWZmOWY0NDAwOTY3ZWZmZjMyYjVlZDhmOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hMjA4OTg5YWNlZmQ0MTIxYjY2Zjg1MGFmNDE2MzJkZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83YTFlNzFmYzRmZmU0NWY2YjRhNTdkNmRhYzkyYWU2YSA9ICQoJzxkaXYgaWQ9Imh0bWxfN2ExZTcxZmM0ZmZlNDVmNmI0YTU3ZDZkYWM5MmFlNmEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkhlbnNoYXdzIFNvY2lldHkgZm9yIEJsaW5kIFBlb3BsZSAoTWFuY2hlc3Rlcik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2EyMDg5ODlhY2VmZDQxMjFiNjZmODUwYWY0MTYzMmRkLnNldENvbnRlbnQoaHRtbF83YTFlNzFmYzRmZmU0NWY2YjRhNTdkNmRhYzkyYWU2YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zY2U2MWFhNjI3ODQ0N2ZkYTE2MTBiNTRhMzIxZTM1Yy5iaW5kUG9wdXAocG9wdXBfYTIwODk4OWFjZWZkNDEyMWI2NmY4NTBhZjQxNjMyZGQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2E1NzY0Yjk2OWMzZjQwODRhZmI3ZTNlOGI5NzY5Nzc0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTQuMTc1MTAyNCwtNi4zNDAyMjk5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF83OGFlMWM1YWZmOWY0NDAwOTY3ZWZmZjMyYjVlZDhmOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hZmRhNTQ0MTA5ZGQ0MTZiYWY2ZWMyZGE5MmIxMzYwMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jMzg5NDdhM2U4MjI0ODNlOGNkYzJmMTY1ODdlNWI2NyA9ICQoJzxkaXYgaWQ9Imh0bWxfYzM4OTQ3YTNlODIyNDgzZThjZGMyZjE2NTg3ZTViNjciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlVucmVwb3J0ZWQuV29ybGQgQ29tbXVuaXR5IEludGVyZXN0IENvIChOZXdyeSk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2FmZGE1NDQxMDlkZDQxNmJhZjZlYzJkYTkyYjEzNjAyLnNldENvbnRlbnQoaHRtbF9jMzg5NDdhM2U4MjI0ODNlOGNkYzJmMTY1ODdlNWI2Nyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hNTc2NGI5NjljM2Y0MDg0YWZiN2UzZThiOTc2OTc3NC5iaW5kUG9wdXAocG9wdXBfYWZkYTU0NDEwOWRkNDE2YmFmNmVjMmRhOTJiMTM2MDIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2U3MjU1MDY2ZmYxNzQzZmQ5ZTJkNjg1Y2IwYzc5MTE1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTMuNDk2MTE1LC0yLjUxODcyN10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNzhhZTFjNWFmZjlmNDQwMDk2N2VmZmYzMmI1ZWQ4ZjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGJkMzg0MDNlOWNiNGQyYWFlOWEwZGJiODRlODIxNjQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTljZjU5MjJiYjY5NDJlMWJlMDRhYjE5Njc0NmM1MDkgPSAkKCc8ZGl2IGlkPSJodG1sXzU5Y2Y1OTIyYmI2OTQyZTFiZTA0YWIxOTY3NDZjNTA5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5UaGUgQmxhaXIgUHJvamVjdCAoTGVpZ2gpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wYmQzODQwM2U5Y2I0ZDJhYWU5YTBkYmI4NGU4MjE2NC5zZXRDb250ZW50KGh0bWxfNTljZjU5MjJiYjY5NDJlMWJlMDRhYjE5Njc0NmM1MDkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZTcyNTUwNjZmZjE3NDNmZDllMmQ2ODVjYjBjNzkxMTUuYmluZFBvcHVwKHBvcHVwXzBiZDM4NDAzZTljYjRkMmFhZTlhMGRiYjg0ZTgyMTY0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82M2FiNmRlZGQ5OTM0YzIzOGM3ODI5ZTAxMGFjNGY0YiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUzLjc0NTY3MDksLTAuMzM2NzQxM10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNzhhZTFjNWFmZjlmNDQwMDk2N2VmZmYzMmI1ZWQ4ZjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODY1Y2I1ZGJmYzJiNDA1ZDk0YTIxM2ZkYWI1ODJhNGMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjA0MGY2ODMyYTc2NDE4NmIzNzBjYTZlNzljZjdmOTUgPSAkKCc8ZGl2IGlkPSJodG1sX2IwNDBmNjgzMmE3NjQxODZiMzcwY2E2ZTc5Y2Y3Zjk1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Vbml2ZXJzaXR5IG9mIEh1bGwgKEh1bGwpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84NjVjYjVkYmZjMmI0MDVkOTRhMjEzZmRhYjU4MmE0Yy5zZXRDb250ZW50KGh0bWxfYjA0MGY2ODMyYTc2NDE4NmIzNzBjYTZlNzljZjdmOTUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjNhYjZkZWRkOTkzNGMyMzhjNzgyOWUwMTBhYzRmNGIuYmluZFBvcHVwKHBvcHVwXzg2NWNiNWRiZmMyYjQwNWQ5NGEyMTNmZGFiNTgyYTRjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lZTc3M2Y5NTliMTk0MmQ1YTVjZTEwYzY2MjFkZGFiNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjUwNzM1MDksLTAuMTI3NzU4M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNzhhZTFjNWFmZjlmNDQwMDk2N2VmZmYzMmI1ZWQ4ZjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmI0ZjE0YWVmMGQ3NGY3ZTg2NDY1Y2MwMWZlZmI2YTcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2QyZDE0ZGVjOTAyNDg2YThlN2EwYTM2Yjk5ZmJhYzAgPSAkKCc8ZGl2IGlkPSJodG1sXzNkMmQxNGRlYzkwMjQ4NmE4ZTdhMGEzNmI5OWZiYWMwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DYW1wYWlnbiBBY2FkZW15IChMb25kb24pPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82YjRmMTRhZWYwZDc0ZjdlODY0NjVjYzAxZmVmYjZhNy5zZXRDb250ZW50KGh0bWxfM2QyZDE0ZGVjOTAyNDg2YThlN2EwYTM2Yjk5ZmJhYzApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZWU3NzNmOTU5YjE5NDJkNWE1Y2UxMGM2NjIxZGRhYjQuYmluZFBvcHVwKHBvcHVwXzZiNGYxNGFlZjBkNzRmN2U4NjQ2NWNjMDFmZWZiNmE3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yOThiOWY3OTA5NWQ0MzQ1OGVmOWI0ZmRkMTIyYmJhYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUzLjQ4MDc1OTMsLTIuMjQyNjMwNV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNzhhZTFjNWFmZjlmNDQwMDk2N2VmZmYzMmI1ZWQ4ZjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzE0MmZiZWM5NmUwNDk3OGE0NDE0MDY3ZWZiMmNiOGMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZGU2ZDMzNjk3YmM4NDQ3OGE5ZGQwYmE2MWE1NGU3N2EgPSAkKCc8ZGl2IGlkPSJodG1sX2RlNmQzMzY5N2JjODQ0NzhhOWRkMGJhNjFhNTRlNzdhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GaXJzdCBBc2lhbiBTdXBwb3J0IFRydXN0IChGQVNUKSAoTWFuY2hlc3Rlcik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzcxNDJmYmVjOTZlMDQ5NzhhNDQxNDA2N2VmYjJjYjhjLnNldENvbnRlbnQoaHRtbF9kZTZkMzM2OTdiYzg0NDc4YTlkZDBiYTYxYTU0ZTc3YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yOThiOWY3OTA5NWQ0MzQ1OGVmOWI0ZmRkMTIyYmJhYy5iaW5kUG9wdXAocG9wdXBfNzE0MmZiZWM5NmUwNDk3OGE0NDE0MDY3ZWZiMmNiOGMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2MwMzU1NWNjNTMxYjQ5MzZiYzZlOTgwODIyYmY3ZGI5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTMuNDgwNzU5MywtMi4yNDI2MzA1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF83OGFlMWM1YWZmOWY0NDAwOTY3ZWZmZjMyYjVlZDhmOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84ODY5ZGQwZDVkODc0ODAzYTQwZjcyZTFmM2Y2YzlmZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85Y2MyNTg0ODI2MTE0MmViODAxNjc4NzBmMzNkNjFmNyA9ICQoJzxkaXYgaWQ9Imh0bWxfOWNjMjU4NDgyNjExNDJlYjgwMTY3ODcwZjMzZDYxZjciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlRlY2ggRm9yIEdvb2QgTGl2ZSAoTWFuY2hlc3Rlcik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg4NjlkZDBkNWQ4NzQ4MDNhNDBmNzJlMWYzZjZjOWZmLnNldENvbnRlbnQoaHRtbF85Y2MyNTg0ODI2MTE0MmViODAxNjc4NzBmMzNkNjFmNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jMDM1NTVjYzUzMWI0OTM2YmM2ZTk4MDgyMmJmN2RiOS5iaW5kUG9wdXAocG9wdXBfODg2OWRkMGQ1ZDg3NDgwM2E0MGY3MmUxZjNmNmM5ZmYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGxheWVyX2NvbnRyb2xfYjBmMTFlMjAzOGNkNDRhN2JjNWFmNjhjZjM3NjJlZjYgPSB7CiAgICAgICAgICAgICAgICBiYXNlX2xheWVycyA6IHsgInN0YW1lbnRvbmVyIiA6IHRpbGVfbGF5ZXJfZmVhMDVmNDJlYTZmNDdlY2FjNDA4ZWY4OTE1MzMzNzgsIH0sCiAgICAgICAgICAgICAgICBvdmVybGF5cyA6IHsgIkZ1bmRlZCIgOiBmZWF0dXJlX2dyb3VwXzdlMDU0YTYxMDhkNzRlNDg4YjEzZDZlYTNlYTgyMTgxLCJVbnN1Y2Nlc3NmdWwgLSBsb25nbGlzdGVkIiA6IGZlYXR1cmVfZ3JvdXBfYmUwZDI1NWI5YzFlNDg1ZTg3YjU0ZjI3MGE1YjY4MDAsIlVuc3VjY2Vzc2Z1bCIgOiBmZWF0dXJlX2dyb3VwXzc4YWUxYzVhZmY5ZjQ0MDA5NjdlZmZmMzJiNWVkOGY5LCB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICBMLmNvbnRyb2wubGF5ZXJzKAogICAgICAgICAgICAgICAgbGF5ZXJfY29udHJvbF9iMGYxMWUyMDM4Y2Q0NGE3YmM1YWY2OGNmMzc2MmVmNi5iYXNlX2xheWVycywKICAgICAgICAgICAgICAgIGxheWVyX2NvbnRyb2xfYjBmMTFlMjAzOGNkNDRhN2JjNWFmNjhjZjM3NjJlZjYub3ZlcmxheXMsCiAgICAgICAgICAgICAgICB7cG9zaXRpb246ICd0b3ByaWdodCcsCiAgICAgICAgICAgICAgICAgY29sbGFwc2VkOiB0cnVlLAogICAgICAgICAgICAgICAgIGF1dG9aSW5kZXg6IHRydWUKICAgICAgICAgICAgICAgIH0pLmFkZFRvKG1hcF82YzI3ZjdkOWMzMmI0NDVlYTQyMzM5ZmQ1ZDAxODBlZik7CiAgICAgICAgCjwvc2NyaXB0Pg=="
          style="height:600px;width: 100%;border:none !important;" allowfullscreen="" webkitallowfullscreen="" mozallowfullscreen="">

Technology used

Each application was tagged with the technology that was outlined in the application. This was a difficult judgement to make: the nature of many of the applications and the stage of their development meant that the specific technology to be used
          was often not clear or not yet decided. Many applications described their project in general terms as an "app" or "website", without going into specifics. In the case of those projects describing a website or app, no applicants mentioned specific
          technologies (eg languages, frameworks). In general, when using the word "app" applicants did not specifically mean a mobile phone app.

Applications using particular technologies

          <iframe src="data:text/html;base64,DQogICAgICAgIDwhLS0gTG9hZCBDaGFydHMuanMgLS0+DQogICAgICAgPHNjcmlwdCBzcmM9J2h0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL0NoYXJ0LmpzLzIuNS4wL0NoYXJ0LmJ1bmRsZS5taW4uanMnPjwvc2NyaXB0Pg0KICAgIA0KICAgICAgICA8Y2FudmFzIGlkPSdjaGFydF90ZWNoJz48L2NhbnZhcz4NCiAgICAgICAgPHNjcmlwdD4NCiAgICAgICAgICAgIHZhciBjdHggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2hhcnRfdGVjaCcpLmdldENvbnRleHQoJzJkJyk7DQogICAgICAgICAgICBjdHguY2FudmFzLndpZHRoICA9IDgwMCAtICguMSAqIDgwMCk7DQogICAgICAgICAgICBjdHguY2FudmFzLmhlaWdodCA9IDUwMCAtICguMTUgKiA1MDApOw0KICAgICAgICAgICAgdmFyIG15TmV3Q2hhcnQgPSBuZXcgQ2hhcnQoY3R4LHsgdHlwZTogJ2hvcml6b250YWxCYXInLCBkYXRhOiB7DQogICAgJ2xhYmVscyc6IFsNCiAgICAgICAgJ0FwcCcsDQogICAgICAgICdXZWJzaXRlJywNCiAgICAgICAgJ0RpcmVjdG9yeScsDQogICAgICAgICdTaGFyaW5nJywNCiAgICAgICAgJ0hhcmR3YXJlJywNCiAgICAgICAgJ0NoYXQnLA0KICAgICAgICAnU29jaWFsIG1lZGlhJywNCiAgICAgICAgJ09wZW4gc291cmNlJywNCiAgICAgICAgJ0RhdGEgZ2F0aGVyaW5nJywNCiAgICAgICAgJ0NvbnRlbnQnDQogICAgXSwNCiAgICAnZGF0YXNldHMnOiBbDQogICAgICAgIHsNCiAgICAgICAgICAgICdsYWJlbCc6ICdVbnN1Y2Nlc3NmdWwnLA0KICAgICAgICAgICAgJ2JhY2tncm91bmRDb2xvcic6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLA0KICAgICAgICAgICAgJ2RhdGEnOiBbDQogICAgICAgICAgICAgICAgMjYuMCwNCiAgICAgICAgICAgICAgICAyMi4wLA0KICAgICAgICAgICAgICAgIDcuMCwNCiAgICAgICAgICAgICAgICA2LjAsDQogICAgICAgICAgICAgICAgNi4wLA0KICAgICAgICAgICAgICAgIDUuMCwNCiAgICAgICAgICAgICAgICA1LjAsDQogICAgICAgICAgICAgICAgMy4wLA0KICAgICAgICAgICAgICAgIDUuMCwNCiAgICAgICAgICAgICAgICA2LjANCiAgICAgICAgICAgIF0NCiAgICAgICAgfSwNCiAgICAgICAgew0KICAgICAgICAgICAgJ2xhYmVsJzogJ1Vuc3VjY2Vzc2Z1bCAtIGxvbmdsaXN0ZWQnLA0KICAgICAgICAgICAgJ2JhY2tncm91bmRDb2xvcic6ICdyZ2IoMCwgMTI4LCAxNTYpJywNCiAgICAgICAgICAgICdkYXRhJzogWw0KICAgICAgICAgICAgICAgIDE4LjAsDQogICAgICAgICAgICAgICAgMi4wLA0KICAgICAgICAgICAgICAgIDMuMCwNCiAgICAgICAgICAgICAgICA0LjAsDQogICAgICAgICAgICAgICAgMS4wLA0KICAgICAgICAgICAgICAgIDIuMCwNCiAgICAgICAgICAgICAgICAyLjAsDQogICAgICAgICAgICAgICAgMy4wLA0KICAgICAgICAgICAgICAgIDEuMCwNCiAgICAgICAgICAgICAgICAxLjANCiAgICAgICAgICAgIF0NCiAgICAgICAgfSwNCiAgICAgICAgew0KICAgICAgICAgICAgJ2xhYmVsJzogJ0Z1bmRlZCcsDQogICAgICAgICAgICAnYmFja2dyb3VuZENvbG9yJzogJ3JnYigyMzQsNzcsOTQpJywNCiAgICAgICAgICAgICdkYXRhJzogWw0KICAgICAgICAgICAgICAgIDQuMCwNCiAgICAgICAgICAgICAgICAxLjAsDQogICAgICAgICAgICAgICAgMC4wLA0KICAgICAgICAgICAgICAgIDAuMCwNCiAgICAgICAgICAgICAgICAxLjAsDQogICAgICAgICAgICAgICAgMS4wLA0KICAgICAgICAgICAgICAgIDAuMCwNCiAgICAgICAgICAgICAgICAxLjAsDQogICAgICAgICAgICAgICAgMS4wLA0KICAgICAgICAgICAgICAgIDAuMA0KICAgICAgICAgICAgXQ0KICAgICAgICB9DQogICAgXQ0KfSwgb3B0aW9uczogew0KICAgICdzY2FsZXMnOiB7DQogICAgICAgICd4QXhlcyc6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAnZ3JpZExpbmVzJzogew0KICAgICAgICAgICAgICAgICAgICAnZGlzcGxheSc6IGZhbHNlLA0KICAgICAgICAgICAgICAgICAgICAnZHJhd0JvcmRlcic6IHRydWUNCiAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgICd0aWNrcyc6IHsNCiAgICAgICAgICAgICAgICAgICAgJ2ZvbnRGYW1pbHknOiAnXCdSb2JvdG9cJyxzYW5zLXNlcmlmJywNCiAgICAgICAgICAgICAgICAgICAgJ2ZvbnRTaXplJzogMjAsDQogICAgICAgICAgICAgICAgICAgICdtaW4nOiAwDQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAnc3RhY2tlZCc6IHRydWUNCiAgICAgICAgICAgIH0NCiAgICAgICAgXSwNCiAgICAgICAgJ3lBeGVzJzogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICdncmlkTGluZXMnOiB7DQogICAgICAgICAgICAgICAgICAgICdkaXNwbGF5JzogZmFsc2UsDQogICAgICAgICAgICAgICAgICAgICdkcmF3Qm9yZGVyJzogZmFsc2UNCiAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgICd0aWNrcyc6IHsNCiAgICAgICAgICAgICAgICAgICAgJ2ZvbnRGYW1pbHknOiAnXCdSb2JvdG9cJyxzYW5zLXNlcmlmJywNCiAgICAgICAgICAgICAgICAgICAgJ2ZvbnRTaXplJzogMjANCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIF0NCiAgICB9LA0KICAgICdsZWdlbmQnOiB7DQogICAgICAgICdsYWJlbHMnOiB7DQogICAgICAgICAgICAnZm9udEZhbWlseSc6ICdcJ1JvYm90b1wnLHNhbnMtc2VyaWYnLA0KICAgICAgICAgICAgJ2ZvbnRTaXplJzogMTYNCiAgICAgICAgfSwNCiAgICAgICAgJ3Bvc2l0aW9uJzogJ2JvdHRvbScNCiAgICB9LA0KICAgICdyZXNwb25zaXZlJzogZmFsc2UNCn0gfSk7DQogICAgICAgIDwvc2NyaXB0Pg0KICAgIA=="
          style="height:600px;width: 100%;border:none !important;" allowfullscreen="" webkitallowfullscreen="" mozallowfullscreen="">

Tags were applied to all 141 applications, with 51 applications having one tag applied and 90 having more than one. The most used tag was "app", which was applied to 48 applications, followed by "website" (25), "sharing" (10) and "directory" (10).
          8 applications involved using hardware, while 7 used social media.

              Unsuccessful
              Unsuccessful - longlisted
              Funded
              All

              app
              26
              18
              4
              48

              website
              22
              2
              1
              25

              directory
              7
              3
              0
              10

              sharing
              6
              4
              0
              10

              hardware
              6
              1
              1
              8

              chat
              5
              2
              1
              8

              social media
              5
              2
              0
              7

              open source
              3
              3
              1
              7

              data gathering
              5
              1
              1
              7

              content
              6
              1
              0
              7

              mobile app
              3
              2
              0
              5

              video
              4
              1
              0
              5

              online community
              3
              1
              0
              4

              webinars
              4
              0
              0
              4

              game
              2
              0
              1
              3

              smart card
              0
              2
              1
              3

              text message
              3
              0
              0
              3

              web app
              2
              1
              0
              3

              media
              3
              0
              0
              3

              tablet
              3
              0
              0
              3

Types of approach

A better approach for understanding applicants' intentions is to look at the approach they are taking in the work. These are focused on what the technology will actually do: provide information to users, provide an actual service, or connect with
          other users.

Approaches used by applications

          <iframe src="data:text/html;base64,DQogICAgICAgIDwhLS0gTG9hZCBDaGFydHMuanMgLS0+DQogICAgICAgPHNjcmlwdCBzcmM9J2h0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL0NoYXJ0LmpzLzIuNS4wL0NoYXJ0LmJ1bmRsZS5taW4uanMnPjwvc2NyaXB0Pg0KICAgIA0KICAgICAgICA8Y2FudmFzIGlkPSdjaGFydF9hcHByb2FjaGVzJz48L2NhbnZhcz4NCiAgICAgICAgPHNjcmlwdD4NCiAgICAgICAgICAgIHZhciBjdHggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2hhcnRfYXBwcm9hY2hlcycpLmdldENvbnRleHQoJzJkJyk7DQogICAgICAgICAgICBjdHguY2FudmFzLndpZHRoICA9IDgwMCAtICguMSAqIDgwMCk7DQogICAgICAgICAgICBjdHguY2FudmFzLmhlaWdodCA9IDUwMCAtICguMTUgKiA1MDApOw0KICAgICAgICAgICAgdmFyIG15TmV3Q2hhcnQgPSBuZXcgQ2hhcnQoY3R4LHsgdHlwZTogJ2hvcml6b250YWxCYXInLCBkYXRhOiB7DQogICAgJ2xhYmVscyc6IFsNCiAgICAgICAgJ1Byb3ZpZGluZyBpbmZvcm1hdGlvbicsDQogICAgICAgICdBZHZpY2UnLA0KICAgICAgICAnUHJvdmlkaW5nIHNlcnZpY2VzJywNCiAgICAgICAgJ1RyYWluaW5nJywNCiAgICAgICAgJ1BlZXIgc3VwcG9ydCcsDQogICAgICAgICdFZHVjYXRpb24nLA0KICAgICAgICAnRmluZGluZyBvcHBvcnR1bml0aWVzJywNCiAgICAgICAgJ0xlYXJuaW5nJywNCiAgICAgICAgJ0ZpbmRpbmcgc2VydmljZXMnLA0KICAgICAgICAnUHJvdmlkaW5nIHN1cHBvcnQnLA0KICAgICAgICAnU2tpbGxzJywNCiAgICAgICAgJ1NlbGYtYXNzZXNzbWVudCcsDQogICAgICAgICdSZXBvcnRpbmcnLA0KICAgICAgICAnT3JnYW5pc2F0aW9uJywNCiAgICAgICAgJ0RpcmVjdG9yeScNCiAgICBdLA0KICAgICdkYXRhc2V0cyc6IFsNCiAgICAgICAgew0KICAgICAgICAgICAgJ2xhYmVsJzogJ0Z1bmRlZCcsDQogICAgICAgICAgICAnYmFja2dyb3VuZENvbG9yJzogJ3JnYigyMzQsNzcsOTQpJywNCiAgICAgICAgICAgICdkYXRhJzogWw0KICAgICAgICAgICAgICAgIDEuMCwNCiAgICAgICAgICAgICAgICAzLjAsDQogICAgICAgICAgICAgICAgMy4wLA0KICAgICAgICAgICAgICAgIDEuMCwNCiAgICAgICAgICAgICAgICAxLjAsDQogICAgICAgICAgICAgICAgMS4wLA0KICAgICAgICAgICAgICAgIDAuMCwNCiAgICAgICAgICAgICAgICAwLjAsDQogICAgICAgICAgICAgICAgMS4wLA0KICAgICAgICAgICAgICAgIDAuMCwNCiAgICAgICAgICAgICAgICAwLjAsDQogICAgICAgICAgICAgICAgMC4wLA0KICAgICAgICAgICAgICAgIDAuMCwNCiAgICAgICAgICAgICAgICAwLjAsDQogICAgICAgICAgICAgICAgMC4wDQogICAgICAgICAgICBdDQogICAgICAgIH0sDQogICAgICAgIHsNCiAgICAgICAgICAgICdsYWJlbCc6ICdVbnN1Y2Nlc3NmdWwnLA0KICAgICAgICAgICAgJ2JhY2tncm91bmRDb2xvcic6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLA0KICAgICAgICAgICAgJ2RhdGEnOiBbDQogICAgICAgICAgICAgICAgMjMuMCwNCiAgICAgICAgICAgICAgICAxNi4wLA0KICAgICAgICAgICAgICAgIDEzLjAsDQogICAgICAgICAgICAgICAgMTIuMCwNCiAgICAgICAgICAgICAgICA5LjAsDQogICAgICAgICAgICAgICAgOC4wLA0KICAgICAgICAgICAgICAgIDQuMCwNCiAgICAgICAgICAgICAgICA1LjAsDQogICAgICAgICAgICAgICAgMi4wLA0KICAgICAgICAgICAgICAgIDQuMCwNCiAgICAgICAgICAgICAgICAyLjAsDQogICAgICAgICAgICAgICAgMS4wLA0KICAgICAgICAgICAgICAgIDEuMCwNCiAgICAgICAgICAgICAgICAxLjAsDQogICAgICAgICAgICAgICAgMi4wDQogICAgICAgICAgICBdDQogICAgICAgIH0sDQogICAgICAgIHsNCiAgICAgICAgICAgICdsYWJlbCc6ICdVbnN1Y2Nlc3NmdWwgLSBsb25nbGlzdGVkJywNCiAgICAgICAgICAgICdiYWNrZ3JvdW5kQ29sb3InOiAncmdiKDAsIDEyOCwgMTU2KScsDQogICAgICAgICAgICAnZGF0YSc6IFsNCiAgICAgICAgICAgICAgICA2LjAsDQogICAgICAgICAgICAgICAgNS4wLA0KICAgICAgICAgICAgICAgIDcuMCwNCiAgICAgICAgICAgICAgICAwLjAsDQogICAgICAgICAgICAgICAgMy4wLA0KICAgICAgICAgICAgICAgIDEuMCwNCiAgICAgICAgICAgICAgICA0LjAsDQogICAgICAgICAgICAgICAgMi4wLA0KICAgICAgICAgICAgICAgIDQuMCwNCiAgICAgICAgICAgICAgICAxLjAsDQogICAgICAgICAgICAgICAgMi4wLA0KICAgICAgICAgICAgICAgIDEuMCwNCiAgICAgICAgICAgICAgICAxLjAsDQogICAgICAgICAgICAgICAgMS4wLA0KICAgICAgICAgICAgICAgIDAuMA0KICAgICAgICAgICAgXQ0KICAgICAgICB9DQogICAgXQ0KfSwgb3B0aW9uczogew0KICAgICdzY2FsZXMnOiB7DQogICAgICAgICd4QXhlcyc6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAnZ3JpZExpbmVzJzogew0KICAgICAgICAgICAgICAgICAgICAnZGlzcGxheSc6IGZhbHNlLA0KICAgICAgICAgICAgICAgICAgICAnZHJhd0JvcmRlcic6IHRydWUNCiAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgICd0aWNrcyc6IHsNCiAgICAgICAgICAgICAgICAgICAgJ2ZvbnRGYW1pbHknOiAnXCdSb2JvdG9cJyxzYW5zLXNlcmlmJywNCiAgICAgICAgICAgICAgICAgICAgJ2ZvbnRTaXplJzogMjAsDQogICAgICAgICAgICAgICAgICAgICdtaW4nOiAwDQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAnc3RhY2tlZCc6IHRydWUNCiAgICAgICAgICAgIH0NCiAgICAgICAgXSwNCiAgICAgICAgJ3lBeGVzJzogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICdncmlkTGluZXMnOiB7DQogICAgICAgICAgICAgICAgICAgICdkaXNwbGF5JzogZmFsc2UsDQogICAgICAgICAgICAgICAgICAgICdkcmF3Qm9yZGVyJzogZmFsc2UNCiAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgICd0aWNrcyc6IHsNCiAgICAgICAgICAgICAgICAgICAgJ2ZvbnRGYW1pbHknOiAnXCdSb2JvdG9cJyxzYW5zLXNlcmlmJywNCiAgICAgICAgICAgICAgICAgICAgJ2ZvbnRTaXplJzogMjANCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIF0NCiAgICB9LA0KICAgICdsZWdlbmQnOiB7DQogICAgICAgICdsYWJlbHMnOiB7DQogICAgICAgICAgICAnZm9udEZhbWlseSc6ICdcJ1JvYm90b1wnLHNhbnMtc2VyaWYnLA0KICAgICAgICAgICAgJ2ZvbnRTaXplJzogMTYNCiAgICAgICAgfSwNCiAgICAgICAgJ3Bvc2l0aW9uJzogJ2JvdHRvbScNCiAgICB9LA0KICAgICdyZXNwb25zaXZlJzogZmFsc2UNCn0gfSk7DQogICAgICAgIDwvc2NyaXB0Pg0KICAgIA=="
          style="height:600px;width: 100%;border:none !important;" allowfullscreen="" webkitallowfullscreen="" mozallowfullscreen="">

30 applicants said that their project would involve providing information, with 24 applications involving advice and 23 providing services. 11 of the organisations that are providing advice also said they were providing information, so there is
          overlap between the first two categories.

              Funded
              Unsuccessful
              Unsuccessful - longlisted
              All

              providing information
              1
              23
              6
              30

              advice
              3
              16
              5
              24

              providing services
              3
              13
              7
              23

              training
              1
              12
              0
              13

              peer support
              1
              9
              3
              13

              education
              1
              8
              1
              10

              finding opportunities
              0
              4
              4
              8

              learning
              0
              5
              2
              7

              finding services
              1
              2
              4
              7

              providing support
              0
              4
              1
              5

              skills
              0
              2
              2
              4

              self-assessment
              0
              1
              1
              2

              reporting
              0
              1
              1
              2

              organisation
              0
              1
              1
              2

              directory
              0
              2
              0
              2

While providing information was the most popular category, only one of the successful applications is using this approach. A smaller proportion of applications intending to provide information made it through to the longlisting stage that for
          advice or services.

Focus of application

Applications were tagged with the problem or theme they are focusing on, based on both Comic Relief's four key themes and Paul Hamlyn Foundation's priorities of migration and youth. The themes used were:

Health and wellbeing (Comic Relief)

Stronger communities (Comic Relief)

Children and young people (Comic Relief and Paul Hamlyn Foundation)

Women and girls (Comic Relief)

Migration (Paul Hamlyn Foundation)

Focus of applications

          <iframe src="data:text/html;base64,DQogICAgICAgIDwhLS0gTG9hZCBDaGFydHMuanMgLS0+DQogICAgICAgPHNjcmlwdCBzcmM9J2h0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL0NoYXJ0LmpzLzIuNS4wL0NoYXJ0LmJ1bmRsZS5taW4uanMnPjwvc2NyaXB0Pg0KICAgIA0KICAgICAgICA8Y2FudmFzIGlkPSdjaGFydF9mb2N1cyc+PC9jYW52YXM+DQogICAgICAgIDxzY3JpcHQ+DQogICAgICAgICAgICB2YXIgY3R4ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NoYXJ0X2ZvY3VzJykuZ2V0Q29udGV4dCgnMmQnKTsNCiAgICAgICAgICAgIGN0eC5jYW52YXMud2lkdGggID0gODAwIC0gKC4xICogODAwKTsNCiAgICAgICAgICAgIGN0eC5jYW52YXMuaGVpZ2h0ID0gNTAwIC0gKC4xNSAqIDUwMCk7DQogICAgICAgICAgICB2YXIgbXlOZXdDaGFydCA9IG5ldyBDaGFydChjdHgseyB0eXBlOiAnaG9yaXpvbnRhbEJhcicsIGRhdGE6IHsNCiAgICAnbGFiZWxzJzogWw0KICAgICAgICAnSGVhbHRoIGFuZCB3ZWxsYmVpbmcnLA0KICAgICAgICAnU3Ryb25nZXIgY29tbXVuaXRpZXMnLA0KICAgICAgICAnQ2hpbGRyZW4gYW5kIHlvdW5nIHBlb3BsZScsDQogICAgICAgICdXb21lbiBhbmQgZ2lybHMnLA0KICAgICAgICAnTWlncmF0aW9uJw0KICAgIF0sDQogICAgJ2RhdGFzZXRzJzogWw0KICAgICAgICB7DQogICAgICAgICAgICAnbGFiZWwnOiAnRnVuZGVkJywNCiAgICAgICAgICAgICdiYWNrZ3JvdW5kQ29sb3InOiAncmdiKDIzNCw3Nyw5NCknLA0KICAgICAgICAgICAgJ2RhdGEnOiBbDQogICAgICAgICAgICAgICAgNS4wLA0KICAgICAgICAgICAgICAgIDIuMCwNCiAgICAgICAgICAgICAgICAxLjAsDQogICAgICAgICAgICAgICAgMS4wLA0KICAgICAgICAgICAgICAgIDAuMA0KICAgICAgICAgICAgXQ0KICAgICAgICB9LA0KICAgICAgICB7DQogICAgICAgICAgICAnbGFiZWwnOiAnVW5zdWNjZXNzZnVsJywNCiAgICAgICAgICAgICdiYWNrZ3JvdW5kQ29sb3InOiAncmdiKDI1MiwgMTU4LCAxODUpJywNCiAgICAgICAgICAgICdkYXRhJzogWw0KICAgICAgICAgICAgICAgIDI5LjAsDQogICAgICAgICAgICAgICAgMjQuMCwNCiAgICAgICAgICAgICAgICAyMS4wLA0KICAgICAgICAgICAgICAgIDEyLjAsDQogICAgICAgICAgICAgICAgNi4wDQogICAgICAgICAgICBdDQogICAgICAgIH0sDQogICAgICAgIHsNCiAgICAgICAgICAgICdsYWJlbCc6ICdVbnN1Y2Nlc3NmdWwgLSBsb25nbGlzdGVkJywNCiAgICAgICAgICAgICdiYWNrZ3JvdW5kQ29sb3InOiAncmdiKDAsIDEyOCwgMTU2KScsDQogICAgICAgICAgICAnZGF0YSc6IFsNCiAgICAgICAgICAgICAgICAxMC4wLA0KICAgICAgICAgICAgICAgIDExLjAsDQogICAgICAgICAgICAgICAgMTEuMCwNCiAgICAgICAgICAgICAgICAzLjAsDQogICAgICAgICAgICAgICAgMS4wDQogICAgICAgICAgICBdDQogICAgICAgIH0NCiAgICBdDQp9LCBvcHRpb25zOiB7DQogICAgJ3NjYWxlcyc6IHsNCiAgICAgICAgJ3hBeGVzJzogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICdncmlkTGluZXMnOiB7DQogICAgICAgICAgICAgICAgICAgICdkaXNwbGF5JzogZmFsc2UsDQogICAgICAgICAgICAgICAgICAgICdkcmF3Qm9yZGVyJzogdHJ1ZQ0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgJ3RpY2tzJzogew0KICAgICAgICAgICAgICAgICAgICAnZm9udEZhbWlseSc6ICdcJ1JvYm90b1wnLHNhbnMtc2VyaWYnLA0KICAgICAgICAgICAgICAgICAgICAnZm9udFNpemUnOiAyMCwNCiAgICAgICAgICAgICAgICAgICAgJ21pbic6IDANCiAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgICdzdGFja2VkJzogdHJ1ZQ0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAneUF4ZXMnOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgJ2dyaWRMaW5lcyc6IHsNCiAgICAgICAgICAgICAgICAgICAgJ2Rpc3BsYXknOiBmYWxzZSwNCiAgICAgICAgICAgICAgICAgICAgJ2RyYXdCb3JkZXInOiBmYWxzZQ0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgJ3RpY2tzJzogew0KICAgICAgICAgICAgICAgICAgICAnZm9udEZhbWlseSc6ICdcJ1JvYm90b1wnLHNhbnMtc2VyaWYnLA0KICAgICAgICAgICAgICAgICAgICAnZm9udFNpemUnOiAyMA0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgXQ0KICAgIH0sDQogICAgJ2xlZ2VuZCc6IHsNCiAgICAgICAgJ2xhYmVscyc6IHsNCiAgICAgICAgICAgICdmb250RmFtaWx5JzogJ1wnUm9ib3RvXCcsc2Fucy1zZXJpZicsDQogICAgICAgICAgICAnZm9udFNpemUnOiAxNg0KICAgICAgICB9LA0KICAgICAgICAncG9zaXRpb24nOiAnYm90dG9tJw0KICAgIH0sDQogICAgJ3Jlc3BvbnNpdmUnOiBmYWxzZQ0KfSB9KTsNCiAgICAgICAgPC9zY3JpcHQ+DQogICAg"
          style="height:600px;width: 100%;border:none !important;" allowfullscreen="" webkitallowfullscreen="" mozallowfullscreen="">

Almost one-third of applications related to health and wellbeing, with five of the ten successful applications working in this area. In addition to these key themes were some other problems being addressed that occured in more than one application.
          These included loneliness (7 applications), mental health (6) and homelessness (4).

              Funded
              Unsuccessful
              Unsuccessful - longlisted
              All

              health and wellbeing
              5
              29
              10
              44

              stronger communities
              2
              24
              11
              37

              children and young people
              1
              21
              11
              33

              women and girls
              1
              12
              3
              16

              migration
              0
              6
              1
              7

Target audience

We identified five major target audiences across the applications. Most applications related to providing a service to the organisations' beneficiaries directly, with 115 applications choosing this audience. 22 applications were aimed at professionals
          who work with those beneficiaries - e.g. teachers, care workers, health workers. Ten applications are aimed at the general public, nine at organisations and two at volunteers or campaigners. All of the successful applications work directly with
          beneficiaries.

Audience of applications

          <iframe src="data:text/html;base64,DQogICAgICAgIDwhLS0gTG9hZCBDaGFydHMuanMgLS0+DQogICAgICAgPHNjcmlwdCBzcmM9J2h0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL0NoYXJ0LmpzLzIuNS4wL0NoYXJ0LmJ1bmRsZS5taW4uanMnPjwvc2NyaXB0Pg0KICAgIA0KICAgICAgICA8Y2FudmFzIGlkPSdjaGFydF9hdWRpZW5jZSc+PC9jYW52YXM+DQogICAgICAgIDxzY3JpcHQ+DQogICAgICAgICAgICB2YXIgY3R4ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NoYXJ0X2F1ZGllbmNlJykuZ2V0Q29udGV4dCgnMmQnKTsNCiAgICAgICAgICAgIGN0eC5jYW52YXMud2lkdGggID0gODAwIC0gKC4xICogODAwKTsNCiAgICAgICAgICAgIGN0eC5jYW52YXMuaGVpZ2h0ID0gNTAwIC0gKC4xNSAqIDUwMCk7DQogICAgICAgICAgICB2YXIgbXlOZXdDaGFydCA9IG5ldyBDaGFydChjdHgseyB0eXBlOiAnaG9yaXpvbnRhbEJhcicsIGRhdGE6IHsNCiAgICAnZGF0YXNldHMnOiBbDQogICAgICAgIHsNCiAgICAgICAgICAgICdsYWJlbCc6ICdMb25nbGlzdGVkJywNCiAgICAgICAgICAgICdkYXRhJzogWw0KICAgICAgICAgICAgICAgIDMxLjAsDQogICAgICAgICAgICAgICAgNS4wLA0KICAgICAgICAgICAgICAgIDIuMCwNCiAgICAgICAgICAgICAgICAyLjAsDQogICAgICAgICAgICAgICAgMS4wDQogICAgICAgICAgICBdLA0KICAgICAgICAgICAgJ2JhY2tncm91bmRDb2xvcic6ICdyZ2IoMCwgMTI4LCAxNTYpJw0KICAgICAgICB9LA0KICAgICAgICB7DQogICAgICAgICAgICAnbGFiZWwnOiAnTm90IHN1Y2Nlc3NmdWwnLA0KICAgICAgICAgICAgJ2RhdGEnOiBbDQogICAgICAgICAgICAgICAgNzQuMCwNCiAgICAgICAgICAgICAgICAxNi4wLA0KICAgICAgICAgICAgICAgIDguMCwNCiAgICAgICAgICAgICAgICA3LjAsDQogICAgICAgICAgICAgICAgMS4wDQogICAgICAgICAgICBdLA0KICAgICAgICAgICAgJ2JhY2tncm91bmRDb2xvcic6ICdyZ2IoMjUyLCAxNTgsIDE4NSknDQogICAgICAgIH0sDQogICAgICAgIHsNCiAgICAgICAgICAgICdsYWJlbCc6ICdTdWNjZXNzZnVsJywNCiAgICAgICAgICAgICdkYXRhJzogWw0KICAgICAgICAgICAgICAgIDEwLjAsDQogICAgICAgICAgICAgICAgMS4wLA0KICAgICAgICAgICAgICAgIDAuMCwNCiAgICAgICAgICAgICAgICAwLjAsDQogICAgICAgICAgICAgICAgMC4wDQogICAgICAgICAgICBdLA0KICAgICAgICAgICAgJ2JhY2tncm91bmRDb2xvcic6ICdyZ2IoMjM0LDc3LDk0KScNCiAgICAgICAgfQ0KICAgIF0sDQogICAgJ2xhYmVscyc6IFsNCiAgICAgICAgJ0JlbmVmaWNpYXJpZXMnLA0KICAgICAgICAnUHJvZmVzc2lvbmFscycsDQogICAgICAgICdQdWJsaWMnLA0KICAgICAgICAnT3JnYW5pc2F0aW9ucycsDQogICAgICAgICdWb2x1bnRlZXJzJw0KICAgIF0NCn0sIG9wdGlvbnM6IHsNCiAgICAncmVzcG9uc2l2ZSc6IGZhbHNlLA0KICAgICdsZWdlbmQnOiB7DQogICAgICAgICdwb3NpdGlvbic6ICdib3R0b20nLA0KICAgICAgICAnbGFiZWxzJzogew0KICAgICAgICAgICAgJ2ZvbnRTaXplJzogMTYsDQogICAgICAgICAgICAnZm9udEZhbWlseSc6ICdcJ1JvYm90b1wnLHNhbnMtc2VyaWYnDQogICAgICAgIH0NCiAgICB9LA0KICAgICdzY2FsZXMnOiB7DQogICAgICAgICd5QXhlcyc6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAnZ3JpZExpbmVzJzogew0KICAgICAgICAgICAgICAgICAgICAnZGlzcGxheSc6IGZhbHNlLA0KICAgICAgICAgICAgICAgICAgICAnZHJhd0JvcmRlcic6IGZhbHNlDQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAndGlja3MnOiB7DQogICAgICAgICAgICAgICAgICAgICdmb250U2l6ZSc6IDIwLA0KICAgICAgICAgICAgICAgICAgICAnZm9udEZhbWlseSc6ICdcJ1JvYm90b1wnLHNhbnMtc2VyaWYnDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAneEF4ZXMnOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgJ2dyaWRMaW5lcyc6IHsNCiAgICAgICAgICAgICAgICAgICAgJ2Rpc3BsYXknOiBmYWxzZSwNCiAgICAgICAgICAgICAgICAgICAgJ2RyYXdCb3JkZXInOiB0cnVlDQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAndGlja3MnOiB7DQogICAgICAgICAgICAgICAgICAgICdmb250U2l6ZSc6IDIwLA0KICAgICAgICAgICAgICAgICAgICAnZm9udEZhbWlseSc6ICdcJ1JvYm90b1wnLHNhbnMtc2VyaWYnDQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAnc3RhY2tlZCc6IHRydWUNCiAgICAgICAgICAgIH0NCiAgICAgICAgXQ0KICAgIH0NCn0gfSk7DQogICAgICAgIDwvc2NyaXB0Pg0KICAgIA=="
          style="height:600px;width: 100%;border:none !important;" allowfullscreen="" webkitallowfullscreen="" mozallowfullscreen="">

              Funded
              Unsuccessful
              Unsuccessful - longlisted
              All

              beneficiaries
              10
              74
              31
              115

              professionals
              1
              16
              5
              22

              public
              0
              8
              2
              10

              organisations
              0
              7
              2
              9

              volunteers
              0
              1
              1
              2

Beneficiaries

Looking at the 115 applications that directly targeted beneficiaries, we can see that 26 applications targeted children and young people, with the same number targeting people with a particular physical health condition. An additional five applications
          targeted people with a mental health condition.

              Funded
              Unsuccessful
              Unsuccessful - longlisted
              All

              children and young people
              1
              17
              8
              26

              people with health condition
              3
              17
              6
              26

              women and girls
              1
              6
              2
              9

              residents
              0
              5
              2
              7

              migrants and refugees
              0
              6
              1
              7

              homeless
              2
              3
              1
              6

              people with mental health condition
              0
              5
              0
              5

              people with addiction
              1
              2
              2
              5

              people in poverty
              1
              3
              1
              5

              older people
              0
              3
              2
              5

              offenders
              0
              2
              2
              4

              families
              1
              2
              1
              4

              parents
              0
              1
              2
              3

              people with disability
              1
              2
              0
              3

              victims of abuse
              0
              2
              1
              3

              lgbt people
              0
              2
              0
              2

              people with learning disability
              0
              2
              0
              2

              carers
              0
              1
              1
              2

              isolated people
              0
              0
              1
              1

              students
              0
              1
              0
              1

Stage of development

To examine the stage of development that each project was in, a scale based on
          research from the Nominet Trust. The concept stage was added to the five developed by Nominet
          Trust to capture those applicants that had not undertaken any development work on their project. The categories used were:

Concept - An idea for the product but no development undertaken

Build - going from concept to minimum viable product (MVP)

Demonstrate - early pilot testing and proving the value of the product or service

Develop - building the operational team and partnerships to support growth, creating a sustainable business model

Readiness - preparing to scale up delivery

Scaling - increasing access to the product or service

Classifying the projects was not always straightforward, as some applications were unclear about the stage that their project had reached.

Application stage of development

          <iframe src="data:text/html;base64,DQogICAgICAgIDwhLS0gTG9hZCBDaGFydHMuanMgLS0+DQogICAgICAgPHNjcmlwdCBzcmM9J2h0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL0NoYXJ0LmpzLzIuNS4wL0NoYXJ0LmJ1bmRsZS5taW4uanMnPjwvc2NyaXB0Pg0KICAgIA0KICAgICAgICA8Y2FudmFzIGlkPSdjaGFydF9zdGFnZXMnPjwvY2FudmFzPg0KICAgICAgICA8c2NyaXB0Pg0KICAgICAgICAgICAgdmFyIGN0eCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjaGFydF9zdGFnZXMnKS5nZXRDb250ZXh0KCcyZCcpOw0KICAgICAgICAgICAgY3R4LmNhbnZhcy53aWR0aCAgPSA4MDAgLSAoLjEgKiA4MDApOw0KICAgICAgICAgICAgY3R4LmNhbnZhcy5oZWlnaHQgPSA1MDAgLSAoLjE1ICogNTAwKTsNCiAgICAgICAgICAgIHZhciBteU5ld0NoYXJ0ID0gbmV3IENoYXJ0KGN0eCx7IHR5cGU6ICdsaW5lJywgZGF0YTogew0KICAgICdkYXRhc2V0cyc6IFsNCiAgICAgICAgew0KICAgICAgICAgICAgJ2JvcmRlckNvbG9yJzogJ3JnYigyNTIsIDE1OCwgMTg1KScsDQogICAgICAgICAgICAnbGluZVRlbnNpb24nOiAwLA0KICAgICAgICAgICAgJ2xhYmVsJzogJ05vdCBzdWNjZXNzZnVsJywNCiAgICAgICAgICAgICdkYXRhJzogWw0KICAgICAgICAgICAgICAgIDQyLA0KICAgICAgICAgICAgICAgIDE1LA0KICAgICAgICAgICAgICAgIDE0LA0KICAgICAgICAgICAgICAgIDE2LA0KICAgICAgICAgICAgICAgIDUsDQogICAgICAgICAgICAgICAgMw0KICAgICAgICAgICAgXQ0KICAgICAgICB9LA0KICAgICAgICB7DQogICAgICAgICAgICAnYm9yZGVyQ29sb3InOiAncmdiKDAsIDEyOCwgMTU2KScsDQogICAgICAgICAgICAnbGluZVRlbnNpb24nOiAwLA0KICAgICAgICAgICAgJ2xhYmVsJzogJ0xvbmdsaXN0ZWQnLA0KICAgICAgICAgICAgJ2RhdGEnOiBbDQogICAgICAgICAgICAgICAgOCwNCiAgICAgICAgICAgICAgICA4LA0KICAgICAgICAgICAgICAgIDEyLA0KICAgICAgICAgICAgICAgIDcsDQogICAgICAgICAgICAgICAgMSwNCiAgICAgICAgICAgICAgICAwDQogICAgICAgICAgICBdDQogICAgICAgIH0sDQogICAgICAgIHsNCiAgICAgICAgICAgICdib3JkZXJDb2xvcic6ICdyZ2IoMjM0LDc3LDk0KScsDQogICAgICAgICAgICAnbGluZVRlbnNpb24nOiAwLA0KICAgICAgICAgICAgJ2xhYmVsJzogJ1N1Y2Nlc3NmdWwnLA0KICAgICAgICAgICAgJ2RhdGEnOiBbDQogICAgICAgICAgICAgICAgMSwNCiAgICAgICAgICAgICAgICA1LA0KICAgICAgICAgICAgICAgIDEsDQogICAgICAgICAgICAgICAgMiwNCiAgICAgICAgICAgICAgICAxLA0KICAgICAgICAgICAgICAgIDANCiAgICAgICAgICAgIF0NCiAgICAgICAgfQ0KICAgIF0sDQogICAgJ2xhYmVscyc6IFsNCiAgICAgICAgJ0NvbmNlcHQnLA0KICAgICAgICAnQnVpbGQnLA0KICAgICAgICAnRGVtb25zdHJhdGUnLA0KICAgICAgICAnRGV2ZWxvcCcsDQogICAgICAgICdSZWFkaW5lc3MnLA0KICAgICAgICAnU2NhbGluZycNCiAgICBdDQp9LCBvcHRpb25zOiB7DQogICAgJ3Jlc3BvbnNpdmUnOiBmYWxzZSwNCiAgICAnbGVnZW5kJzogew0KICAgICAgICAncG9zaXRpb24nOiAnYm90dG9tJywNCiAgICAgICAgJ2xhYmVscyc6IHsNCiAgICAgICAgICAgICdmb250U2l6ZSc6IDE2LA0KICAgICAgICAgICAgJ2ZvbnRGYW1pbHknOiAnXCdSb2JvdG9cJyxzYW5zLXNlcmlmJw0KICAgICAgICB9DQogICAgfSwNCiAgICAnc2NhbGVzJzogew0KICAgICAgICAneUF4ZXMnOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgJ2dyaWRMaW5lcyc6IHsNCiAgICAgICAgICAgICAgICAgICAgJ2Rpc3BsYXknOiBmYWxzZQ0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgJ3RpY2tzJzogew0KICAgICAgICAgICAgICAgICAgICAnZm9udFNpemUnOiAyMCwNCiAgICAgICAgICAgICAgICAgICAgJ2ZvbnRGYW1pbHknOiAnXCdSb2JvdG9cJyxzYW5zLXNlcmlmJw0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgJ3N0YWNrZWQnOiB0cnVlDQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICd4QXhlcyc6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAnZ3JpZExpbmVzJzogew0KICAgICAgICAgICAgICAgICAgICAnZGlzcGxheSc6IGZhbHNlLA0KICAgICAgICAgICAgICAgICAgICAnZHJhd0JvcmRlcic6IGZhbHNlDQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAndGlja3MnOiB7DQogICAgICAgICAgICAgICAgICAgICdmb250U2l6ZSc6IDE2LA0KICAgICAgICAgICAgICAgICAgICAnZm9udEZhbWlseSc6ICdcJ1JvYm90b1wnLHNhbnMtc2VyaWYnDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICBdDQogICAgfQ0KfSB9KTsNCiAgICAgICAgPC9zY3JpcHQ+DQogICAg"
          style="height:600px;width: 100%;border:none !important;" allowfullscreen="" webkitallowfullscreen="" mozallowfullscreen="">

As would be expected for a fund of this nature, most applications were at an early stage of development. 51 applications were at the concept stage, with a further 55 at the build and demonstrate stages and 25 at the
          develop stage. Reflecting the fund guidance, there was a clear preference for projects that had moved beyond the concept stage, only one of the 51 applications at that stage were successful.

              Funded
              Unsuccessful - longlisted
              Unsuccessful
              All

              Concept
              1
              8
              42
              51

              Build
              5
              8
              15
              28

              Demonstrate
              1
              12
              14
              27

              Develop
              2
              7
              16
              25

              Readiness
              1
              1
              5
              7

              Scaling
              0
              0
              3
              3

              All
              10
              36
              95
              141

Conclusions: demand for tech funding

The data gathered from applications to this fund offers a glimpse into demand for funding for non-profits to scale up their digital ideas. Although some caution should be taken in drawing conclusions for the whole sector based on applications
          to one funding stream, it could offer some insights into work organisations are planning or hoping to undertake. The findings suggest the following implications:

All sizes of organisations are interested in similar funding, but there appears to be particular demand from non-profit organisations with over £1m income - nearly two-thirds of applications came from this group.

Most potential applicants are likely to be registered charities, but there is a significant group of non-profit organisations with other legal forms that have an interest in this funding, particularly Community Interest Companies, who made up
            roughly one in six applicants.

Organisations based in London dominated applications to the fund, although this may be explained by the larger average size of applicants. There may be a need to generate demand in smaller organisations outside of London.

Applicants were agnostic about the technology used in their projects, or did not feel it was important to spell out. This is probably positive - it suggests a focus on solving problems rather than the technology itself.

A common aim of application projects was to provide information or advice to beneficiaries, although a significant number want to provide services too them. Perhaps unexpectedly, there doesn't appear to be a large demand for peer support or
            networking services.

Most application projects are aimed at directly supporting beneficiaries, with a minority instead aiming to support professionals or organisations to then work with beneficiaries.

Most applications had taken their project past the concept stage and had a prototype or existing product to develop. Although this again would have been influenced by the fund criteria, it does suggest that there are organisations already willing
            to experiment and take risks in this area, and then look to develop those ideas further.