latest analysis

latest analysis

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.

Comic Relief Tech for Good
applications analysis

David Kane, CAST

April 2017

This document present 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.

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 are the key problems being addressed? (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.

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. After cleaning, 144 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 144 organisations, 46 were longlisted for consideration, with 95 unsuccessful and 3 deemed ineligible.

Final status of applications

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

Of the 46 applications carried forward to longlisting, 10 were funded.

              Status

              Ineligible
              3

              Not successful
              95

              Longlisted
              36

              Successful
              10

Applications by status and organisation type

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

Organisation type of applicants

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

              Ineligible
              Not successful
              Longlisted
              Successful
              All

              Charity
              0
              52
              24
              7
              83

              Community Interest Company
              0
              16
              4
              2
              22

              Company Limited by Guarantee
              0
              7
              0
              0
              7

              Housing Association
              0
              1
              0
              0
              1

              Overseas
              1
              1
              0
              0
              2

              Private Limited Company
              0
              7
              4
              1
              12

              University
              0
              3
              0
              0
              3

              Unknown
              2
              8
              4
              0
              14

              All
              3
              95
              36
              10
              144

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+DQogICAgICAgICAgICB2YXIgY3R4ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NoYXJ0X29yZ19zaXplJykuZ2V0Q29udGV4dCgnMmQnKTsNCiAgICAgICAgICAgIGN0eC5jYW52YXMud2lkdGggID0gODAwIC0gKC4xICogODAwKTsNCiAgICAgICAgICAgIGN0eC5jYW52YXMuaGVpZ2h0ID0gNTAwIC0gKC4xNSAqIDUwMCk7DQogICAgICAgICAgICB2YXIgbXlOZXdDaGFydCA9IG5ldyBDaGFydChjdHgseyB0eXBlOiAnaG9yaXpvbnRhbEJhcicsIGRhdGE6IHsNCiAgICAnZGF0YXNldHMnOiBbDQogICAgICAgIHsNCiAgICAgICAgICAgICdsYWJlbCc6ICdJbmVsaWdpYmxlJywNCiAgICAgICAgICAgICdkYXRhJzogWw0KICAgICAgICAgICAgICAgIDAuMCwNCiAgICAgICAgICAgICAgICAwLjAsDQogICAgICAgICAgICAgICAgMC4wLA0KICAgICAgICAgICAgICAgIDAuMCwNCiAgICAgICAgICAgICAgICAwLjANCiAgICAgICAgICAgIF0sDQogICAgICAgICAgICAnYmFja2dyb3VuZENvbG9yJzogJ3JnYigxMjUsIDQ0LCAxNjkpJw0KICAgICAgICB9LA0KICAgICAgICB7DQogICAgICAgICAgICAnbGFiZWwnOiAnTm90IHN1Y2Nlc3NmdWwnLA0KICAgICAgICAgICAgJ2RhdGEnOiBbDQogICAgICAgICAgICAgICAgMS4wLA0KICAgICAgICAgICAgICAgIDYuMCwNCiAgICAgICAgICAgICAgICAxNi4wLA0KICAgICAgICAgICAgICAgIDIxLjAsDQogICAgICAgICAgICAgICAgNS4wDQogICAgICAgICAgICBdLA0KICAgICAgICAgICAgJ2JhY2tncm91bmRDb2xvcic6ICdyZ2IoMjUyLCAxNTgsIDE4NSknDQogICAgICAgIH0sDQogICAgICAgIHsNCiAgICAgICAgICAgICdsYWJlbCc6ICdMb25nbGlzdGVkJywNCiAgICAgICAgICAgICdkYXRhJzogWw0KICAgICAgICAgICAgICAgIDAuMCwNCiAgICAgICAgICAgICAgICAxLjAsDQogICAgICAgICAgICAgICAgNi4wLA0KICAgICAgICAgICAgICAgIDEwLjAsDQogICAgICAgICAgICAgICAgNi4wDQogICAgICAgICAgICBdLA0KICAgICAgICAgICAgJ2JhY2tncm91bmRDb2xvcic6ICdyZ2IoMCwgMTI4LCAxNTYpJw0KICAgICAgICB9LA0KICAgICAgICB7DQogICAgICAgICAgICAnbGFiZWwnOiAnU3VjY2Vzc2Z1bCcsDQogICAgICAgICAgICAnZGF0YSc6IFsNCiAgICAgICAgICAgICAgICAwLjAsDQogICAgICAgICAgICAgICAgMS4wLA0KICAgICAgICAgICAgICAgIDAuMCwNCiAgICAgICAgICAgICAgICAzLjAsDQogICAgICAgICAgICAgICAgMy4wDQogICAgICAgICAgICBdLA0KICAgICAgICAgICAgJ2JhY2tncm91bmRDb2xvcic6ICdyZ2IoMjM0LDc3LDk0KScNCiAgICAgICAgfQ0KICAgIF0sDQogICAgJ2xhYmVscyc6IFsNCiAgICAgICAgJ1VuZGVyIDEwaycsDQogICAgICAgICcxMGsgLSAxMDBrJywNCiAgICAgICAgJzEwMGsgLSAxbScsDQogICAgICAgICcxbSAtIDEwbScsDQogICAgICAgICdPdmVyIDEwbScNCiAgICBdDQp9LCBvcHRpb25zOiB7DQogICAgJ3Jlc3BvbnNpdmUnOiBmYWxzZSwNCiAgICAnbGVnZW5kJzogew0KICAgICAgICAncG9zaXRpb24nOiAnYm90dG9tJywNCiAgICAgICAgJ2xhYmVscyc6IHsNCiAgICAgICAgICAgICdmb250U2l6ZSc6IDE2LA0KICAgICAgICAgICAgJ2ZvbnRGYW1pbHknOiAnXCdSb2JvdG9cJyxzYW5zLXNlcmlmJw0KICAgICAgICB9DQogICAgfSwNCiAgICAnc2NhbGVzJzogew0KICAgICAgICAneUF4ZXMnOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgJ2dyaWRMaW5lcyc6IHsNCiAgICAgICAgICAgICAgICAgICAgJ2Rpc3BsYXknOiBmYWxzZSwNCiAgICAgICAgICAgICAgICAgICAgJ2RyYXdCb3JkZXInOiBmYWxzZQ0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgJ3RpY2tzJzogew0KICAgICAgICAgICAgICAgICAgICAnZm9udFNpemUnOiAyMCwNCiAgICAgICAgICAgICAgICAgICAgJ2ZvbnRGYW1pbHknOiAnXCdSb2JvdG9cJyxzYW5zLXNlcmlmJw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgXSwNCiAgICAgICAgJ3hBeGVzJzogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICdncmlkTGluZXMnOiB7DQogICAgICAgICAgICAgICAgICAgICdkaXNwbGF5JzogZmFsc2UsDQogICAgICAgICAgICAgICAgICAgICdkcmF3Qm9yZGVyJzogdHJ1ZQ0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgJ3RpY2tzJzogew0KICAgICAgICAgICAgICAgICAgICAnZm9udFNpemUnOiAyMCwNCiAgICAgICAgICAgICAgICAgICAgJ2ZvbnRGYW1pbHknOiAnXCdSb2JvdG9cJyxzYW5zLXNlcmlmJw0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgJ3N0YWNrZWQnOiB0cnVlDQogICAgICAgICAgICB9DQogICAgICAgIF0NCiAgICB9DQp9IH0pOw0KICAgICAgICA8L3NjcmlwdD4NCiAgICA="
          style="height:600px;width: 100%;border:none !important;" allowfullscreen="" webkitallowfullscreen="" mozallowfullscreen="">

              Ineligible
              Not successful
              Longlisted
              Successful
              All

              Under 10k
              0
              1
              0
              0
              1

              10k - 100k
              0
              6
              1
              1
              8

              100k - 1m
              0
              16
              6
              0
              22

              1m - 10m
              0
              21
              10
              3
              34

              Over 10m
              0
              5
              6
              3
              14

              All
              0
              49
              23
              7
              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+DQogICAgICAgPHNjcmlwdCBzcmM9J2h0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL0NoYXJ0LmpzLzIuNS4wL0NoYXJ0LmJ1bmRsZS5taW4uanMnPjwvc2NyaXB0Pg0KICAgIA0KICAgICAgICA8Y2FudmFzIGlkPSdjaGFydF9yZWdpb24nPjwvY2FudmFzPg0KICAgICAgICA8c2NyaXB0Pg0KICAgICAgICAgICAgdmFyIGN0eCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjaGFydF9yZWdpb24nKS5nZXRDb250ZXh0KCcyZCcpOw0KICAgICAgICAgICAgY3R4LmNhbnZhcy53aWR0aCAgPSA4MDAgLSAoLjEgKiA4MDApOw0KICAgICAgICAgICAgY3R4LmNhbnZhcy5oZWlnaHQgPSA1MDAgLSAoLjE1ICogNTAwKTsNCiAgICAgICAgICAgIHZhciBteU5ld0NoYXJ0ID0gbmV3IENoYXJ0KGN0eCx7IHR5cGU6ICdob3Jpem9udGFsQmFyJywgZGF0YTogew0KICAgICdkYXRhc2V0cyc6IFsNCiAgICAgICAgew0KICAgICAgICAgICAgJ2xhYmVsJzogJ0luZWxpZ2libGUnLA0KICAgICAgICAgICAgJ2RhdGEnOiBbDQogICAgICAgICAgICAgICAgMCwNCiAgICAgICAgICAgICAgICAwLA0KICAgICAgICAgICAgICAgIDAsDQogICAgICAgICAgICAgICAgMCwNCiAgICAgICAgICAgICAgICAxLA0KICAgICAgICAgICAgICAgIDAsDQogICAgICAgICAgICAgICAgMCwNCiAgICAgICAgICAgICAgICAwLA0KICAgICAgICAgICAgICAgIDAsDQogICAgICAgICAgICAgICAgMCwNCiAgICAgICAgICAgICAgICAwLA0KICAgICAgICAgICAgICAgIDANCiAgICAgICAgICAgIF0sDQogICAgICAgICAgICAnYmFja2dyb3VuZENvbG9yJzogJ3JnYigxMjUsIDQ0LCAxNjkpJw0KICAgICAgICB9LA0KICAgICAgICB7DQogICAgICAgICAgICAnbGFiZWwnOiAnTm90IHN1Y2Nlc3NmdWwnLA0KICAgICAgICAgICAgJ2RhdGEnOiBbDQogICAgICAgICAgICAgICAgNCwNCiAgICAgICAgICAgICAgICAzLA0KICAgICAgICAgICAgICAgIDMxLA0KICAgICAgICAgICAgICAgIDgsDQogICAgICAgICAgICAgICAgMTIsDQogICAgICAgICAgICAgICAgNCwNCiAgICAgICAgICAgICAgICA2LA0KICAgICAgICAgICAgICAgIDgsDQogICAgICAgICAgICAgICAgNCwNCiAgICAgICAgICAgICAgICAzLA0KICAgICAgICAgICAgICAgIDIsDQogICAgICAgICAgICAgICAgOQ0KICAgICAgICAgICAgXSwNCiAgICAgICAgICAgICdiYWNrZ3JvdW5kQ29sb3InOiAncmdiKDI1MiwgMTU4LCAxODUpJw0KICAgICAgICB9LA0KICAgICAgICB7DQogICAgICAgICAgICAnbGFiZWwnOiAnTG9uZ2xpc3RlZCcsDQogICAgICAgICAgICAnZGF0YSc6IFsNCiAgICAgICAgICAgICAgICAwLA0KICAgICAgICAgICAgICAgIDAsDQogICAgICAgICAgICAgICAgMjAsDQogICAgICAgICAgICAgICAgMiwNCiAgICAgICAgICAgICAgICAxLA0KICAgICAgICAgICAgICAgIDAsDQogICAgICAgICAgICAgICAgMSwNCiAgICAgICAgICAgICAgICAyLA0KICAgICAgICAgICAgICAgIDUsDQogICAgICAgICAgICAgICAgMiwNCiAgICAgICAgICAgICAgICAyLA0KICAgICAgICAgICAgICAgIDENCiAgICAgICAgICAgIF0sDQogICAgICAgICAgICAnYmFja2dyb3VuZENvbG9yJzogJ3JnYigwLCAxMjgsIDE1NiknDQogICAgICAgIH0sDQogICAgICAgIHsNCiAgICAgICAgICAgICdsYWJlbCc6ICdTdWNjZXNzZnVsJywNCiAgICAgICAgICAgICdkYXRhJzogWw0KICAgICAgICAgICAgICAgIDAsDQogICAgICAgICAgICAgICAgMCwNCiAgICAgICAgICAgICAgICA0LA0KICAgICAgICAgICAgICAgIDAsDQogICAgICAgICAgICAgICAgMiwNCiAgICAgICAgICAgICAgICAwLA0KICAgICAgICAgICAgICAgIDEsDQogICAgICAgICAgICAgICAgMCwNCiAgICAgICAgICAgICAgICAzLA0KICAgICAgICAgICAgICAgIDAsDQogICAgICAgICAgICAgICAgMCwNCiAgICAgICAgICAgICAgICAwDQogICAgICAgICAgICBdLA0KICAgICAgICAgICAgJ2JhY2tncm91bmRDb2xvcic6ICdyZ2IoMjM0LDc3LDk0KScNCiAgICAgICAgfQ0KICAgIF0sDQogICAgJ2xhYmVscyc6IFsNCiAgICAgICAgJ0Vhc3QgTWlkbGFuZHMnLA0KICAgICAgICAnRWFzdGVybicsDQogICAgICAgICdMb25kb24nLA0KICAgICAgICAnTm9ydGggRWFzdCcsDQogICAgICAgICdOb3J0aCBXZXN0JywNCiAgICAgICAgJ05vcnRoZXJuIElyZWxhbmQnLA0KICAgICAgICAnU2NvdGxhbmQnLA0KICAgICAgICAnU291dGggRWFzdCcsDQogICAgICAgICdTb3V0aCBXZXN0JywNCiAgICAgICAgJ1dhbGVzJywNCiAgICAgICAgJ1dlc3QgTWlkbGFuZHMnLA0KICAgICAgICAnWW9ya3NoaXJlIGFuZCB0aGUgSHVtYmVyJw0KICAgIF0NCn0sIG9wdGlvbnM6IHsNCiAgICAncmVzcG9uc2l2ZSc6IGZhbHNlLA0KICAgICdsZWdlbmQnOiB7DQogICAgICAgICdwb3NpdGlvbic6ICdib3R0b20nLA0KICAgICAgICAnbGFiZWxzJzogew0KICAgICAgICAgICAgJ2ZvbnRTaXplJzogMTYsDQogICAgICAgICAgICAnZm9udEZhbWlseSc6ICdcJ1JvYm90b1wnLHNhbnMtc2VyaWYnDQogICAgICAgIH0NCiAgICB9LA0KICAgICdzY2FsZXMnOiB7DQogICAgICAgICd5QXhlcyc6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAnZ3JpZExpbmVzJzogew0KICAgICAgICAgICAgICAgICAgICAnZGlzcGxheSc6IGZhbHNlLA0KICAgICAgICAgICAgICAgICAgICAnZHJhd0JvcmRlcic6IGZhbHNlDQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAndGlja3MnOiB7DQogICAgICAgICAgICAgICAgICAgICdmb250U2l6ZSc6IDIwLA0KICAgICAgICAgICAgICAgICAgICAnZm9udEZhbWlseSc6ICdcJ1JvYm90b1wnLHNhbnMtc2VyaWYnDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KICAgICAgICAneEF4ZXMnOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgJ2dyaWRMaW5lcyc6IHsNCiAgICAgICAgICAgICAgICAgICAgJ2Rpc3BsYXknOiBmYWxzZSwNCiAgICAgICAgICAgICAgICAgICAgJ2RyYXdCb3JkZXInOiB0cnVlDQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAndGlja3MnOiB7DQogICAgICAgICAgICAgICAgICAgICdmb250U2l6ZSc6IDIwLA0KICAgICAgICAgICAgICAgICAgICAnZm9udEZhbWlseSc6ICdcJ1JvYm90b1wnLHNhbnMtc2VyaWYnDQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAnc3RhY2tlZCc6IHRydWUNCiAgICAgICAgICAgIH0NCiAgICAgICAgXQ0KICAgIH0NCn0gfSk7DQogICAgICAgIDwvc2NyaXB0Pg0KICAgIA=="
          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+ICNtYXBfY2NjZmQ2OTU5YWE3NGI4ZjkyOGMwYzBjZjNkMmJkYjMgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgIC AgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwX2NjY2ZkNjk1OWFhNzRiOGY5MjhjMGMwY2YzZDJiZGIzIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIHNvdXRoV2VzdCA9IEwubGF0TG5nKC05MCwgLTE4MCk7CiAgICAgICAgICAgICAgICB2YXIgbm9ydGhFYXN0ID0gTC5sYXRMbmcoOTAsIDE4MCk7CiAgICAgICAgICAgICAgICB2YXIgYm91bmRzID0gTC5sYXRMbmdCb3VuZHMoc291dGhXZXN0LCBub3J0aEVhc3QpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXBfY2NjZmQ2OTU5YWE3NGI4ZjkyOGMwYzBjZjNkMmJkYjMgPSBMLm1hcCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtYXBfY2NjZmQ2OTU5YWE3NGI4ZjkyOGMwYzBjZjNkMmJkYjMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2NlbnRlcjogWzUzLjY0OTA0LC0xLjc4NDE2XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvb206IDYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhCb3VuZHM6IGJvdW5kcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyczogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZENvcHlKdW1wOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciB0aWxlX2xheWVyX2VhZDRiYTU5NDI4ZjRmZmE4ZTFhYTVjZGE3OTA1YjYzID0gTC50aWxlTGF5ZXIoCiAgICAgICAgICAgICAgICAnaHR0cHM6Ly9zdGFtZW4tdGlsZXMte3N9LmEuc3NsLmZhc3RseS5uZXQvdG9uZXIve3p9L3t4fS97eX0ucG5nJywKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtYXhab29tOiAxOCwKICAgICAgICAgICAgICAgICAgICBtaW5ab29tOiAxLAogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVvdXNXb3JsZDogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgbm9XcmFwOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGlvbjogJ01hcCB0aWxlcyBieSA8YSBocmVmPSJodHRwOi8vc3RhbWVuLmNvbSI+U3RhbWVuIERlc2lnbjwvYT4sIHVuZGVyIDxhIGhyZWY9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LzMuMCI+Q0MgQlkgMy4wPC9hPi4gRGF0YSBieSA8YSBocmVmPSJodHRwOi8vb3BlbnN0cmVldG1hcC5vcmciPk9wZW5TdHJlZXRNYXA8L2E+LCB1bmRlciA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5zdHJlZXRtYXAub3JnL2NvcHlyaWdodCI+T0RiTDwvYT4uJywKICAgICAgICAgICAgICAgICAgICBkZXRlY3RSZXRpbmE6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfY2NjZmQ2OTU5YWE3NGI4ZjkyOGMwYzBjZjNkMmJkYjMpOwoKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgZmVhdHVyZV9ncm91cF8xYjk4NDY1MmU1ZTk0YmQyODBjMWFkNTkzMGY2OGM5NiA9IEwuZmVhdHVyZUdyb3VwKAogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfY2NjZmQ2OTU5YWE3NGI4ZjkyOGMwYzBjZjNkMmJkYjMpOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82OWNmYmMzMzQ3MGU0MTYyODc3NzUwM2QxZDQ1MzU4ZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUyLjI1NDUyMjUsLTIuMjY2ODM4Ml0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF8xYjk4NDY1MmU1ZTk0YmQyODBjMWFkNTkzMGY2OGM5Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81YTE2ZWQxN2I0MzI0Y2YzOTZlYzA1MGY5MzU0NDI0ZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kYzllOTdlMWU3YmQ0MzAzODMxYTM0ZWNiOGFjZDI5OSA9ICQoJzxkaXYgaWQ9Imh0bWxfZGM5ZTk3ZTFlN2JkNDMwMzgzMWEzNGVjYjhhY2QyOTkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNvY2lhbCBGaW5hbmNlIEx0ZCAod29yY2VzdGVyc2hpcmUpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81YTE2ZWQxN2I0MzI0Y2YzOTZlYzA1MGY5MzU0NDI0ZS5zZXRDb250ZW50KGh0bWxfZGM5ZTk3ZTFlN2JkNDMwMzgzMWEzNGVjYjhhY2QyOTkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjljZmJjMzM0NzBlNDE2Mjg3Nzc1MDNkMWQ0NTM1OGUuYmluZFBvcHVwKHBvcHVwXzVhMTZlZDE3YjQzMjRjZjM5NmVjMDUwZjkzNTQ0MjRlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lNjUzZjU2NmVkZGQ0NzI5YTg5M2NkMWM4MWY5NDY4YSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzU1LjAxODIzOTksLTEuNDg1ODQzNl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF8xYjk4NDY1MmU1ZTk0YmQyODBjMWFkNTkzMGY2OGM5Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jZGUxZWZlM2NjNTU0OThlOGM1YWE0ZGEzZmY0YWMzMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kYTdmN2ZjMTQzNGQ0YWE1OGE2ZjZmZjE5MTgwMzc3ZSA9ICQoJzxkaXYgaWQ9Imh0bWxfZGE3ZjdmYzE0MzRkNGFhNThhNmY2ZmYxOTE4MDM3N2UiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5vcnRoIFR5bmVzaWRlIFZPREEgKE5vcnRoIFR5bmVzaWRlKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2RlMWVmZTNjYzU1NDk4ZThjNWFhNGRhM2ZmNGFjMzMuc2V0Q29udGVudChodG1sX2RhN2Y3ZmMxNDM0ZDRhYTU4YTZmNmZmMTkxODAzNzdlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2U2NTNmNTY2ZWRkZDQ3MjlhODkzY2QxYzgxZjk0NjhhLmJpbmRQb3B1cChwb3B1cF9jZGUxZWZlM2NjNTU0OThlOGM1YWE0ZGEzZmY0YWMzMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjk2M2ViNWJkNDJjNGI0N2I5ODgwOWRiYzRlMjQzNDMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS4wNjg3ODUsLTEuNzk0NDcyXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzFiOTg0NjUyZTVlOTRiZDI4MGMxYWQ1OTMwZjY4Yzk2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2IyNmJlZmYwM2Q3ZjQ2YzI5MGE4NDFiNGExNDRiYjAyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNiN2ZmODM2MDUyNTQ4YzVhMTdjMGNhNmQxNzUzMTE3ID0gJCgnPGRpdiBpZD0iaHRtbF8zYjdmZjgzNjA1MjU0OGM1YTE3YzBjYTZkMTc1MzExNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VHJ1c3NlbGwgVHJ1c3QgKFNhbGlzYnVyeSk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2IyNmJlZmYwM2Q3ZjQ2YzI5MGE4NDFiNGExNDRiYjAyLnNldENvbnRlbnQoaHRtbF8zYjdmZjgzNjA1MjU0OGM1YTE3YzBjYTZkMTc1MzExNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82OTYzZWI1YmQ0MmM0YjQ3Yjk4ODA5ZGJjNGUyNDM0My5iaW5kUG9wdXAocG9wdXBfYjI2YmVmZjAzZDdmNDZjMjkwYTg0MWI0YTE0NGJiMDIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzY3ZDZmNGZiNTdhMDQ1MWQ5OWQyZjdmZGRjODQ0MmY3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTMuMjkzMTgxOTk5OTk5OTksLTMuNzI3NjRdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMWI5ODQ2NTJlNWU5NGJkMjgwYzFhZDU5MzBmNjhjOTYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGVmZjhkMTYwNjgzNDJlYmEzOGI5Y2ZkYjI0OTg0ZTcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTdkZDNlOGVlOWJmNGE3Nzk0YWY5OTNkMTJhMjE4YzUgPSAkKCc8ZGl2IGlkPSJodG1sXzE3ZGQzZThlZTliZjRhNzc5NGFmOTkzZDEyYTIxOGM1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ob3J0aCBXYWxlcyBEZWFmIEFzc29jaWF0aW9uIChDb2x3eW4gQmF5LCBOb3J0aCBXYWxlcyk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RlZmY4ZDE2MDY4MzQyZWJhMzhiOWNmZGIyNDk4NGU3LnNldENvbnRlbnQoaHRtbF8xN2RkM2U4ZWU5YmY0YTc3OTRhZjk5M2QxMmEyMThjNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82N2Q2ZjRmYjU3YTA0NTFkOTlkMmY3ZmRkYzg0NDJmNy5iaW5kUG9wdXAocG9wdXBfZGVmZjhkMTYwNjgzNDJlYmEzOGI5Y2ZkYjI0OTg0ZTcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2IzNjI3NWNjMTI2YjRmZjU5NGNiYmE5MmY4NGRlNjBmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTIuNDg2MjQyOTk5OTk5OTksLTEuODkwNDAxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzFiOTg0NjUyZTVlOTRiZDI4MGMxYWQ1OTMwZjY4Yzk2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU4ODY4MmFhYmZjNDRhYzk5NmU2ZTZiMWQxNzkxNDJkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q4M2RiZTM1ZGYyNjRhYTdhMzJlMWQ3ZDk1N2ZlMzRhID0gJCgnPGRpdiBpZD0iaHRtbF9kODNkYmUzNWRmMjY0YWE3YTMyZTFkN2Q5NTdmZTM0YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2hhbmdlcyBVSyAoQmlybWluZ2hhbSk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU4ODY4MmFhYmZjNDRhYzk5NmU2ZTZiMWQxNzkxNDJkLnNldENvbnRlbnQoaHRtbF9kODNkYmUzNWRmMjY0YWE3YTMyZTFkN2Q5NTdmZTM0YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iMzYyNzVjYzEyNmI0ZmY1OTRjYmJhOTJmODRkZTYwZi5iaW5kUG9wdXAocG9wdXBfNTg4NjgyYWFiZmM0NGFjOTk2ZTZlNmIxZDE3OTE0MmQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2MyMzdmYjJkZjM3MDRlYTQ5ZWNhOGZjMTEwYTE1Zjk2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTMuODAwNzU1NCwtMS41NDkwNzc0XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzFiOTg0NjUyZTVlOTRiZDI4MGMxYWQ1OTMwZjY4Yzk2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2I5YmUzMWE3MjZkODRlNjZiZjg5ZTZkYTA5YjU0NDlmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc3Zjc1MmU5OTdlNTQ4ZTJiN2ZiMThkYmFmMDYxZDU4ID0gJCgnPGRpdiBpZD0iaHRtbF83N2Y3NTJlOTk3ZTU0OGUyYjdmYjE4ZGJhZjA2MWQ1OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VmFsbGEgKExlZWRzKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjliZTMxYTcyNmQ4NGU2NmJmODllNmRhMDliNTQ0OWYuc2V0Q29udGVudChodG1sXzc3Zjc1MmU5OTdlNTQ4ZTJiN2ZiMThkYmFmMDYxZDU4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2MyMzdmYjJkZjM3MDRlYTQ5ZWNhOGZjMTEwYTE1Zjk2LmJpbmRQb3B1cChwb3B1cF9iOWJlMzFhNzI2ZDg0ZTY2YmY4OWU2ZGEwOWI1NDQ5Zik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTUwYTA4MjM5OTFiNDkwZjlhMzNjNWQ5NGRlNjZmY2MgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1My43NjMyMjU0LC0yLjcwNDQwNTJdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMWI5ODQ2NTJlNWU5NGJkMjgwYzFhZDU5MzBmNjhjOTYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjU2NGFhNThmMzg3NGQzMDlkOGViM2U2YWVmMjE4OGQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDE3MjM4NDhjYTA2NDUyZGI1N2VlNDRhZGMxY2M1NjggPSAkKCc8ZGl2IGlkPSJodG1sXzAxNzIzODQ4Y2EwNjQ1MmRiNTdlZTQ0YWRjMWNjNTY4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TYWZlciBUb2dldGhlciAvIEhBUlYgKGxhbmNhc2hpcmUpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82NTY0YWE1OGYzODc0ZDMwOWQ4ZWIzZTZhZWYyMTg4ZC5zZXRDb250ZW50KGh0bWxfMDE3MjM4NDhjYTA2NDUyZGI1N2VlNDRhZGMxY2M1NjgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTUwYTA4MjM5OTFiNDkwZjlhMzNjNWQ5NGRlNjZmY2MuYmluZFBvcHVwKHBvcHVwXzY1NjRhYTU4ZjM4NzRkMzA5ZDhlYjNlNmFlZjIxODhkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81YjJjMzliNGZiM2U0ZThlYTdlMmZjZWM1ZjQzMGIxZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjU1NTc3MzkwMDAwMDAxLC0xLjc3OTcxNzZdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMWI5ODQ2NTJlNWU5NGJkMjgwYzFhZDU5MzBmNjhjOTYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDRjNTViYTM2OTU2NDU0ZGFlYTJiOGRhOGMyODNlZDQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2ZkOGQ3YzY2ZTRkNDczYmFlYjliNmQ1NzM5YTRlMmIgPSAkKCc8ZGl2IGlkPSJodG1sX2NmZDhkN2M2NmU0ZDQ3M2JhZWI5YjZkNTczOWE0ZTJiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DcmVhdGUgU3R1ZGlvcyBEaWdpdGFsIE1lZGlhIENJQyAoU3dpbmRvbik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQ0YzU1YmEzNjk1NjQ1NGRhZWEyYjhkYThjMjgzZWQ0LnNldENvbnRlbnQoaHRtbF9jZmQ4ZDdjNjZlNGQ0NzNiYWViOWI2ZDU3MzlhNGUyYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81YjJjMzliNGZiM2U0ZThlYTdlMmZjZWM1ZjQzMGIxZC5iaW5kUG9wdXAocG9wdXBfNDRjNTViYTM2OTU2NDU0ZGFlYTJiOGRhOGMyODNlZDQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzc3M2ViMzhjYjJiODQwOTc5NzQ4ZDFlYWQ3ODRhYzkwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNTMwNjI3LC0wLjAyODM1M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF8xYjk4NDY1MmU1ZTk0YmQyODBjMWFkNTkzMGY2OGM5Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82OTkwZDRkNTk0NDI0MjJiYWU2NjhiNjEyZjQ3MDJkYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82MTYyMzRhMmI2ZGI0YWViYmRhMzI5YTAzYmVkZWFjZiA9ICQoJzxkaXYgaWQ9Imh0bWxfNjE2MjM0YTJiNmRiNGFlYmJkYTMyOWEwM2JlZGVhY2YiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJyb21sZXkgYnkgQm93IENlbnRyZSAoQm93LCBUb3dlciBIYW1sZXRzLCBMb25kb24pPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82OTkwZDRkNTk0NDI0MjJiYWU2NjhiNjEyZjQ3MDJkYS5zZXRDb250ZW50KGh0bWxfNjE2MjM0YTJiNmRiNGFlYmJkYTMyOWEwM2JlZGVhY2YpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzczZWIzOGNiMmI4NDA5Nzk3NDhkMWVhZDc4NGFjOTAuYmluZFBvcHVwKHBvcHVwXzY5OTBkNGQ1OTQ0MjQyMmJhZTY2OGI2MTJmNDcwMmRhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wMzkzYzBiNWJjODU0ZDFjOTJjODExNDAyNTA1ZGQxMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjUwNzM1MDksLTAuMTI3NzU4M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF8xYjk4NDY1MmU1ZTk0YmQyODBjMWFkNTkzMGY2OGM5Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80MmRmYjZhMzM5MmM0MWFlYTA3NTU2NzZjNTM5MjcyMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kYzFhM2VlZWU3NDQ0NzFiOWE2ZGE5YWRjYWI1NWE4YSA9ICQoJzxkaXYgaWQ9Imh0bWxfZGMxYTNlZWVlNzQ0NDcxYjlhNmRhOWFkY2FiNTVhOGEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPnbigKJpbnNwaXJlZCAoTG9uZG9uKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDJkZmI2YTMzOTJjNDFhZWEwNzU1Njc2YzUzOTI3MjEuc2V0Q29udGVudChodG1sX2RjMWEzZWVlZTc0NDQ3MWI5YTZkYTlhZGNhYjU1YThhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzAzOTNjMGI1YmM4NTRkMWM5MmM4MTE0MDI1MDVkZDEwLmJpbmRQb3B1cChwb3B1cF80MmRmYjZhMzM5MmM0MWFlYTA3NTU2NzZjNTM5MjcyMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfY2M3MTRlZGZkZGUxNDEyYWFiMjk2OTM5YTcyNTExYjggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41MDczNTA5LC0wLjEyNzc1ODNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMWI5ODQ2NTJlNWU5NGJkMjgwYzFhZDU5MzBmNjhjOTYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODJhZjAzMjM1NzBjNGM3YzgwMGNmMGE4NGJlODViNjcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmY1ZjYyNTBkOGMyNDYwN2I1YzkzMTk3N2Y2YmY2YjYgPSAkKCc8ZGl2IGlkPSJodG1sXzJmNWY2MjUwZDhjMjQ2MDdiNWM5MzE5NzdmNmJmNmI2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Xb21lbiBpbiBQcmlzb24gKExvbmRvbik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzgyYWYwMzIzNTcwYzRjN2M4MDBjZjBhODRiZTg1YjY3LnNldENvbnRlbnQoaHRtbF8yZjVmNjI1MGQ4YzI0NjA3YjVjOTMxOTc3ZjZiZjZiNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jYzcxNGVkZmRkZTE0MTJhYWIyOTY5MzlhNzI1MTFiOC5iaW5kUG9wdXAocG9wdXBfODJhZjAzMjM1NzBjNGM3YzgwMGNmMGE4NGJlODViNjcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2E1YTFhZjFkZDJlYTQ5OTE5ODhmZmFiN2NlY2ZhYmRlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNTA3MzUwOSwtMC4xMjc3NTgzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzFiOTg0NjUyZTVlOTRiZDI4MGMxYWQ1OTMwZjY4Yzk2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ViZTZhY2JkMWU4MzQ0NzI4MzFiZmQyMzY5YjA4YjJiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2MxYWFlZTdjNDc5MDRmYjY4YTYyMTMyNzQyNzI4NGZhID0gJCgnPGRpdiBpZD0iaHRtbF9jMWFhZWU3YzQ3OTA0ZmI2OGE2MjEzMjc0MjcyODRmYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3BpY2UgSW5ub3ZhdGlvbnMgKExvbmRvbik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ViZTZhY2JkMWU4MzQ0NzI4MzFiZmQyMzY5YjA4YjJiLnNldENvbnRlbnQoaHRtbF9jMWFhZWU3YzQ3OTA0ZmI2OGE2MjEzMjc0MjcyODRmYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hNWExYWYxZGQyZWE0OTkxOTg4ZmZhYjdjZWNmYWJkZS5iaW5kUG9wdXAocG9wdXBfZWJlNmFjYmQxZTgzNDQ3MjgzMWJmZDIzNjliMDhiMmIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzcyOTJiNmM3ZWM1ZDQ2NDM5YmQzOTQ4YzkxOTg5MzA4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuMzcwOTIyLDEuMTI3NzcxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzFiOTg0NjUyZTVlOTRiZDI4MGMxYWQ1OTMwZjY4Yzk2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU0NjAzMWY1ZDhiYTRhMTFhZmZhZTkwMmNmZDQ2Zjg1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzcwZGU2NzZkMWVlNzRiMGE5NDI1ZTUyNjk5MDZlM2IwID0gJCgnPGRpdiBpZD0iaHRtbF83MGRlNjc2ZDFlZTc0YjBhOTQyNWU1MjY5OTA2ZTNiMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QnJpZ2h0IFNoYWRvdyAgKEhlcm5lIEJheSk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU0NjAzMWY1ZDhiYTRhMTFhZmZhZTkwMmNmZDQ2Zjg1LnNldENvbnRlbnQoaHRtbF83MGRlNjc2ZDFlZTc0YjBhOTQyNWU1MjY5OTA2ZTNiMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83MjkyYjZjN2VjNWQ0NjQzOWJkMzk0OGM5MTk4OTMwOC5iaW5kUG9wdXAocG9wdXBfNTQ2MDMxZjVkOGJhNGExMWFmZmFlOTAyY2ZkNDZmODUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzE5NjIxODk3NDFmYzQyOGY5NjVhNmIyOTczZTYyZGEwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNTA3MzUwOSwtMC4xMjc3NTgzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzFiOTg0NjUyZTVlOTRiZDI4MGMxYWQ1OTMwZjY4Yzk2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzAxMzE0NDEwOGU0YzQ2N2I4ODRkN2RjZTJkNmU4YTU4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q2NmFkMzEzZmQyNjQ4NDRhOTNhMDQ0NmY5NzVkZTgzID0gJCgnPGRpdiBpZD0iaHRtbF9kNjZhZDMxM2ZkMjY0ODQ0YTkzYTA0NDZmOTc1ZGU4MyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QnJlYXN0IENhbmNlciBDYXJlIChMb25kb24pPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wMTMxNDQxMDhlNGM0NjdiODg0ZDdkY2UyZDZlOGE1OC5zZXRDb250ZW50KGh0bWxfZDY2YWQzMTNmZDI2NDg0NGE5M2EwNDQ2Zjk3NWRlODMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTk2MjE4OTc0MWZjNDI4Zjk2NWE2YjI5NzNlNjJkYTAuYmluZFBvcHVwKHBvcHVwXzAxMzE0NDEwOGU0YzQ2N2I4ODRkN2RjZTJkNmU4YTU4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xZjQxN2Y2NjZlNTc0MmViOWYxOTRkNzAwNTM5ZjMwOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjUwNzM1MDksLTAuMTI3NzU4M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF8xYjk4NDY1MmU1ZTk0YmQyODBjMWFkNTkzMGY2OGM5Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xMDdmMTk5MjIxZTg0OGFlYTY4MjYxNTk1NGM2MTBlMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85ODhkMmQxYjNjYzk0MTZkODNjNDRlYzM4ODAzMzY3MiA9ICQoJzxkaXYgaWQ9Imh0bWxfOTg4ZDJkMWIzY2M5NDE2ZDgzYzQ0ZWMzODgwMzM2NzIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJJU0UgTXV0dWFsIENJQyAoTG9uZG9uLCBVSyk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzEwN2YxOTkyMjFlODQ4YWVhNjgyNjE1OTU0YzYxMGUzLnNldENvbnRlbnQoaHRtbF85ODhkMmQxYjNjYzk0MTZkODNjNDRlYzM4ODAzMzY3Mik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xZjQxN2Y2NjZlNTc0MmViOWYxOTRkNzAwNTM5ZjMwOC5iaW5kUG9wdXAocG9wdXBfMTA3ZjE5OTIyMWU4NDhhZWE2ODI2MTU5NTRjNjEwZTMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzliZmI0MDAwZGM4MjQzYjQ5ODI5ZDRmNmMzYzhjNzBjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNTA3MzUwOSwtMC4xMjc3NTgzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzFiOTg0NjUyZTVlOTRiZDI4MGMxYWQ1OTMwZjY4Yzk2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2UzMDc3MjY0NmMzYTQyYzlhMzEyNzk2ZGZmNjM5NDY3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2JkNzdkMjU2ZTU4ZTRiMjU4MjUwMzgwMjg5ZDU2MTIyID0gJCgnPGRpdiBpZD0iaHRtbF9iZDc3ZDI1NmU1OGU0YjI1ODI1MDM4MDI4OWQ1NjEyMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGlmZWxpbmUgUHJvamVjdCAoTG9uZG9uKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTMwNzcyNjQ2YzNhNDJjOWEzMTI3OTZkZmY2Mzk0Njcuc2V0Q29udGVudChodG1sX2JkNzdkMjU2ZTU4ZTRiMjU4MjUwMzgwMjg5ZDU2MTIyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzliZmI0MDAwZGM4MjQzYjQ5ODI5ZDRmNmMzYzhjNzBjLmJpbmRQb3B1cChwb3B1cF9lMzA3NzI2NDZjM2E0MmM5YTMxMjc5NmRmZjYzOTQ2Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTNkZmNmZTMzMDBmNGU1Njk2OGY4MjZkYTUxNzcxY2UgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS4wNzgxNTk5LC00LjA1ODMzOF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF8xYjk4NDY1MmU1ZTk0YmQyODBjMWFkNTkzMGY2OGM5Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83NTU0OTFlMDNhNGE0MGYyOWQxZThkNmFkMzc4NGVjNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83NTAwM2Y2OTAxMmU0NzBiYjRiYzg4NzUyOWUxZjY0YSA9ICQoJzxkaXYgaWQ9Imh0bWxfNzUwMDNmNjkwMTJlNDcwYmI0YmM4ODc1MjllMWY2NGEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNvdXRoIFdlc3QgRmFtaWx5IFN1cHBvcnQgKEJhcm5zdGFwbGUpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83NTU0OTFlMDNhNGE0MGYyOWQxZThkNmFkMzc4NGVjNy5zZXRDb250ZW50KGh0bWxfNzUwMDNmNjkwMTJlNDcwYmI0YmM4ODc1MjllMWY2NGEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTNkZmNmZTMzMDBmNGU1Njk2OGY4MjZkYTUxNzcxY2UuYmluZFBvcHVwKHBvcHVwXzc1NTQ5MWUwM2E0YTQwZjI5ZDFlOGQ2YWQzNzg0ZWM3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zOTA0YTFjYzExYzA0ODRlODAyODAzY2Q4YTU2MTgyOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjUwNzM1MDksLTAuMTI3NzU4M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF8xYjk4NDY1MmU1ZTk0YmQyODBjMWFkNTkzMGY2OGM5Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mNjU0ZTU2ZTVhMTU0YmVkOTJiZjRhMWY4ODIwZDZmNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81ZDM1MTk1OWY1Njc0ZTgyOWYzNDIzN2JiOGU2MGExYSA9ICQoJzxkaXYgaWQ9Imh0bWxfNWQzNTE5NTlmNTY3NGU4MjlmMzQyMzdiYjhlNjBhMWEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJ1ZGR5SHViIChMb25kb24pPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mNjU0ZTU2ZTVhMTU0YmVkOTJiZjRhMWY4ODIwZDZmNi5zZXRDb250ZW50KGh0bWxfNWQzNTE5NTlmNTY3NGU4MjlmMzQyMzdiYjhlNjBhMWEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzkwNGExY2MxMWMwNDg0ZTgwMjgwM2NkOGE1NjE4MjkuYmluZFBvcHVwKHBvcHVwX2Y2NTRlNTZlNWExNTRiZWQ5MmJmNGExZjg4MjBkNmY2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lNWM5ZmNlMDE2Y2M0ZjA1YTQzMGMzYzgyYTQ3OTQ1OCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjUwNzM1MDksLTAuMTI3NzU4M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF8xYjk4NDY1MmU1ZTk0YmQyODBjMWFkNTkzMGY2OGM5Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zMzA4MzQxYmEzODY0YzVkODA4ZTJkZDIyZTQ3Yzk0MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lMWQ0NDBkMjIwZjY0NWIwYWNiYmUzMGJkOGJkZGRjMCA9ICQoJzxkaXYgaWQ9Imh0bWxfZTFkNDQwZDIyMGY2NDViMGFjYmJlMzBiZDhiZGRkYzAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFubmEgRnJldWQgTmF0aW9uYWwgQ2VudHJlIEZvciBDaGlsZHJlbiBhbmQgRmFtaWxpZXMgKExvbmRvbik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzMzMDgzNDFiYTM4NjRjNWQ4MDhlMmRkMjJlNDdjOTQwLnNldENvbnRlbnQoaHRtbF9lMWQ0NDBkMjIwZjY0NWIwYWNiYmUzMGJkOGJkZGRjMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lNWM5ZmNlMDE2Y2M0ZjA1YTQzMGMzYzgyYTQ3OTQ1OC5iaW5kUG9wdXAocG9wdXBfMzMwODM0MWJhMzg2NGM1ZDgwOGUyZGQyMmU0N2M5NDApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzk0ZDU3NTlhOGM5YjQ4MjNiNDg3ZWNhZGZjNGVhMmU0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNTA3MzUwOSwtMC4xMjc3NTgzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzFiOTg0NjUyZTVlOTRiZDI4MGMxYWQ1OTMwZjY4Yzk2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2JiMmQ0OGNlYTE2OTRlY2Q4N2Q1ZGUyMjc1ODAxMjBkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFiODEzZjdiZTYxYjQzNDRiNGM1NmFkYzY2MDNjNGMwID0gJCgnPGRpdiBpZD0iaHRtbF8xYjgxM2Y3YmU2MWI0MzQ0YjRjNTZhZGM2NjAzYzRjMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SGVscFRleHQgKExvbmRvbik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JiMmQ0OGNlYTE2OTRlY2Q4N2Q1ZGUyMjc1ODAxMjBkLnNldENvbnRlbnQoaHRtbF8xYjgxM2Y3YmU2MWI0MzQ0YjRjNTZhZGM2NjAzYzRjMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85NGQ1NzU5YThjOWI0ODIzYjQ4N2VjYWRmYzRlYTJlNC5iaW5kUG9wdXAocG9wdXBfYmIyZDQ4Y2VhMTY5NGVjZDg3ZDVkZTIyNzU4MDEyMGQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzAxNzZjY2Y5ODhiZDRkOWZhYzAzYzk5M2ZiNWNjNGUyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNTA3MzUwOSwtMC4xMjc3NTgzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzFiOTg0NjUyZTVlOTRiZDI4MGMxYWQ1OTMwZjY4Yzk2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzVhNWNmMTUyZGI5NzQ4MDA5NjU0YzVkOWM5N2JkNTdiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2UzYzQwYjVjZWNhYTRiY2Q5Mjg4MWU4N2I1MGExMGVkID0gJCgnPGRpdiBpZD0iaHRtbF9lM2M0MGI1Y2VjYWE0YmNkOTI4ODFlODdiNTBhMTBlZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QWN0aW9uIEZvciBDaGlsZHJlbiAoTG9uZG9uKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNWE1Y2YxNTJkYjk3NDgwMDk2NTRjNWQ5Yzk3YmQ1N2Iuc2V0Q29udGVudChodG1sX2UzYzQwYjVjZWNhYTRiY2Q5Mjg4MWU4N2I1MGExMGVkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzAxNzZjY2Y5ODhiZDRkOWZhYzAzYzk5M2ZiNWNjNGUyLmJpbmRQb3B1cChwb3B1cF81YTVjZjE1MmRiOTc0ODAwOTY1NGM1ZDljOTdiZDU3Yik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjkwZGY1MWE5MGE4NGIzNDkzMDkzOTk1ZWQwNmQzMzUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41MDczNTA5LC0wLjEyNzc1ODNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMWI5ODQ2NTJlNWU5NGJkMjgwYzFhZDU5MzBmNjhjOTYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzk3NDFjZGZiYWVmNDM4NGFkYmY4ZDY2NzEzOTFmN2UgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzE2NGFjZTYxMmQ1NDJhMjliYzAwMjk0YjIxYmU1ZmEgPSAkKCc8ZGl2IGlkPSJodG1sXzMxNjRhY2U2MTJkNTQyYTI5YmMwMDI5NGIyMWJlNWZhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CZXN0IEJlZ2lubmluZ3MgKExvbmRvbik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2M5NzQxY2RmYmFlZjQzODRhZGJmOGQ2NjcxMzkxZjdlLnNldENvbnRlbnQoaHRtbF8zMTY0YWNlNjEyZDU0MmEyOWJjMDAyOTRiMjFiZTVmYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82OTBkZjUxYTkwYTg0YjM0OTMwOTM5OTVlZDA2ZDMzNS5iaW5kUG9wdXAocG9wdXBfYzk3NDFjZGZiYWVmNDM4NGFkYmY4ZDY2NzEzOTFmN2UpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzY1YzU5ZGZiNTM2MjRiODZiZTQ5YWU2OWM2NGVjZGNlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTAuOTA4NTk2LDAuMjQ5NDIzNV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF8xYjk4NDY1MmU1ZTk0YmQyODBjMWFkNTkzMGY2OGM5Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80NGZiZDcxNWM3YzE0MjAyYjRiNWI3NGFmNDEyMWU0MyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81YTEyMWY2YWE5NTE0OGJiYWRjYjM5ZWVjOTY3NjFhOCA9ICQoJzxkaXYgaWQ9Imh0bWxfNWExMjFmNmFhOTUxNDhiYmFkY2IzOWVlYzk2NzYxYTgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBvc2l0aXZlTmVnYXRpdmVzIChFYXN0IFN1c3NleCk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQ0ZmJkNzE1YzdjMTQyMDJiNGI1Yjc0YWY0MTIxZTQzLnNldENvbnRlbnQoaHRtbF81YTEyMWY2YWE5NTE0OGJiYWRjYjM5ZWVjOTY3NjFhOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82NWM1OWRmYjUzNjI0Yjg2YmU0OWFlNjljNjRlY2RjZS5iaW5kUG9wdXAocG9wdXBfNDRmYmQ3MTVjN2MxNDIwMmI0YjViNzRhZjQxMjFlNDMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNhOWQ2YmQzNGY4NzRiMmM5NDg4ODEyMjcyZDJhNTUzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNTA3MzUwOSwtMC4xMjc3NTgzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzFiOTg0NjUyZTVlOTRiZDI4MGMxYWQ1OTMwZjY4Yzk2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FhOWQwMGI4ZWM0NTRkMjY4NGM2MDQxNzY2ZTZiOTcxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzEyNjMzOGM3YzQyMzQ1NDQ5NzEzZGE4NmIxM2I3ZDcwID0gJCgnPGRpdiBpZD0iaHRtbF8xMjYzMzhjN2M0MjM0NTQ0OTcxM2RhODZiMTNiN2Q3MCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWluaXN0cnkgb2YgU3RvcmllcyAoTG9uZG9uKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYWE5ZDAwYjhlYzQ1NGQyNjg0YzYwNDE3NjZlNmI5NzEuc2V0Q29udGVudChodG1sXzEyNjMzOGM3YzQyMzQ1NDQ5NzEzZGE4NmIxM2I3ZDcwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzNhOWQ2YmQzNGY4NzRiMmM5NDg4ODEyMjcyZDJhNTUzLmJpbmRQb3B1cChwb3B1cF9hYTlkMDBiOGVjNDU0ZDI2ODRjNjA0MTc2NmU2Yjk3MSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfM2U1MDQ1Y2Q5MzRhNGQzMzlhNjcyM2Y2YmI1YjU5YTYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1NS45NTMyNTIsLTMuMTg4MjY3XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzFiOTg0NjUyZTVlOTRiZDI4MGMxYWQ1OTMwZjY4Yzk2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzMzYWRhMzQzYjIxMTRlNDk4NWZhNTg0OWI4MmZkYzliID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2IxNzljOTAzOTc4NjQyN2I4MTI2OTg2YmM4ODM1NTAxID0gJCgnPGRpdiBpZD0iaHRtbF9iMTc5YzkwMzk3ODY0MjdiODEyNjk4NmJjODgzNTUwMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WW91bmcgU2NvdCAoRWRpbmJ1cmdoKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzNhZGEzNDNiMjExNGU0OTg1ZmE1ODQ5YjgyZmRjOWIuc2V0Q29udGVudChodG1sX2IxNzljOTAzOTc4NjQyN2I4MTI2OTg2YmM4ODM1NTAxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzNlNTA0NWNkOTM0YTRkMzM5YTY3MjNmNmJiNWI1OWE2LmJpbmRQb3B1cChwb3B1cF8zM2FkYTM0M2IyMTE0ZTQ5ODVmYTU4NDliODJmZGM5Yik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTNmMzI4Nzg2OTc2NDc0ZDkwMDkyYWNkNjk1M2MxY2YgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41MDczNTA5LC0wLjEyNzc1ODNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMWI5ODQ2NTJlNWU5NGJkMjgwYzFhZDU5MzBmNjhjOTYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmVhYTI1NjUwNmM1NDFiOGEzNjgyODc3MDkxZmQyZDYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjhiYzZmMDQyYzdlNDhlOTk5M2VhNDlmNTdlYTUwYjYgPSAkKCc8ZGl2IGlkPSJodG1sX2I4YmM2ZjA0MmM3ZTQ4ZTk5OTNlYTQ5ZjU3ZWE1MGI2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5UZWNobm9sb2d5IFRydXN0IChMb25kb24pPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iZWFhMjU2NTA2YzU0MWI4YTM2ODI4NzcwOTFmZDJkNi5zZXRDb250ZW50KGh0bWxfYjhiYzZmMDQyYzdlNDhlOTk5M2VhNDlmNTdlYTUwYjYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTNmMzI4Nzg2OTc2NDc0ZDkwMDkyYWNkNjk1M2MxY2YuYmluZFBvcHVwKHBvcHVwX2JlYWEyNTY1MDZjNTQxYjhhMzY4Mjg3NzA5MWZkMmQ2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80NmUzZGI3YmNiNjA0NTExOTI4MmQ4ODRkMWU1MTU3OCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzU0Ljk3ODI1MiwtMS42MTc3OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF8xYjk4NDY1MmU1ZTk0YmQyODBjMWFkNTkzMGY2OGM5Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xN2FiZDdjZWRmNTk0MzcwYWUzYzk2MjEyN2ViNzNkNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85YzllYTlhY2RhODQ0MTdkOWIxNmY1NGM4NDE5OWM1ZSA9ICQoJzxkaXYgaWQ9Imh0bWxfOWM5ZWE5YWNkYTg0NDE3ZDliMTZmNTRjODQxOTljNWUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRlbWVudGlhIENhcmUgKE5ld2Nhc3RsZSB1cG9uIFR5bmUpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xN2FiZDdjZWRmNTk0MzcwYWUzYzk2MjEyN2ViNzNkNy5zZXRDb250ZW50KGh0bWxfOWM5ZWE5YWNkYTg0NDE3ZDliMTZmNTRjODQxOTljNWUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDZlM2RiN2JjYjYwNDUxMTkyODJkODg0ZDFlNTE1NzguYmluZFBvcHVwKHBvcHVwXzE3YWJkN2NlZGY1OTQzNzBhZTNjOTYyMTI3ZWI3M2Q3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82MDc0MDBkZjkxZjE0YTI0YjFlOGU3ZjgzYjA0OTIzZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjQ4MTU4MTAwMDAwMDAxLC0zLjE3OTA5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzFiOTg0NjUyZTVlOTRiZDI4MGMxYWQ1OTMwZjY4Yzk2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M5YTMyM2ZiZjM5NTRmMDA5YWFlNDNmYTY5MGY4OGU1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2UyY2M0ZWJlMGM4MjRmNzk5MWY5NDI2N2IyMzA1YWEzID0gJCgnPGRpdiBpZD0iaHRtbF9lMmNjNGViZTBjODI0Zjc5OTFmOTQyNjdiMjMwNWFhMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QWN0aW9uIG9uIEhlYXJpbmcgTG9zcyBDeW1ydSAoQ2FyZGlmZik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2M5YTMyM2ZiZjM5NTRmMDA5YWFlNDNmYTY5MGY4OGU1LnNldENvbnRlbnQoaHRtbF9lMmNjNGViZTBjODI0Zjc5OTFmOTQyNjdiMjMwNWFhMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82MDc0MDBkZjkxZjE0YTI0YjFlOGU3ZjgzYjA0OTIzZS5iaW5kUG9wdXAocG9wdXBfYzlhMzIzZmJmMzk1NGYwMDlhYWU0M2ZhNjkwZjg4ZTUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzFkNDQwOTllZDhiOTQ1ZDU4ZTE4NTlkOWI0MTMyNWM0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNTA3MzUwOSwtMC4xMjc3NTgzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzFiOTg0NjUyZTVlOTRiZDI4MGMxYWQ1OTMwZjY4Yzk2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg4MjhlZDE3MzBhMzRkOTg4NGMxNzdhZjg5MmNmOWJjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFhNTY5NDUxOGFiOTRjZDBiOWUyOWQ4N2E5ZjIwMTQwID0gJCgnPGRpdiBpZD0iaHRtbF8xYTU2OTQ1MThhYjk0Y2QwYjllMjlkODdhOWYyMDE0MCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VGl0aGVCYXJuIEdpdmluZyBGdW5kIChMb25kb24pPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84ODI4ZWQxNzMwYTM0ZDk4ODRjMTc3YWY4OTJjZjliYy5zZXRDb250ZW50KGh0bWxfMWE1Njk0NTE4YWI5NGNkMGI5ZTI5ZDg3YTlmMjAxNDApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMWQ0NDA5OWVkOGI5NDVkNThlMTg1OWQ5YjQxMzI1YzQuYmluZFBvcHVwKHBvcHVwXzg4MjhlZDE3MzBhMzRkOTg4NGMxNzdhZjg5MmNmOWJjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wNmY1ZGI5YWE5MTg0ZDliYTBiNWI3ZmY1YjYyY2RhYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjUwNzM1MDksLTAuMTI3NzU4M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF8xYjk4NDY1MmU1ZTk0YmQyODBjMWFkNTkzMGY2OGM5Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xMDlmOTVlZDM3YjM0MDMyYjM5ZjI5ZjU0YmI0OTBlYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lMzhmZGM4ZThhN2E0ZTFiYjJkODRlNDBiYjFiYjQ1NiA9ICQoJzxkaXYgaWQ9Imh0bWxfZTM4ZmRjOGU4YTdhNGUxYmIyZDg0ZTQwYmIxYmI0NTYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVjaG8gVmVudHVyZXMgQy5JLkMuIChFYXN0IExvbmRvbik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzEwOWY5NWVkMzdiMzQwMzJiMzlmMjlmNTRiYjQ5MGViLnNldENvbnRlbnQoaHRtbF9lMzhmZGM4ZThhN2E0ZTFiYjJkODRlNDBiYjFiYjQ1Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wNmY1ZGI5YWE5MTg0ZDliYTBiNWI3ZmY1YjYyY2RhYi5iaW5kUG9wdXAocG9wdXBfMTA5Zjk1ZWQzN2IzNDAzMmIzOWYyOWY1NGJiNDkwZWIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzM5NjcyNDk5OTc2NTQzZDE4Y2E4MDU2NDJiZTdiOTVhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNTM4ODg5OTk5OTk5OTksMC4xNDc0M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF8xYjk4NDY1MmU1ZTk0YmQyODBjMWFkNTkzMGY2OGM5Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zZDBlNTAwYWQ3Mzk0ZjI3YWIzMGY5NDkzNmViODFkNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iYTAwYjUwMWE1ZGY0YjllYjVlN2ZkYmIzODU5MjI1OSA9ICQoJzxkaXYgaWQ9Imh0bWxfYmEwMGI1MDFhNWRmNGI5ZWI1ZTdmZGJiMzg1OTIyNTkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNvbW11bml0eSBSZXNvdXJjZXMgZm9yIENoYW5nZSAoRGFnZW5oYW0pPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zZDBlNTAwYWQ3Mzk0ZjI3YWIzMGY5NDkzNmViODFkNS5zZXRDb250ZW50KGh0bWxfYmEwMGI1MDFhNWRmNGI5ZWI1ZTdmZGJiMzg1OTIyNTkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzk2NzI0OTk5NzY1NDNkMThjYTgwNTY0MmJlN2I5NWEuYmluZFBvcHVwKHBvcHVwXzNkMGU1MDBhZDczOTRmMjdhYjMwZjk0OTM2ZWI4MWQ1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xZjdmNzFjN2ZkYTQ0NjEwODE5NDY4NGVjOTNhY2QzNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjUwNzM1MDksLTAuMTI3NzU4M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF8xYjk4NDY1MmU1ZTk0YmQyODBjMWFkNTkzMGY2OGM5Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yNzM2MjgxYmZmMTQ0MDdmYTNjM2E2YjQyNWQ5YjQ0MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mOTA2YWJhZTRkYjg0NjRmYTFjZWIzZDE5MTA4MTYzYSA9ICQoJzxkaXYgaWQ9Imh0bWxfZjkwNmFiYWU0ZGI4NDY0ZmExY2ViM2QxOTEwODE2M2EiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNlbnRyZXBvaW50IChMb25kb24pPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yNzM2MjgxYmZmMTQ0MDdmYTNjM2E2YjQyNWQ5YjQ0Mi5zZXRDb250ZW50KGh0bWxfZjkwNmFiYWU0ZGI4NDY0ZmExY2ViM2QxOTEwODE2M2EpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMWY3ZjcxYzdmZGE0NDYxMDgxOTQ2ODRlYzkzYWNkMzcuYmluZFBvcHVwKHBvcHVwXzI3MzYyODFiZmYxNDQwN2ZhM2MzYTZiNDI1ZDliNDQyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xMzJlNzYxOTY3YjU0NzBhYmI0ZTllY2Q1YWNjYWUyMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjUwNzM1MDksLTAuMTI3NzU4M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF8xYjk4NDY1MmU1ZTk0YmQyODBjMWFkNTkzMGY2OGM5Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xMTgxOWM4MGM0MDY0Nzg1ODAxMTExOWQ3YjRlOTI4YiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80Y2NlNTU2MmUyYjg0ZDg0OGYwNTZkZTQxZDYzY2E3NCA9ICQoJzxkaXYgaWQ9Imh0bWxfNGNjZTU1NjJlMmI4NGQ4NDhmMDU2ZGU0MWQ2M2NhNzQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk11bHRpcGxlIFNjbGVyb3NpcyAoTVMpIFNvY2lldHkgKExvbmRvbik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzExODE5YzgwYzQwNjQ3ODU4MDExMTE5ZDdiNGU5MjhiLnNldENvbnRlbnQoaHRtbF80Y2NlNTU2MmUyYjg0ZDg0OGYwNTZkZTQxZDYzY2E3NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xMzJlNzYxOTY3YjU0NzBhYmI0ZTllY2Q1YWNjYWUyMi5iaW5kUG9wdXAocG9wdXBfMTE4MTljODBjNDA2NDc4NTgwMTExMTlkN2I0ZTkyOGIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQwOGNhMjdiNDkwODQ2NGFiN2ZhYzE1NTlhNGFmZDA0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTAuMzc1NDU2NSwtNC4xNDI2NTY1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzFiOTg0NjUyZTVlOTRiZDI4MGMxYWQ1OTMwZjY4Yzk2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FjNDhiZWE1ODgwMDRkYTI4N2M0NDhmMWEzNWFiZTYyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M3YmYwODRiNDUxMzQ1NmVhMTg3ODJiZDI2MjczNDViID0gJCgnPGRpdiBpZD0iaHRtbF9jN2JmMDg0YjQ1MTM0NTZlYTE4NzgyYmQyNjI3MzQ1YiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UGx5bW91dGggTXVzaWMgWm9uZSAoUGx5bW91dGgpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hYzQ4YmVhNTg4MDA0ZGEyODdjNDQ4ZjFhMzVhYmU2Mi5zZXRDb250ZW50KGh0bWxfYzdiZjA4NGI0NTEzNDU2ZWExODc4MmJkMjYyNzM0NWIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDA4Y2EyN2I0OTA4NDY0YWI3ZmFjMTU1OWE0YWZkMDQuYmluZFBvcHVwKHBvcHVwX2FjNDhiZWE1ODgwMDRkYTI4N2M0NDhmMWEzNWFiZTYyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83M2IyODllYjIzY2U0MTY2OTk2NTlkZWExNmM0NmJjNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjUwNzM1MDksLTAuMTI3NzU4M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMCwgMTI4LCAxNTYpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF8xYjk4NDY1MmU1ZTk0YmQyODBjMWFkNTkzMGY2OGM5Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80M2QxYjZmOGZmYWY0MjQ0OTQ2NzNjNWRlMjAwOTY1NiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zOTI0YmJjYjM1OGU0YjFjOTk1N2EwOTg4NTE4NThmOSA9ICQoJzxkaXYgaWQ9Imh0bWxfMzkyNGJiY2IzNThlNGIxYzk5NTdhMDk4ODUxODU4ZjkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlN0ZXAgdXAgdG8gU2VydmUgKExvbmRvbik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQzZDFiNmY4ZmZhZjQyNDQ5NDY3M2M1ZGUyMDA5NjU2LnNldENvbnRlbnQoaHRtbF8zOTI0YmJjYjM1OGU0YjFjOTk1N2EwOTg4NTE4NThmOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83M2IyODllYjIzY2U0MTY2OTk2NTlkZWExNmM0NmJjNy5iaW5kUG9wdXAocG9wdXBfNDNkMWI2ZjhmZmFmNDI0NDk0NjczYzVkZTIwMDk2NTYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzM5NTMwZGQ1MDY5ODRmZGViYzNjN2MwZmQ4N2ZiZmUwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuMzc1ODAxLC0yLjM1OTkwMzldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDAsIDEyOCwgMTU2KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigwLCAxMjgsIDE1NiknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMWI5ODQ2NTJlNWU5NGJkMjgwYzFhZDU5MzBmNjhjOTYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjJhM2Q2YWY4YWZiNDE1Y2ExMDJlMzMwZWVkZTAzMDEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDVhNWVjM2QyZDkxNGM2OWFmZjZiNmRiOTg3YTRlYTYgPSAkKCc8ZGl2IGlkPSJodG1sXzQ1YTVlYzNkMmQ5MTRjNjlhZmY2YjZkYjk4N2E0ZWE2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CYXRoIENhcmVycyBFbnRlcnByaXNlcyBMdGQgKEJhdGgpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82MmEzZDZhZjhhZmI0MTVjYTEwMmUzMzBlZWRlMDMwMS5zZXRDb250ZW50KGh0bWxfNDVhNWVjM2QyZDkxNGM2OWFmZjZiNmRiOTg3YTRlYTYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzk1MzBkZDUwNjk4NGZkZWJjM2M3YzBmZDg3ZmJmZTAuYmluZFBvcHVwKHBvcHVwXzYyYTNkNmFmOGFmYjQxNWNhMTAyZTMzMGVlZGUwMzAxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBmZWF0dXJlX2dyb3VwXzZjOTI5ODJjZjk2NTRmM2M5NjgwYzRlMzIyNjUyOWNlID0gTC5mZWF0dXJlR3JvdXAoCiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jY2NmZDY5NTlhYTc0YjhmOTI4YzBjMGNmM2QyYmRiMyk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2QzYzQyMzJlMTFjNzQ4NGM4Y2IzZWQ1Y2RhNGYxMTI4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTMuODAwNzU1NCwtMS41NDkwNzc0XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF82YzkyOTgyY2Y5NjU0ZjNjOTY4MGM0ZTMyMjY1MjljZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jYzRmNThiM2MwOWY0MmM3YTNiMjdjNjAxYzNkM2ExOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83ODRjMmJiZTVmY2E0ZjJjYjJiYmZjYjg5ZjY0ZDJlZCA9ICQoJzxkaXYgaWQ9Imh0bWxfNzg0YzJiYmU1ZmNhNGYyY2IyYmJmY2I4OWY2NGQyZWQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9ibG9uZyAoTGVlZHMpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jYzRmNThiM2MwOWY0MmM3YTNiMjdjNjAxYzNkM2ExOC5zZXRDb250ZW50KGh0bWxfNzg0YzJiYmU1ZmNhNGYyY2IyYmJmY2I4OWY2NGQyZWQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDNjNDIzMmUxMWM3NDg0YzhjYjNlZDVjZGE0ZjExMjguYmluZFBvcHVwKHBvcHVwX2NjNGY1OGIzYzA5ZjQyYzdhM2IyN2M2MDFjM2QzYTE4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84MmE2ZTZjYzNkMjg0NzRmODFmMzcxMmZmODQzMGM5ZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjUwNzM1MDksLTAuMTI3NzU4M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmM5Mjk4MmNmOTY1NGYzYzk2ODBjNGUzMjI2NTI5Y2UpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjA0ZWExZDUyOTMxNDdiZDg4ZGFmYWY5N2IzZTQyZmEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTkyZDc4ZWY5Mjk5NDUzNGJmYTIzYTc4YWM3MzM2MjQgPSAkKCc8ZGl2IGlkPSJodG1sX2U5MmQ3OGVmOTI5OTQ1MzRiZmEyM2E3OGFjNzMzNjI0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Nb21lbnR1bSBXb3JsZCBDSUMgKExvbmRvbik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2IwNGVhMWQ1MjkzMTQ3YmQ4OGRhZmFmOTdiM2U0MmZhLnNldENvbnRlbnQoaHRtbF9lOTJkNzhlZjkyOTk0NTM0YmZhMjNhNzhhYzczMzYyNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84MmE2ZTZjYzNkMjg0NzRmODFmMzcxMmZmODQzMGM5ZC5iaW5kUG9wdXAocG9wdXBfYjA0ZWExZDUyOTMxNDdiZDg4ZGFmYWY5N2IzZTQyZmEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzdlOGZkZTYxNDRhYjQ5Zjg5NDc3NDEzMzJlYzE3YmJlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTMuNDA4MzcxNCwtMi45OTE1NzI2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF82YzkyOTgyY2Y5NjU0ZjNjOTY4MGM0ZTMyMjY1MjljZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kMjE5YmIyMTk5MTk0N2I1YjUzYzBlYWJkZjBhMDYwMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82YjQ4NmZmOTJhZWY0NGRmODMwNzdiZGM4YTQ2Mjg5NSA9ICQoJzxkaXYgaWQ9Imh0bWxfNmI0ODZmZjkyYWVmNDRkZjgzMDc3YmRjOGE0NjI4OTUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlRoZSBXb21lbiYjMzk7cyBPcmdhbmlzYXRpb24gKExpdmVycG9vbCk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2QyMTliYjIxOTkxOTQ3YjViNTNjMGVhYmRmMGEwNjAzLnNldENvbnRlbnQoaHRtbF82YjQ4NmZmOTJhZWY0NGRmODMwNzdiZGM4YTQ2Mjg5NSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83ZThmZGU2MTQ0YWI0OWY4OTQ3NzQxMzMyZWMxN2JiZS5iaW5kUG9wdXAocG9wdXBfZDIxOWJiMjE5OTE5NDdiNWI1M2MwZWFiZGYwYTA2MDMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2MzM2I1MjVmNWVlZjRhMTdiOTQzMDg5NTdlMDNmMjI2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTIuOTU0NzgzMTk5OTk5OTksLTEuMTU4MTA4Nl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmM5Mjk4MmNmOTY1NGYzYzk2ODBjNGUzMjI2NTI5Y2UpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjI5NWViZmJkMTg5NGZkYjhhNzU0MzNhYzA1MDlhOWQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmY3YTdjMDYxY2Y4NDQxYmExODNiOGIzNTM2YzFkMjUgPSAkKCc8ZGl2IGlkPSJodG1sXzZmN2E3YzA2MWNmODQ0MWJhMTgzYjhiMzUzNmMxZDI1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ob3R0aW5naGFtIENvbW11bml0eSBIb3VzaW5nIEFzc29jaWF0aW9uIChOb3R0aW5naGFtKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjI5NWViZmJkMTg5NGZkYjhhNzU0MzNhYzA1MDlhOWQuc2V0Q29udGVudChodG1sXzZmN2E3YzA2MWNmODQ0MWJhMTgzYjhiMzUzNmMxZDI1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2MzM2I1MjVmNWVlZjRhMTdiOTQzMDg5NTdlMDNmMjI2LmJpbmRQb3B1cChwb3B1cF9iMjk1ZWJmYmQxODk0ZmRiOGE3NTQzM2FjMDUwOWE5ZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMmIzMzc4MzljZDA1NDc2MmJiNzczNThhYzQwZWIwMWQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41MDczNTA5LC0wLjEyNzc1ODNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzZjOTI5ODJjZjk2NTRmM2M5NjgwYzRlMzIyNjUyOWNlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzI0NmJkZWZhMGIwMzQzN2Q4MTMzZjYyNmUwODEzODUzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzIzYWVlNmNhYzliYjRkYThiY2JjZWUwYTM2NWRjMmQ0ID0gJCgnPGRpdiBpZD0iaHRtbF8yM2FlZTZjYWM5YmI0ZGE4YmNiY2VlMGEzNjVkYzJkNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGl0dGxlIEFuZ2VsIFRoZWF0cmUgKExvbmRvbik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzI0NmJkZWZhMGIwMzQzN2Q4MTMzZjYyNmUwODEzODUzLnNldENvbnRlbnQoaHRtbF8yM2FlZTZjYWM5YmI0ZGE4YmNiY2VlMGEzNjVkYzJkNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yYjMzNzgzOWNkMDU0NzYyYmI3NzM1OGFjNDBlYjAxZC5iaW5kUG9wdXAocG9wdXBfMjQ2YmRlZmEwYjAzNDM3ZDgxMzNmNjI2ZTA4MTM4NTMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2M1NWNkMmY0ZjlkNzQ1NjNhY2Y2YjY4Yjg3NDBjMTVkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuMjgwMjMzLDEuMDc4OTA4OV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmM5Mjk4MmNmOTY1NGYzYzk2ODBjNGUzMjI2NTI5Y2UpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjJkMmJlNzg4ZjE5NGU5MTg2YzE5OGUzODdhNmJhODUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzc2OGVmNjUwY2Q1NDFjZjkwZjEzYjYxMGRjM2FhMzcgPSAkKCc8ZGl2IGlkPSJodG1sXzM3NjhlZjY1MGNkNTQxY2Y5MGYxM2I2MTBkYzNhYTM3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SZWZ1Z2VlIExpdmUgKENhbnRlcmJ1cnkpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82MmQyYmU3ODhmMTk0ZTkxODZjMTk4ZTM4N2E2YmE4NS5zZXRDb250ZW50KGh0bWxfMzc2OGVmNjUwY2Q1NDFjZjkwZjEzYjYxMGRjM2FhMzcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzU1Y2QyZjRmOWQ3NDU2M2FjZjZiNjhiODc0MGMxNWQuYmluZFBvcHVwKHBvcHVwXzYyZDJiZTc4OGYxOTRlOTE4NmMxOThlMzg3YTZiYTg1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wNTdkYTU3NzlhYjY0ZmZmYjQ1MDBlYTE2MjgxMjc1ZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjUwNzM1MDksLTAuMTI3NzU4M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmM5Mjk4MmNmOTY1NGYzYzk2ODBjNGUzMjI2NTI5Y2UpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDcxY2E0NmY4NzVmNDU3OTk0ZjJlYThjMTUxMzM4NWQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzI1ZmY4NzljZTJiNGQ5Y2ExNTkxMGQ5MGYzY2QyZjAgPSAkKCc8ZGl2IGlkPSJodG1sXzcyNWZmODc5Y2UyYjRkOWNhMTU5MTBkOTBmM2NkMmYwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DYXJpdGFzIEFuY2hvciBIb3VzZSAoTG9uZG9uKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDcxY2E0NmY4NzVmNDU3OTk0ZjJlYThjMTUxMzM4NWQuc2V0Q29udGVudChodG1sXzcyNWZmODc5Y2UyYjRkOWNhMTU5MTBkOTBmM2NkMmYwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzA1N2RhNTc3OWFiNjRmZmZiNDUwMGVhMTYyODEyNzVkLmJpbmRQb3B1cChwb3B1cF8wNzFjYTQ2Zjg3NWY0NTc5OTRmMmVhOGMxNTEzMzg1ZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzRmNTVhNjg3MWYzNDQwMTg1NTA0MTZlZmFiNDFkOGEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1My40ODA3NTkzLC0yLjI0MjYzMDVdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzZjOTI5ODJjZjk2NTRmM2M5NjgwYzRlMzIyNjUyOWNlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2I2MjgwZTUwOGMxNzQ2MzViZmY5MzI3OTMzYTNlZTM1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzVhNWJjMWQ0ZmVlNDQyMDdhZTcwNmQwMzc5MDhiYzM2ID0gJCgnPGRpdiBpZD0iaHRtbF81YTViYzFkNGZlZTQ0MjA3YWU3MDZkMDM3OTA4YmMzNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UXVlZXIgTWVkaWEgIChNYW5jaGVzdGVyICk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I2MjgwZTUwOGMxNzQ2MzViZmY5MzI3OTMzYTNlZTM1LnNldENvbnRlbnQoaHRtbF81YTViYzFkNGZlZTQ0MjA3YWU3MDZkMDM3OTA4YmMzNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jNGY1NWE2ODcxZjM0NDAxODU1MDQxNmVmYWI0MWQ4YS5iaW5kUG9wdXAocG9wdXBfYjYyODBlNTA4YzE3NDYzNWJmZjkzMjc5MzNhM2VlMzUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NiOGE5MTZjMGRiZjQ0ZGRiZGMzZTg0MmRlY2NjMTAyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTQuOTc4MjUyLC0xLjYxNzc4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF82YzkyOTgyY2Y5NjU0ZjNjOTY4MGM0ZTMyMjY1MjljZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85YTViZWVmYTZjZmM0OGYzOTU5MTZlYTBkNmZlM2M1MyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83OTRjYTAwOGQ4MTk0YjJjYWZkZjRhYTc1ZTNlZTAwZCA9ICQoJzxkaXYgaWQ9Imh0bWxfNzk0Y2EwMDhkODE5NGIyY2FmZGY0YWE3NWUzZWUwMGQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmNoaXBjaGFzZSBob3VzZSBwaXAgcHJvZ3JhbW1lIHBlcmN5IGhlZGxleSBmb3VuZGF0aW9uIChwZXJjeSBoZWRsZXkgZm91bmRhdGlvbiBuZXdjYXN0bGUgdXBvbiB0eW5lKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOWE1YmVlZmE2Y2ZjNDhmMzk1OTE2ZWEwZDZmZTNjNTMuc2V0Q29udGVudChodG1sXzc5NGNhMDA4ZDgxOTRiMmNhZmRmNGFhNzVlM2VlMDBkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2NiOGE5MTZjMGRiZjQ0ZGRiZGMzZTg0MmRlY2NjMTAyLmJpbmRQb3B1cChwb3B1cF85YTViZWVmYTZjZmM0OGYzOTU5MTZlYTBkNmZlM2M1Myk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWIwMTYyNWZlYWFiNDQ0Nzg3MzI2NzlkMDg3ZDYwM2QgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1My44MDA3NTU0LC0xLjU0OTA3NzRdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzZjOTI5ODJjZjk2NTRmM2M5NjgwYzRlMzIyNjUyOWNlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E5OGYwNzRjNWZhYjRjZjk4MzdkZGFiNGZhYmJkOTU4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzk1OTZhN2MxMWE2ZTRkYmI5YTZmMzg5ODZlNjMyMWY2ID0gJCgnPGRpdiBpZD0iaHRtbF85NTk2YTdjMTFhNmU0ZGJiOWE2ZjM4OTg2ZTYzMjFmNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QXR0aWdvIENJQyAoTGVlZHMpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hOThmMDc0YzVmYWI0Y2Y5ODM3ZGRhYjRmYWJiZDk1OC5zZXRDb250ZW50KGh0bWxfOTU5NmE3YzExYTZlNGRiYjlhNmYzODk4NmU2MzIxZjYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMWIwMTYyNWZlYWFiNDQ0Nzg3MzI2NzlkMDg3ZDYwM2QuYmluZFBvcHVwKHBvcHVwX2E5OGYwNzRjNWZhYjRjZjk4MzdkZGFiNGZhYmJkOTU4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wZTVkZTYxNTRjNjY0MjQxYmU0YWY3NDZjMTNiNWQ5MyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjUwNzM1MDksLTAuMTI3NzU4M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmM5Mjk4MmNmOTY1NGYzYzk2ODBjNGUzMjI2NTI5Y2UpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2VlNGUyNTQzY2IyNDM2MjkwNDUxZTA2OTJiYmE4NWUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzI1Y2I5YTE0ZTVkNDkxYWE4YWMxMmRjZGRkODkwZmIgPSAkKCc8ZGl2IGlkPSJodG1sX2MyNWNiOWExNGU1ZDQ5MWFhOGFjMTJkY2RkZDg5MGZiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SZWRSIFVLIChMb25kb24pPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83ZWU0ZTI1NDNjYjI0MzYyOTA0NTFlMDY5MmJiYTg1ZS5zZXRDb250ZW50KGh0bWxfYzI1Y2I5YTE0ZTVkNDkxYWE4YWMxMmRjZGRkODkwZmIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMGU1ZGU2MTU0YzY2NDI0MWJlNGFmNzQ2YzEzYjVkOTMuYmluZFBvcHVwKHBvcHVwXzdlZTRlMjU0M2NiMjQzNjI5MDQ1MWUwNjkyYmJhODVlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xNzE1MmFhZjc3NWE0YTgwOWI0ZjNjYmFiNTNiMGQ3MyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUyLjIwNTMzNywwLjEyMTgxN10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmM5Mjk4MmNmOTY1NGYzYzk2ODBjNGUzMjI2NTI5Y2UpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDQ2MjEwNWI3MDZiNDkyZjk4NjYzZjdmODM4ZmNjNTYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjE4Nzc0MjhlODczNGUwZjliYWNkMmRlYTEyZTBiMjQgPSAkKCc8ZGl2IGlkPSJodG1sXzIxODc3NDI4ZTg3MzRlMGY5YmFjZDJkZWExMmUwYjI0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SZWQgQmFsbG9vbiBMZWFybmVyIENlbnRyZSBHcm91cCAoQ2FtYnJpZGdlKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDQ2MjEwNWI3MDZiNDkyZjk4NjYzZjdmODM4ZmNjNTYuc2V0Q29udGVudChodG1sXzIxODc3NDI4ZTg3MzRlMGY5YmFjZDJkZWExMmUwYjI0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzE3MTUyYWFmNzc1YTRhODA5YjRmM2NiYWI1M2IwZDczLmJpbmRQb3B1cChwb3B1cF9kNDYyMTA1YjcwNmI0OTJmOTg2NjNmN2Y4MzhmY2M1Nik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOGUyMjIyYzM0MTdmNDU1NmJlOGY5N2NmODg0NDkzZWUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41MDczNTA5LC0wLjEyNzc1ODNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzZjOTI5ODJjZjk2NTRmM2M5NjgwYzRlMzIyNjUyOWNlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2YxYjQ2N2E1OGRkZDQ1MDU4MjQ5Mzk4NTNiNWUzMGE5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU4YWU1ZTk0N2I1OTQyOTU4ZGUyZDY5Zjc1MjhlZjEzID0gJCgnPGRpdiBpZD0iaHRtbF81OGFlNWU5NDdiNTk0Mjk1OGRlMmQ2OWY3NTI4ZWYxMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V29ya2luZyBXZWxsIFRydXN0IChMb25kb24sIFVuaXRlZCBLaW5nZG9tKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjFiNDY3YTU4ZGRkNDUwNTgyNDkzOTg1M2I1ZTMwYTkuc2V0Q29udGVudChodG1sXzU4YWU1ZTk0N2I1OTQyOTU4ZGUyZDY5Zjc1MjhlZjEzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzhlMjIyMmMzNDE3ZjQ1NTZiZThmOTdjZjg4NDQ5M2VlLmJpbmRQb3B1cChwb3B1cF9mMWI0NjdhNThkZGQ0NTA1ODI0OTM5ODUzYjVlMzBhOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjUwN2FlNTllY2JmNDNiNGFiNmIxYzU3NzY1NWI2ZDUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1My41NzY4NjQ2OTk5OTk5OSwtMi40MjgyMTkyXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF82YzkyOTgyY2Y5NjU0ZjNjOTY4MGM0ZTMyMjY1MjljZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jZGI2OTcxNzY4MzQ0YjI5YTRhZjNjNjA2ZGY4OGYyNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hZWQ5MGRhY2RkYTU0MTExYTc4Y2ZmMWU0MGE5ZTM1MiA9ICQoJzxkaXYgaWQ9Imh0bWxfYWVkOTBkYWNkZGE1NDExMWE3OGNmZjFlNDBhOWUzNTIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPndlbGwtZ29vZCB3YXRlciBhaWQgQ0lDIChCb2x0b24pPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jZGI2OTcxNzY4MzQ0YjI5YTRhZjNjNjA2ZGY4OGYyNi5zZXRDb250ZW50KGh0bWxfYWVkOTBkYWNkZGE1NDExMWE3OGNmZjFlNDBhOWUzNTIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjUwN2FlNTllY2JmNDNiNGFiNmIxYzU3NzY1NWI2ZDUuYmluZFBvcHVwKHBvcHVwX2NkYjY5NzE3NjgzNDRiMjlhNGFmM2M2MDZkZjg4ZjI2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hZWMwNzI4YjA1MTk0MWFlYmM0ZjE5NDhkNTI5NWM0MCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUzLjQwODM3MTQsLTIuOTkxNTcyNl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmM5Mjk4MmNmOTY1NGYzYzk2ODBjNGUzMjI2NTI5Y2UpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGYyZmUzYmI1NmFmNDQ0OWEyMzNjOTcyZWVkNDcyMTAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDA2Y2ZjOGFiNTE2NDE5ZTg5MzMxMGNlZTk1YjBhOGIgPSAkKCc8ZGl2IGlkPSJodG1sXzAwNmNmYzhhYjUxNjQxOWU4OTMzMTBjZWU5NWIwYThiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Gb3VuZGF0aW9uIFNjaG9vbCBvZiBNYXJ0aWFsIEFydHMgKExpdmVycG9vbCk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzBmMmZlM2JiNTZhZjQ0NDlhMjMzYzk3MmVlZDQ3MjEwLnNldENvbnRlbnQoaHRtbF8wMDZjZmM4YWI1MTY0MTllODkzMzEwY2VlOTViMGE4Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hZWMwNzI4YjA1MTk0MWFlYmM0ZjE5NDhkNTI5NWM0MC5iaW5kUG9wdXAocG9wdXBfMGYyZmUzYmI1NmFmNDQ0OWEyMzNjOTcyZWVkNDcyMTApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg5YTk4MThmZGM1ZDQ0Mzk5MWRiMGJjOTdiZDQxOGQwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNTA3MzUwOSwtMC4xMjc3NTgzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF82YzkyOTgyY2Y5NjU0ZjNjOTY4MGM0ZTMyMjY1MjljZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iYzZmNGJkNDU5YWU0MzJiOTNlMDJkZDNiZjFmZWZhYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xNmFiMjU5NjZjM2M0N2I5ODNhMTMwODEyOTlmM2IwNyA9ICQoJzxkaXYgaWQ9Imh0bWxfMTZhYjI1OTY2YzNjNDdiOTgzYTEzMDgxMjk5ZjNiMDciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFjdGlvbiBmb3IgU3RhbW1lcmluZyBDaGlsZHJlbiAoTG9uZG9uKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYmM2ZjRiZDQ1OWFlNDMyYjkzZTAyZGQzYmYxZmVmYWIuc2V0Q29udGVudChodG1sXzE2YWIyNTk2NmMzYzQ3Yjk4M2ExMzA4MTI5OWYzYjA3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzg5YTk4MThmZGM1ZDQ0Mzk5MWRiMGJjOTdiZDQxOGQwLmJpbmRQb3B1cChwb3B1cF9iYzZmNGJkNDU5YWU0MzJiOTNlMDJkZDNiZjFmZWZhYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzgyYzIxODVhNjAxNDE2MzgwNDM0ZDZhMzE5ZjMyMzggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1NC45NzgyNTIsLTEuNjE3NzhdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzZjOTI5ODJjZjk2NTRmM2M5NjgwYzRlMzIyNjUyOWNlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ZiNmI0Mzc2ZTc0YjQ4ZDFiNzI5ZGQ0NTFlNjY2ZmFmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzhmZTcyYjFhNDQzYzQ2OGE5OGVlMTdlYzU0YzgyMDJjID0gJCgnPGRpdiBpZD0iaHRtbF84ZmU3MmIxYTQ0M2M0NjhhOThlZTE3ZWM1NGM4MjAyYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U29jaWFsIEZpbmFuY2UgTHRkIChOZXdjYXN0bGUpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mYjZiNDM3NmU3NGI0OGQxYjcyOWRkNDUxZTY2NmZhZi5zZXRDb250ZW50KGh0bWxfOGZlNzJiMWE0NDNjNDY4YTk4ZWUxN2VjNTRjODIwMmMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzgyYzIxODVhNjAxNDE2MzgwNDM0ZDZhMzE5ZjMyMzguYmluZFBvcHVwKHBvcHVwX2ZiNmI0Mzc2ZTc0YjQ4ZDFiNzI5ZGQ0NTFlNjY2ZmFmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83ZDQyMjVmNjMxZjE0NTRlYjM1MDZlZDI4OTZkMGY3OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjUyNTUxNjIsMC4wMzUyMTYzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF82YzkyOTgyY2Y5NjU0ZjNjOTY4MGM0ZTMyMjY1MjljZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lNTVhYzFlNTg0MDc0YzAwOWFmZmI1ZTc1ODZiYjc0YSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83OTVmOTU3ZDgyMzk0MGIxYTg4Mjc2NGY2NmMyMmFkNiA9ICQoJzxkaXYgaWQ9Imh0bWxfNzk1Zjk1N2Q4MjM5NDBiMWE4ODI3NjRmNjZjMjJhZDYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFzdG9uLU1hbnNmaWVsZCAoTG9uZG9uIEJvcm91Z2ggb2YgTmV3aGFtKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTU1YWMxZTU4NDA3NGMwMDlhZmZiNWU3NTg2YmI3NGEuc2V0Q29udGVudChodG1sXzc5NWY5NTdkODIzOTQwYjFhODgyNzY0ZjY2YzIyYWQ2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzdkNDIyNWY2MzFmMTQ1NGViMzUwNmVkMjg5NmQwZjc5LmJpbmRQb3B1cChwb3B1cF9lNTVhYzFlNTg0MDc0YzAwOWFmZmI1ZTc1ODZiYjc0YSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNWRmNTY5NTIzOWNiNGZlMWIxN2M5MjgwNWE3OThlOTcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41NDY1MDYzLC0wLjEwNTgwNThdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzZjOTI5ODJjZjk2NTRmM2M5NjgwYzRlMzIyNjUyOWNlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzMzZTc0Zjk3OGJmZTQ5OTFiM2JmNGExNDNlOGIyMjMxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJjMjA0MDNjNGNhNTQxZmI5Y2E3MzRhYTI2NTM3YmNlID0gJCgnPGRpdiBpZD0iaHRtbF8yYzIwNDAzYzRjYTU0MWZiOWNhNzM0YWEyNjUzN2JjZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TG9uZG9uIFZpbGxhZ2UgTmV0d29yayAoSXNsaW5ndG9uOiBMb25kb24pPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zM2U3NGY5NzhiZmU0OTkxYjNiZjRhMTQzZThiMjIzMS5zZXRDb250ZW50KGh0bWxfMmMyMDQwM2M0Y2E1NDFmYjljYTczNGFhMjY1MzdiY2UpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNWRmNTY5NTIzOWNiNGZlMWIxN2M5MjgwNWE3OThlOTcuYmluZFBvcHVwKHBvcHVwXzMzZTc0Zjk3OGJmZTQ5OTFiM2JmNGExNDNlOGIyMjMxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hYzgyZGE5MzBhMTc0MTE5YTMzOTQ4ZDdjOGViN2FiNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjU0NTkyNjksMC43MDc3MTIzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF82YzkyOTgyY2Y5NjU0ZjNjOTY4MGM0ZTMyMjY1MjljZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zMWVlZGY1MjEzMTQ0ZDQxYjA5YTlmYjhjMmVhZjg4ZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yMGUzNGYzNzJhN2I0MDM4OTQ2NzcxYjgzM2EyYzJmMSA9ICQoJzxkaXYgaWQ9Imh0bWxfMjBlMzRmMzcyYTdiNDAzODk0Njc3MWI4MzNhMmMyZjEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJsYWRlIEVkdWNhdGlvbiAoU291dGhlbmQtb24tU2VhKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzFlZWRmNTIxMzE0NGQ0MWIwOWE5ZmI4YzJlYWY4OGUuc2V0Q29udGVudChodG1sXzIwZTM0ZjM3MmE3YjQwMzg5NDY3NzFiODMzYTJjMmYxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2FjODJkYTkzMGExNzQxMTlhMzM5NDhkN2M4ZWI3YWI1LmJpbmRQb3B1cChwb3B1cF8zMWVlZGY1MjEzMTQ0ZDQxYjA5YTlmYjhjMmVhZjg4ZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTIyZjRkZDRjYjk5NDY2M2FiODVjMGQyYjk0NDRhYmEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1Mi41Njk0OTg0OTk5OTk5OSwtMC4yNDA1Mjk5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF82YzkyOTgyY2Y5NjU0ZjNjOTY4MGM0ZTMyMjY1MjljZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83OTU3YWZkNjkxYmY0YjY3ODNmYzY4ZjRkOWM2ZTNiMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81YmE2MjAyYzM2NTA0NDI1YjYxZDBkOWU5YzQ4N2IxNCA9ICQoJzxkaXYgaWQ9Imh0bWxfNWJhNjIwMmMzNjUwNDQyNWI2MWQwZDllOWM0ODdiMTQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNpdGl6ZW5zIEFkdmljZSBQZXRlcmJvcm91Z2ggKFBldGVyYm9yb3VnaCk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzc5NTdhZmQ2OTFiZjRiNjc4M2ZjNjhmNGQ5YzZlM2IwLnNldENvbnRlbnQoaHRtbF81YmE2MjAyYzM2NTA0NDI1YjYxZDBkOWU5YzQ4N2IxNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85MjJmNGRkNGNiOTk0NjYzYWI4NWMwZDJiOTQ0NGFiYS5iaW5kUG9wdXAocG9wdXBfNzk1N2FmZDY5MWJmNGI2NzgzZmM2OGY0ZDljNmUzYjApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2I4ZDYxMjRmNDdkYTQxNzdhMGY5N2FhYTI3ZTBjOTk0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTIuNDA2ODIyLC0xLjUxOTY5M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmM5Mjk4MmNmOTY1NGYzYzk2ODBjNGUzMjI2NTI5Y2UpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDg1ZDJhYzA3ODY5NDE4M2FmZmNiNTdkYmVmYmFhODEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmM3ZDZjMDMzNWY2NDQyOGI1Y2UxYWE3YjgyMWUyY2IgPSAkKCc8ZGl2IGlkPSJodG1sX2ZjN2Q2YzAzMzVmNjQ0MjhiNWNlMWFhN2I4MjFlMmNiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DZW50cmFsIEVuZ2xhbmQgTGF3IENlbnRyZSAoQ292ZW50cnkpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80ODVkMmFjMDc4Njk0MTgzYWZmY2I1N2RiZWZiYWE4MS5zZXRDb250ZW50KGh0bWxfZmM3ZDZjMDMzNWY2NDQyOGI1Y2UxYWE3YjgyMWUyY2IpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjhkNjEyNGY0N2RhNDE3N2EwZjk3YWFhMjdlMGM5OTQuYmluZFBvcHVwKHBvcHVwXzQ4NWQyYWMwNzg2OTQxODNhZmZjYjU3ZGJlZmJhYTgxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iOWYzYTU4YjAxZGE0NzFjOWQ2YWFhZTYyZDM3Yzg3OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzU0Ljg1OTExNjEsLTEuNTc0MDg4OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmM5Mjk4MmNmOTY1NGYzYzk2ODBjNGUzMjI2NTI5Y2UpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjdjMjgzMTUzMTAyNGUzYmFlNjgwZGU0MzYwN2JmNzMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWUxZmU0MjhhNWQxNGNjZWE0YWFiZTVjYmMzOGIxOGIgPSAkKCc8ZGl2IGlkPSJodG1sX2VlMWZlNDI4YTVkMTRjY2VhNGFhYmU1Y2JjMzhiMThiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ob3J0aCBFYXN0IEF1dGlzbSBTb2NpZXR5IChORUFTKSAoQ2hlc3RlciBsZSBTdHJlZXQsIENvdW50eSBEdXJoYW0pPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mN2MyODMxNTMxMDI0ZTNiYWU2ODBkZTQzNjA3YmY3My5zZXRDb250ZW50KGh0bWxfZWUxZmU0MjhhNWQxNGNjZWE0YWFiZTVjYmMzOGIxOGIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjlmM2E1OGIwMWRhNDcxYzlkNmFhYWU2MmQzN2M4NzkuYmluZFBvcHVwKHBvcHVwX2Y3YzI4MzE1MzEwMjRlM2JhZTY4MGRlNDM2MDdiZjczKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mYzMxZWU5ODNiNDg0YTJlODIxNTI3MGM5ODgyN2RmZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjU0NjUwNjMsLTAuMTA1ODA1OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmM5Mjk4MmNmOTY1NGYzYzk2ODBjNGUzMjI2NTI5Y2UpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOGNiZTMyNjQ4YmVlNDAxMDhlN2RiOTAzNTRiZDc5NGUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTdmZTExMzg2NzQ1NGEzYWE4NWU4MzEyYjRlNzcwY2EgPSAkKCc8ZGl2IGlkPSJodG1sX2U3ZmUxMTM4Njc0NTRhM2FhODVlODMxMmI0ZTc3MGNhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IZWxwIG9uIFlvdXIgRG9vcnN0ZXAgKElzbGluZ3RvbiwgTG9uZG9uKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOGNiZTMyNjQ4YmVlNDAxMDhlN2RiOTAzNTRiZDc5NGUuc2V0Q29udGVudChodG1sX2U3ZmUxMTM4Njc0NTRhM2FhODVlODMxMmI0ZTc3MGNhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2ZjMzFlZTk4M2I0ODRhMmU4MjE1MjcwYzk4ODI3ZGZkLmJpbmRQb3B1cChwb3B1cF84Y2JlMzI2NDhiZWU0MDEwOGU3ZGI5MDM1NGJkNzk0ZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzRjMTk1ZWZhOTJmNDlhYTg5OTUxZTQ0ODI3MTkyNmEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41MDczNTA5LC0wLjEyNzc1ODNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzZjOTI5ODJjZjk2NTRmM2M5NjgwYzRlMzIyNjUyOWNlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQ1N2M4MDUxZDQxODRkNDZhMWM3ODNhOGI4ZThhMjM2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc1YzcwMTExNDQyMzQ3MTVhYWI0M2IzOTUzNzhkMTMyID0gJCgnPGRpdiBpZD0iaHRtbF83NWM3MDExMTQ0MjM0NzE1YWFiNDNiMzk1Mzc4ZDEzMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VG93ZXIgSGFtbGV0cyBDb21tdW5pdHkgVHJhbnNwb3J0IChMb25kb24pPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80NTdjODA1MWQ0MTg0ZDQ2YTFjNzgzYThiOGU4YTIzNi5zZXRDb250ZW50KGh0bWxfNzVjNzAxMTE0NDIzNDcxNWFhYjQzYjM5NTM3OGQxMzIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzRjMTk1ZWZhOTJmNDlhYTg5OTUxZTQ0ODI3MTkyNmEuYmluZFBvcHVwKHBvcHVwXzQ1N2M4MDUxZDQxODRkNDZhMWM3ODNhOGI4ZThhMjM2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zM2RiNmUwNDU3NTY0M2E3YTM3ZDc2ZWIzZGFiYTE3OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzU0Ljk1MjY4LC0xLjYwMzQxMV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmM5Mjk4MmNmOTY1NGYzYzk2ODBjNGUzMjI2NTI5Y2UpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOWYwMTc0YmI1ZGFiNDRjMjk5NDc2OTk4YjUyYWFmOWQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzg4MGJiODI4ZDE3NDAyOGEwZjdmNWUxYzBmMjdjMmQgPSAkKCc8ZGl2IGlkPSJodG1sXzM4ODBiYjgyOGQxNzQwMjhhMGY3ZjVlMWMwZjI3YzJkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FcXVhbCBBcnRzIChHYXRlc2hlYWQpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85ZjAxNzRiYjVkYWI0NGMyOTk0NzY5OThiNTJhYWY5ZC5zZXRDb250ZW50KGh0bWxfMzg4MGJiODI4ZDE3NDAyOGEwZjdmNWUxYzBmMjdjMmQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzNkYjZlMDQ1NzU2NDNhN2EzN2Q3NmViM2RhYmExNzkuYmluZFBvcHVwKHBvcHVwXzlmMDE3NGJiNWRhYjQ0YzI5OTQ3Njk5OGI1MmFhZjlkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jZjkzNDkxOTA1NjQ0ZjI0YjkyNTBkMWNkMmY3ODlkMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzU0LjU5NzI4NTAwMDAwMDAxLC01LjkzMDEyXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF82YzkyOTgyY2Y5NjU0ZjNjOTY4MGM0ZTMyMjY1MjljZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kN2JiMmRiNWNkZjY0ODU4OGExYTRmMzM3YWJkMjFiZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wNGEwYzNkODQ0NTU0ZWVlOTAzZmViZGI0OGUwODkzMiA9ICQoJzxkaXYgaWQ9Imh0bWxfMDRhMGMzZDg0NDU1NGVlZTkwM2ZlYmRiNDhlMDg5MzIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkV4dGVybiBXb3JrcyAoQmVsZmFzdCwgTi5JcmVsYW5kLFVLKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDdiYjJkYjVjZGY2NDg1ODhhMWE0ZjMzN2FiZDIxYmQuc2V0Q29udGVudChodG1sXzA0YTBjM2Q4NDQ1NTRlZWU5MDNmZWJkYjQ4ZTA4OTMyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2NmOTM0OTE5MDU2NDRmMjRiOTI1MGQxY2QyZjc4OWQyLmJpbmRQb3B1cChwb3B1cF9kN2JiMmRiNWNkZjY0ODU4OGExYTRmMzM3YWJkMjFiZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZGJhMTEyNzEyZTZlNGM5NGI5ZGJjZWUwYjE2MTRmOTkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS43NTIwMjA5LC0xLjI1NzcyNjNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzZjOTI5ODJjZjk2NTRmM2M5NjgwYzRlMzIyNjUyOWNlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzljMjRlMmExZGRhODRmMWRiMDZlYTE3MTAxMDA2OTk3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM4MTY0ZWVhYjUwYTRkMjdhMWQ3N2JmZmU5NDQ2YTg2ID0gJCgnPGRpdiBpZD0iaHRtbF8zODE2NGVlYWI1MGE0ZDI3YTFkNzdiZmZlOTQ0NmE4NiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RGlnaXRhbCBmb3IgR29vZCAoT3hmb3JkKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOWMyNGUyYTFkZGE4NGYxZGIwNmVhMTcxMDEwMDY5OTcuc2V0Q29udGVudChodG1sXzM4MTY0ZWVhYjUwYTRkMjdhMWQ3N2JmZmU5NDQ2YTg2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2RiYTExMjcxMmU2ZTRjOTRiOWRiY2VlMGIxNjE0Zjk5LmJpbmRQb3B1cChwb3B1cF85YzI0ZTJhMWRkYTg0ZjFkYjA2ZWExNzEwMTAwNjk5Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODUxMGJhMDM0N2NjNDIyNzg5OGJiZjZjMzQ3YWJmZmEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1NS4wNDYzODksLTEuNDUxMjk4OV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmM5Mjk4MmNmOTY1NGYzYzk2ODBjNGUzMjI2NTI5Y2UpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTU4YTAyNWU3NDUwNDVkYTk1OTA3YmY2ZDkyOGUyY2EgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZGIxMDM1YTQwMjJlNDc4M2EwYTA3MWU1MWE2YTlhYTQgPSAkKCc8ZGl2IGlkPSJodG1sX2RiMTAzNWE0MDIyZTQ3ODNhMGEwNzFlNTFhNmE5YWE0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QYXJrIFZpZXcgUHJvamVjdCAgKFdoaXRsZXkgQmF5LCBOb3J0aCBUeW5lc2lkZSwgVHluZSAmYW1wOyBXZWFyKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTU4YTAyNWU3NDUwNDVkYTk1OTA3YmY2ZDkyOGUyY2Euc2V0Q29udGVudChodG1sX2RiMTAzNWE0MDIyZTQ3ODNhMGEwNzFlNTFhNmE5YWE0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzg1MTBiYTAzNDdjYzQyMjc4OThiYmY2YzM0N2FiZmZhLmJpbmRQb3B1cChwb3B1cF81NThhMDI1ZTc0NTA0NWRhOTU5MDdiZjZkOTI4ZTJjYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmUxZGNhMWE2NTk4NGU1MWFhNGQzZWIxNjZjNzYyM2IgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS44NjQyNDQ5LC0yLjIzODE1Nl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmM5Mjk4MmNmOTY1NGYzYzk2ODBjNGUzMjI2NTI5Y2UpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzcxY2QxMThkNDliNDJhOWJjNTJiODg3NmIxYzhhYTMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDAxZGFkNjZiZGZmNDE1NTkzNWI3N2M0NDY1YTQwOWIgPSAkKCc8ZGl2IGlkPSJodG1sXzAwMWRhZDY2YmRmZjQxNTU5MzViNzdjNDQ2NWE0MDliIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SZWFkYXRob24gKEdsb3VjZXN0ZXIpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zNzFjZDExOGQ0OWI0MmE5YmM1MmI4ODc2YjFjOGFhMy5zZXRDb250ZW50KGh0bWxfMDAxZGFkNjZiZGZmNDE1NTkzNWI3N2M0NDY1YTQwOWIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNmUxZGNhMWE2NTk4NGU1MWFhNGQzZWIxNjZjNzYyM2IuYmluZFBvcHVwKHBvcHVwXzM3MWNkMTE4ZDQ5YjQyYTliYzUyYjg4NzZiMWM4YWEzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85NGRiNDQ3Mzc0NTg0NzMyYWI1MTViODBkY2VkNjFlYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzU0LjE3NTEwMjQsLTYuMzQwMjI5OV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmM5Mjk4MmNmOTY1NGYzYzk2ODBjNGUzMjI2NTI5Y2UpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmYxNDdlYzk1OTE3NGJhODgwMjdkYzU3N2MzZTQwMzQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjVhM2U2ZjQzY2U2NGZhY2JjZGQwMTcyYjg4ZWRjNmIgPSAkKCc8ZGl2IGlkPSJodG1sX2Y1YTNlNmY0M2NlNjRmYWNiY2RkMDE3MmI4OGVkYzZiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5VbnJlcG9ydGVkLldvcmxkIENvbW11bml0eSBJbnRlcmVzdCBDbyAoTmV3cnkpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yZjE0N2VjOTU5MTc0YmE4ODAyN2RjNTc3YzNlNDAzNC5zZXRDb250ZW50KGh0bWxfZjVhM2U2ZjQzY2U2NGZhY2JjZGQwMTcyYjg4ZWRjNmIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTRkYjQ0NzM3NDU4NDczMmFiNTE1YjgwZGNlZDYxZWIuYmluZFBvcHVwKHBvcHVwXzJmMTQ3ZWM5NTkxNzRiYTg4MDI3ZGM1NzdjM2U0MDM0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85OWY3NTg2MTVlZDc0YjZkOThmY2ZiOTI5OGQ1NjE1ZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjUwNzM1MDksLTAuMTI3NzU4M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmM5Mjk4MmNmOTY1NGYzYzk2ODBjNGUzMjI2NTI5Y2UpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmU2OTJlYzFkY2Q5NDc0NGE1ZmFkODVmZmE1OWI4ZTkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzdiNDE3MDlmYmFkNGJlMGIyMzJmOTg2NmM4OTdhMTEgPSAkKCc8ZGl2IGlkPSJodG1sXzc3YjQxNzA5ZmJhZDRiZTBiMjMyZjk4NjZjODk3YTExIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Jbm5vdmF0ZW1lZHRlYyAgKExvbmRvbik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzZlNjkyZWMxZGNkOTQ3NDRhNWZhZDg1ZmZhNTliOGU5LnNldENvbnRlbnQoaHRtbF83N2I0MTcwOWZiYWQ0YmUwYjIzMmY5ODY2Yzg5N2ExMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85OWY3NTg2MTVlZDc0YjZkOThmY2ZiOTI5OGQ1NjE1ZC5iaW5kUG9wdXAocG9wdXBfNmU2OTJlYzFkY2Q5NDc0NGE1ZmFkODVmZmE1OWI4ZTkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzkxZWRlYmNkYTcyMDQxMjg4NzA5ZDIxNDA4MjhlYWRkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTMuMzgxMTI4OTk5OTk5OTksLTEuNDcwMDg1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF82YzkyOTgyY2Y5NjU0ZjNjOTY4MGM0ZTMyMjY1MjljZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80NjEzYjM1NDRkMjk0ZDk3ODVkYTM5M2ViMGE5NjQyYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85OTVmMDAwZDA3YzI0Nzk0YWQxYmQ5NjRmNDQ5OTBhYyA9ICQoJzxkaXYgaWQ9Imh0bWxfOTk1ZjAwMGQwN2MyNDc5NGFkMWJkOTY0ZjQ0OTkwYWMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJlY292ZXJ5IEVudGVycHJpc2VzIChTaGVmZmllbGQgKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDYxM2IzNTQ0ZDI5NGQ5Nzg1ZGEzOTNlYjBhOTY0MmMuc2V0Q29udGVudChodG1sXzk5NWYwMDBkMDdjMjQ3OTRhZDFiZDk2NGY0NDk5MGFjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzkxZWRlYmNkYTcyMDQxMjg4NzA5ZDIxNDA4MjhlYWRkLmJpbmRQb3B1cChwb3B1cF80NjEzYjM1NDRkMjk0ZDk3ODVkYTM5M2ViMGE5NjQyYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjEyYTE3M2E3OWM5NDdmZmIwZmE1ZTRkMWIwZTQ3MjIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1My41MjI4MiwtMS4xMjg0NjJdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzZjOTI5ODJjZjk2NTRmM2M5NjgwYzRlMzIyNjUyOWNlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM2ZDFmZGQ4ZmJiYjQwOWE4OTYwMTBlMmY5YjEzM2NjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNkNTQ5MTc1ZGI3ZDRmOThhOGM1ODQ2Y2RhY2ZkNjljID0gJCgnPGRpdiBpZD0iaHRtbF8zZDU0OTE3NWRiN2Q0Zjk4YThjNTg0NmNkYWNmZDY5YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2hvaWNlczREb25jYXN0ZXIgKERvbmNhc3RlciwgIFNvdXRoIFlvcmtzaGlyZSk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzM2ZDFmZGQ4ZmJiYjQwOWE4OTYwMTBlMmY5YjEzM2NjLnNldENvbnRlbnQoaHRtbF8zZDU0OTE3NWRiN2Q0Zjk4YThjNTg0NmNkYWNmZDY5Yyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yMTJhMTczYTc5Yzk0N2ZmYjBmYTVlNGQxYjBlNDcyMi5iaW5kUG9wdXAocG9wdXBfMzZkMWZkZDhmYmJiNDA5YTg5NjAxMGUyZjliMTMzY2MpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzFlMTQ4NGUwYTQzODRlZDdhYmQ0MmY2MWViMzNkMzcwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMjAuNTkzNjg0LDc4Ljk2Mjg4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF82YzkyOTgyY2Y5NjU0ZjNjOTY4MGM0ZTMyMjY1MjljZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mMmUzYjEzMjVlMzM0Y2Q3YjgyNjIxZWY5ODhlMjcyNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lNmUyOTc5ZTk1ZjE0ZjhlOWFlMDY1MDI2NWVmNGMxNCA9ICQoJzxkaXYgaWQ9Imh0bWxfZTZlMjk3OWU5NWYxNGY4ZTlhZTA2NTAyNjVlZjRjMTQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxlb25hcmQgQ2hlc2hpcmUgRElzYWJpbGl0eSAoSW5kaWEpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mMmUzYjEzMjVlMzM0Y2Q3YjgyNjIxZWY5ODhlMjcyNi5zZXRDb250ZW50KGh0bWxfZTZlMjk3OWU5NWYxNGY4ZTlhZTA2NTAyNjVlZjRjMTQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMWUxNDg0ZTBhNDM4NGVkN2FiZDQyZjYxZWIzM2QzNzAuYmluZFBvcHVwKHBvcHVwX2YyZTNiMTMyNWUzMzRjZDdiODI2MjFlZjk4OGUyNzI2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83YTkxYWY0ZmY1MGQ0NmE3Yjk4MDFhODVjZjcxODIyMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjUwNzM1MDksLTAuMTI3NzU4M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmM5Mjk4MmNmOTY1NGYzYzk2ODBjNGUzMjI2NTI5Y2UpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNWQyNTc3ZGU4ZDIwNGYwYThjODExYTJiY2ZmYzNhNjcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDhkYTEyYzM4YzcxNGRlZmIzNmIwYTZiNjA4Njk2ZTggPSAkKCc8ZGl2IGlkPSJodG1sX2Q4ZGExMmMzOGM3MTRkZWZiMzZiMGE2YjYwODY5NmU4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Xb21lbiBPbiBQdXJwb3NlICAgKExvbmRvbik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzVkMjU3N2RlOGQyMDRmMGE4YzgxMWEyYmNmZmMzYTY3LnNldENvbnRlbnQoaHRtbF9kOGRhMTJjMzhjNzE0ZGVmYjM2YjBhNmI2MDg2OTZlOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83YTkxYWY0ZmY1MGQ0NmE3Yjk4MDFhODVjZjcxODIyMS5iaW5kUG9wdXAocG9wdXBfNWQyNTc3ZGU4ZDIwNGYwYThjODExYTJiY2ZmYzNhNjcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Y0MzE1YTMxMmM5MjRmYzRiODEzMjI0YzBkMzNmMDFjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNjA0OTY3NDAwMDAwMDEsLTAuMDcyMjc4NV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmM5Mjk4MmNmOTY1NGYzYzk2ODBjNGUzMjI2NTI5Y2UpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmFhNzE4MmVhNzkxNDY5NGJlZDFlNTE4MDYzMGVlOTkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGEzNzI3YWMyYTI0NDRlYzhmZjM4YWQ5NDZkMTQ3YzEgPSAkKCc8ZGl2IGlkPSJodG1sXzhhMzcyN2FjMmEyNDQ0ZWM4ZmYzOGFkOTQ2ZDE0N2MxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TbWFydCBTY2hvb2wgQ291bmNpbHMgKFRvdHRlbmhhbSwgTG9uZG9uKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYmFhNzE4MmVhNzkxNDY5NGJlZDFlNTE4MDYzMGVlOTkuc2V0Q29udGVudChodG1sXzhhMzcyN2FjMmEyNDQ0ZWM4ZmYzOGFkOTQ2ZDE0N2MxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Y0MzE1YTMxMmM5MjRmYzRiODEzMjI0YzBkMzNmMDFjLmJpbmRQb3B1cChwb3B1cF9iYWE3MTgyZWE3OTE0Njk0YmVkMWU1MTgwNjMwZWU5OSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYWZlMWE3OTUwZjIxNGU0N2E0MTU0ODdmMTUwYjM3ODIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1Ni4yMDA4NDE5OTk5OTk5OSwtMy4xNTk4Nl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmM5Mjk4MmNmOTY1NGYzYzk2ODBjNGUzMjI2NTI5Y2UpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjI2MDIzYTU2MDg2NDUwZjg4N2I3MmU1M2YxZThmODMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmJiNDNjM2FhZDNiNDhkZjllY2M0MTMwNDZiYThkZTIgPSAkKCc8ZGl2IGlkPSJodG1sX2JiYjQzYzNhYWQzYjQ4ZGY5ZWNjNDEzMDQ2YmE4ZGUyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DaXRpemVucyBBZHZpY2UgYW5kIFJpZ2h0cyBGaWZlIChHbGVucm90aGVzLCBGaWZlKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjI2MDIzYTU2MDg2NDUwZjg4N2I3MmU1M2YxZThmODMuc2V0Q29udGVudChodG1sX2JiYjQzYzNhYWQzYjQ4ZGY5ZWNjNDEzMDQ2YmE4ZGUyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2FmZTFhNzk1MGYyMTRlNDdhNDE1NDg3ZjE1MGIzNzgyLmJpbmRQb3B1cChwb3B1cF8yMjYwMjNhNTYwODY0NTBmODg3YjcyZTUzZjFlOGY4Myk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTk0YmMzMmZmM2ZiNGViM2FiZDdjNjdjYTE0Mzk0MzQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1My40MDgzNzE0LC0yLjk5MTU3MjZdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzZjOTI5ODJjZjk2NTRmM2M5NjgwYzRlMzIyNjUyOWNlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzNiYzkxNTg3ZTdlNTRjMGE4ODgyZDRkNmUzMzdlMDQzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzAxNDBmMjMxZDJmODQwOTA4ZDU3NzBiYTIxYWVmOGY1ID0gJCgnPGRpdiBpZD0iaHRtbF8wMTQwZjIzMWQyZjg0MDkwOGQ1NzcwYmEyMWFlZjhmNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TXBvd2VyIFBlb3BsZSBDSUMgKExpdmVycG9vbCk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzNiYzkxNTg3ZTdlNTRjMGE4ODgyZDRkNmUzMzdlMDQzLnNldENvbnRlbnQoaHRtbF8wMTQwZjIzMWQyZjg0MDkwOGQ1NzcwYmEyMWFlZjhmNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81OTRiYzMyZmYzZmI0ZWIzYWJkN2M2N2NhMTQzOTQzNC5iaW5kUG9wdXAocG9wdXBfM2JjOTE1ODdlN2U1NGMwYTg4ODJkNGQ2ZTMzN2UwNDMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg4Yzc5ZGIyOGIwMTQzYTRhYmM2NWI0OTgxZTcxODdjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTUuOTUzMjUyLC0zLjE4ODI2N10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmM5Mjk4MmNmOTY1NGYzYzk2ODBjNGUzMjI2NTI5Y2UpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODA5MjMxMTdmZTY2NGJlYTllODVmODQxODllM2I3NzggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTQ1ZGUzMjcyYTk4NDQ5NWEzNjNhZDAxMzQyZDI4NjYgPSAkKCc8ZGl2IGlkPSJodG1sXzU0NWRlMzI3MmE5ODQ0OTVhMzYzYWQwMTM0MmQyODY2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TdHJlZXR3b3JrIFVLIChFZGluYnVyZ2gpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84MDkyMzExN2ZlNjY0YmVhOWU4NWY4NDE4OWUzYjc3OC5zZXRDb250ZW50KGh0bWxfNTQ1ZGUzMjcyYTk4NDQ5NWEzNjNhZDAxMzQyZDI4NjYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODhjNzlkYjI4YjAxNDNhNGFiYzY1YjQ5ODFlNzE4N2MuYmluZFBvcHVwKHBvcHVwXzgwOTIzMTE3ZmU2NjRiZWE5ZTg1Zjg0MTg5ZTNiNzc4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jZmY4NTY5ZDhmOGI0YWYyOWUyOWRjMDNiNjUyNGZkYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzU1Ljk1MzI1MiwtMy4xODgyNjddLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzZjOTI5ODJjZjk2NTRmM2M5NjgwYzRlMzIyNjUyOWNlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzEyMWMzZTU4ZWFiMzQyOTJiMTg5YjZiODQ5ZDc0NjNhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ3OThhM2UzNzhhZTRhZmViYTlhOTU2ZWQ2NTgxZWVkID0gJCgnPGRpdiBpZD0iaHRtbF80Nzk4YTNlMzc4YWU0YWZlYmE5YTk1NmVkNjU4MWVlZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UmVtYWRlIGluIEVkaW5idXJnaCAoRWRpbmJ1cmdoKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTIxYzNlNThlYWIzNDI5MmIxODliNmI4NDlkNzQ2M2Euc2V0Q29udGVudChodG1sXzQ3OThhM2UzNzhhZTRhZmViYTlhOTU2ZWQ2NTgxZWVkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2NmZjg1NjlkOGY4YjRhZjI5ZTI5ZGMwM2I2NTI0ZmRiLmJpbmRQb3B1cChwb3B1cF8xMjFjM2U1OGVhYjM0MjkyYjE4OWI2Yjg0OWQ3NDYzYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmNlODAxODE4YTU0NDZiZGJjOWE2MTU2MDMwZTNkZmMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41MDczNTA5LC0wLjEyNzc1ODNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzZjOTI5ODJjZjk2NTRmM2M5NjgwYzRlMzIyNjUyOWNlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NhNzc0ZDk5MTBhODQ4N2NhOGQ2OTAyYWE2M2VjZjgyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2RjNTM5ZDVlYTc3OTRlNzY5MDRmYTkxY2NmNmFlMmUyID0gJCgnPGRpdiBpZD0iaHRtbF9kYzUzOWQ1ZWE3Nzk0ZTc2OTA0ZmE5MWNjZjZhZTJlMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+R2luZ2VyYnJlYWQgKExvbmRvbik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2NhNzc0ZDk5MTBhODQ4N2NhOGQ2OTAyYWE2M2VjZjgyLnNldENvbnRlbnQoaHRtbF9kYzUzOWQ1ZWE3Nzk0ZTc2OTA0ZmE5MWNjZjZhZTJlMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82Y2U4MDE4MThhNTQ0NmJkYmM5YTYxNTYwMzBlM2RmYy5iaW5kUG9wdXAocG9wdXBfY2E3NzRkOTkxMGE4NDg3Y2E4ZDY5MDJhYTYzZWNmODIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzU0YzFiNDRlMjdmYjQ4NWZiMWRlMGQ5NzI5OWZjYWY1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTMuNDgwNzU5MywtMi4yNDI2MzA1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF82YzkyOTgyY2Y5NjU0ZjNjOTY4MGM0ZTMyMjY1MjljZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xYzI5NTUyYmZlMTg0YWU4OGEzYTA3ODk3MTIzMjNlZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82YWUxYWFkMzNmNGI0NzI1OTU3ODI3MTg1ZmFiOWIzYiA9ICQoJzxkaXYgaWQ9Imh0bWxfNmFlMWFhZDMzZjRiNDcyNTk1NzgyNzE4NWZhYjliM2IiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlRlY2ggRm9yIEdvb2QgTGl2ZSAoTWFuY2hlc3Rlcik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzFjMjk1NTJiZmUxODRhZTg4YTNhMDc4OTcxMjMyM2VkLnNldENvbnRlbnQoaHRtbF82YWUxYWFkMzNmNGI0NzI1OTU3ODI3MTg1ZmFiOWIzYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81NGMxYjQ0ZTI3ZmI0ODVmYjFkZTBkOTcyOTlmY2FmNS5iaW5kUG9wdXAocG9wdXBfMWMyOTU1MmJmZTE4NGFlODhhM2EwNzg5NzEyMzIzZWQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQ1YmJmNjMwOGMyZDQ3NjdiZGNhYWRjNTdiMTUzODA3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNTIwMjYwNjk5OTk5OTksLTAuMDI5MzM5Nl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmM5Mjk4MmNmOTY1NGYzYzk2ODBjNGUzMjI2NTI5Y2UpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMThiOGYwNGU3OGEzNGQ4NzhhNThmOTIwZWQyNGQ2NzMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmMzYmJhMjhmODEwNDU1MjhmNmQyNTA5N2ZiMDY4ODMgPSAkKCc8ZGl2IGlkPSJodG1sX2ZjM2JiYTI4ZjgxMDQ1NTI4ZjZkMjUwOTdmYjA2ODgzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5ZZWFyIEhlcmUgKFRvd2VyIEhhbWxldHMsIExvbmRvbik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE4YjhmMDRlNzhhMzRkODc4YTU4ZjkyMGVkMjRkNjczLnNldENvbnRlbnQoaHRtbF9mYzNiYmEyOGY4MTA0NTUyOGY2ZDI1MDk3ZmIwNjg4Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80NWJiZjYzMDhjMmQ0NzY3YmRjYWFkYzU3YjE1MzgwNy5iaW5kUG9wdXAocG9wdXBfMThiOGYwNGU3OGEzNGQ4NzhhNThmOTIwZWQyNGQ2NzMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzZmYWM0MDcwYTkxZDRkOTk5ZmU3NjY1OTY0MmY4NGY0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTMuNDgwNzU5MywtMi4yNDI2MzA1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF82YzkyOTgyY2Y5NjU0ZjNjOTY4MGM0ZTMyMjY1MjljZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zNTc3MTRmY2FmYTI0N2RkODhmZDkxY2ZhMGNlYTlmNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wNDNjZjJlNDA2Mjk0ZGI2OTIyYTMwYTEwMGRjYWZmNyA9ICQoJzxkaXYgaWQ9Imh0bWxfMDQzY2YyZTQwNjI5NGRiNjkyMmEzMGExMDBkY2FmZjciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkhlbnNoYXdzIFNvY2lldHkgZm9yIEJsaW5kIFBlb3BsZSAoTWFuY2hlc3Rlcik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzM1NzcxNGZjYWZhMjQ3ZGQ4OGZkOTFjZmEwY2VhOWY2LnNldENvbnRlbnQoaHRtbF8wNDNjZjJlNDA2Mjk0ZGI2OTIyYTMwYTEwMGRjYWZmNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82ZmFjNDA3MGE5MWQ0ZDk5OWZlNzY2NTk2NDJmODRmNC5iaW5kUG9wdXAocG9wdXBfMzU3NzE0ZmNhZmEyNDdkZDg4ZmQ5MWNmYTBjZWE5ZjYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2E4YWY1NmYxMjAyNjQ5NmU5NTZkOTA3NDBmYzM1NWRjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuMDU5NzcxLC0xLjMxMDE0Ml0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmM5Mjk4MmNmOTY1NGYzYzk2ODBjNGUzMjI2NTI5Y2UpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzZiYTY0NWVjNDIxNDhiZWJjYTE5ZTkwZjE3OTVlOTkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGU2MjFkMDNjZTVhNDM5NmEzMmMyY2EyZjRlZjg3YWQgPSAkKCc8ZGl2IGlkPSJodG1sXzhlNjIxZDAzY2U1YTQzOTZhMzJjMmNhMmY0ZWY4N2FkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Db21tdW5pdHkgRmlyc3QgKFdpbmNoZXN0ZXIgKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzZiYTY0NWVjNDIxNDhiZWJjYTE5ZTkwZjE3OTVlOTkuc2V0Q29udGVudChodG1sXzhlNjIxZDAzY2U1YTQzOTZhMzJjMmNhMmY0ZWY4N2FkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2E4YWY1NmYxMjAyNjQ5NmU5NTZkOTA3NDBmYzM1NWRjLmJpbmRQb3B1cChwb3B1cF8zNmJhNjQ1ZWM0MjE0OGJlYmNhMTllOTBmMTc5NWU5OSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTk0OTJiNTllNjgzNDA3Nzk5ZWRhMjlkMzc4YmYzODAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1My42NDU3OTIsLTEuNzg1MDM1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF82YzkyOTgyY2Y5NjU0ZjNjOTY4MGM0ZTMyMjY1MjljZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mMjg2NjdjNjUzMWM0NDlkODI4NWQxYzQ5ZDJiNDIzNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zN2I5MDMzMzhiNjA0NjhjYWFlOTVhZDE2NmI2NzFlNyA9ICQoJzxkaXYgaWQ9Imh0bWxfMzdiOTAzMzM4YjYwNDY4Y2FhZTk1YWQxNjZiNjcxZTciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlVuaXZlcnNpdHkgb2YgSHVkZGVyc2ZpZWxkLCBDZW50cmUgb2YgU3VzdGFpbmFibGUgJmFtcDsgUmVzaWxpZW50IENvbW11bml0aWVzIChIdWRkZXJzZmllbGQpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mMjg2NjdjNjUzMWM0NDlkODI4NWQxYzQ5ZDJiNDIzNi5zZXRDb250ZW50KGh0bWxfMzdiOTAzMzM4YjYwNDY4Y2FhZTk1YWQxNjZiNjcxZTcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTk0OTJiNTllNjgzNDA3Nzk5ZWRhMjlkMzc4YmYzODAuYmluZFBvcHVwKHBvcHVwX2YyODY2N2M2NTMxYzQ0OWQ4Mjg1ZDFjNDlkMmI0MjM2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81NzQ3MTE3Yzc1MGQ0YTBiYTBmNmYxNWU1N2E1Y2FmZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUzLjQwODM3MTQsLTIuOTkxNTcyNl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmM5Mjk4MmNmOTY1NGYzYzk2ODBjNGUzMjI2NTI5Y2UpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOGUwMGMwZGE0YzkwNGQ4ZDhmMDQyYzA2YzhmN2E0MWYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzYwOWQ4ZmZiYzZiNGY4OWI4ZTNjMjNiMDQ3MGU1MjUgPSAkKCc8ZGl2IGlkPSJodG1sX2M2MDlkOGZmYmM2YjRmODliOGUzYzIzYjA0NzBlNTI1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5EZXNpcmUgYW5kIEluc3BpcmUgKExpdmVycG9vbCk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzhlMDBjMGRhNGM5MDRkOGQ4ZjA0MmMwNmM4ZjdhNDFmLnNldENvbnRlbnQoaHRtbF9jNjA5ZDhmZmJjNmI0Zjg5YjhlM2MyM2IwNDcwZTUyNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81NzQ3MTE3Yzc1MGQ0YTBiYTBmNmYxNWU1N2E1Y2FmZi5iaW5kUG9wdXAocG9wdXBfOGUwMGMwZGE0YzkwNGQ4ZDhmMDQyYzA2YzhmN2E0MWYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzUwZmM5ZWE0MWM2YzQ0NDU4NDRmZmNiZDQzNmI2MTk5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTMuNjQ1NzkyLC0xLjc4NTAzNV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmM5Mjk4MmNmOTY1NGYzYzk2ODBjNGUzMjI2NTI5Y2UpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzIxMWEwYTcxZDNjNDdlMWFjMjI5MDRiZjMwMDM5NjQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmQ4YTA5ZDdmNDhlNDE5ZjgyM2Q2NzhkNWU4MTBiY2QgPSAkKCc8ZGl2IGlkPSJodG1sX2ZkOGEwOWQ3ZjQ4ZTQxOWY4MjNkNjc4ZDVlODEwYmNkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MZWdhY3kgU3BvcnQgQ0lDIChIdWRkZXJzZmllbGQpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zMjExYTBhNzFkM2M0N2UxYWMyMjkwNGJmMzAwMzk2NC5zZXRDb250ZW50KGh0bWxfZmQ4YTA5ZDdmNDhlNDE5ZjgyM2Q2NzhkNWU4MTBiY2QpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTBmYzllYTQxYzZjNDQ0NTg0NGZmY2JkNDM2YjYxOTkuYmluZFBvcHVwKHBvcHVwXzMyMTFhMGE3MWQzYzQ3ZTFhYzIyOTA0YmYzMDAzOTY0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xN2U2ZDM4Mzg1ZDU0NThkYjMyY2M2MmRiNWMxMjJiZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjUwNzM1MDksLTAuMTI3NzU4M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmM5Mjk4MmNmOTY1NGYzYzk2ODBjNGUzMjI2NTI5Y2UpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDk1ZjZlN2RjMDY0NDRiZmE5Nzg1OTg1NTRlNjhiNzAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjk2M2JjM2JjNTJiNGExODkxNzFjZDVmN2FiY2M3ZTcgPSAkKCc8ZGl2IGlkPSJodG1sX2Y5NjNiYzNiYzUyYjRhMTg5MTcxY2Q1ZjdhYmNjN2U3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5KYXJva2VsbyBQdWJsaWMgQmVuZWZpdCBBc3NvY2lhdGlvbiAoTG9uZG9uICk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q5NWY2ZTdkYzA2NDQ0YmZhOTc4NTk4NTU0ZTY4YjcwLnNldENvbnRlbnQoaHRtbF9mOTYzYmMzYmM1MmI0YTE4OTE3MWNkNWY3YWJjYzdlNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xN2U2ZDM4Mzg1ZDU0NThkYjMyY2M2MmRiNWMxMjJiZC5iaW5kUG9wdXAocG9wdXBfZDk1ZjZlN2RjMDY0NDRiZmE5Nzg1OTg1NTRlNjhiNzApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JjM2RhMzQ3MWNiMjRlZThiNTljMGQxNjk1NTMxZTg3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTAuNzY4MDM1LDAuMjkwNDcyXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF82YzkyOTgyY2Y5NjU0ZjNjOTY4MGM0ZTMyMjY1MjljZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yMGUxOTRiNDkzOGU0ZjU1YmQ4NmZlYzZjNWJmYjA0YyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jNDgxMDhiNjQ0ZTE0MmViODY0OGZmMzM1MTljMzg1ZSA9ICQoJzxkaXYgaWQ9Imh0bWxfYzQ4MTA4YjY0NGUxNDJlYjg2NDhmZjMzNTE5YzM4NWUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlRoZSBXYXlmaW5kZXIgR3JvdXAgQ0lDIChFYXN0Ym91cm5lKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjBlMTk0YjQ5MzhlNGY1NWJkODZmZWM2YzViZmIwNGMuc2V0Q29udGVudChodG1sX2M0ODEwOGI2NDRlMTQyZWI4NjQ4ZmYzMzUxOWMzODVlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2JjM2RhMzQ3MWNiMjRlZThiNTljMGQxNjk1NTMxZTg3LmJpbmRQb3B1cChwb3B1cF8yMGUxOTRiNDkzOGU0ZjU1YmQ4NmZlYzZjNWJmYjA0Yyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTc1Y2FhMWQ3ODNlNDAzYzhiMjIzZGFjZTY4YmIyNjEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1NC42MTI1MzcsLTEuMjkwOTYxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF82YzkyOTgyY2Y5NjU0ZjNjOTY4MGM0ZTMyMjY1MjljZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zYzk3ZTg1OTFiMDc0MWEzYTY4MzJiYTVkZDBhOGQ2OSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zM2EwNzUzMjA1MGI0Zjk4YWIwZDMwOGRiOWVjODMzMiA9ICQoJzxkaXYgaWQ9Imh0bWxfMzNhMDc1MzIwNTBiNGY5OGFiMGQzMDhkYjllYzgzMzIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFCQyBDb3Vuc2VsbGluZyAmYW1wOyBQbGF5IFRoZXJhcHkgJmFtcDsgRmFtaWx5IFNvbHV0aW9ucyAmYW1wOyBUaW1lIDQgWW91IENvdW5zZWxsaW5nIFNlcnZpY2VzIChCaWxsaW5naGFtLCBTdG9ja3RvbiBvbiBUZWVzKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfM2M5N2U4NTkxYjA3NDFhM2E2ODMyYmE1ZGQwYThkNjkuc2V0Q29udGVudChodG1sXzMzYTA3NTMyMDUwYjRmOThhYjBkMzA4ZGI5ZWM4MzMyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzE3NWNhYTFkNzgzZTQwM2M4YjIyM2RhY2U2OGJiMjYxLmJpbmRQb3B1cChwb3B1cF8zYzk3ZTg1OTFiMDc0MWEzYTY4MzJiYTVkZDBhOGQ2OSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNGVjZWMyYzA4MWMzNGI1NGE3ZWI3NDZjZWZhZGJiOWUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1My40ODA3NTkzLC0yLjI0MjYzMDVdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzZjOTI5ODJjZjk2NTRmM2M5NjgwYzRlMzIyNjUyOWNlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg2N2VkMzU0ZWY1ZTQ4MGJiNzI1NGViYzYzNzAzOTRlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E5NDU2N2M1OTdiMTQ4NGJhNjJiODhhNGYwM2E2YmJhID0gJCgnPGRpdiBpZD0iaHRtbF9hOTQ1NjdjNTk3YjE0ODRiYTYyYjg4YTRmMDNhNmJiYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U29uZGVyIFJhZGlvIChNYW5jaGVzdGVyKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODY3ZWQzNTRlZjVlNDgwYmI3MjU0ZWJjNjM3MDM5NGUuc2V0Q29udGVudChodG1sX2E5NDU2N2M1OTdiMTQ4NGJhNjJiODhhNGYwM2E2YmJhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzRlY2VjMmMwODFjMzRiNTRhN2ViNzQ2Y2VmYWRiYjllLmJpbmRQb3B1cChwb3B1cF84NjdlZDM1NGVmNWU0ODBiYjcyNTRlYmM2MzcwMzk0ZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmM5NTk0YTc4MjkxNDZhMDkxMzQwODJmOTRhNDkyNjIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MC43MTkxNjQsLTEuODgwNzY5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF82YzkyOTgyY2Y5NjU0ZjNjOTY4MGM0ZTMyMjY1MjljZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84YjhlNGJhY2FmMzc0YjViYTlmYTBmNzk0ZDA1YzljNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iYzUxZjRjZGZlMTk0OTllOGE2MWU2MmE0NmIyZDc1OCA9ICQoJzxkaXYgaWQ9Imh0bWxfYmM1MWY0Y2RmZTE5NDk5ZThhNjFlNjJhNDZiMmQ3NTgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkhvcGUgSG9wZSBIb3VzaW5nLCBUcmFpbmluZyBhbmQgU3VwcG9ydCBMVEQgKEJvdXJuZW1vdXRoICZhbXA7IFBvb2xlIChEb3JzZXQpKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOGI4ZTRiYWNhZjM3NGI1YmE5ZmEwZjc5NGQwNWM5YzUuc2V0Q29udGVudChodG1sX2JjNTFmNGNkZmUxOTQ5OWU4YTYxZTYyYTQ2YjJkNzU4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzZjOTU5NGE3ODI5MTQ2YTA5MTM0MDgyZjk0YTQ5MjYyLmJpbmRQb3B1cChwb3B1cF84YjhlNGJhY2FmMzc0YjViYTlmYTBmNzk0ZDA1YzljNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjkxMWFhYjM1YWViNDg3MWI2Y2ViNGY5NjAwYWQ2MzUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1NS45NTMyNTIsLTMuMTg4MjY3XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF82YzkyOTgyY2Y5NjU0ZjNjOTY4MGM0ZTMyMjY1MjljZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80YTllOWQ3ZDIwZGU0MDg4YWRhZjZmMDQ2ZDNmMDlmZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iMTNkNDQ4ZjI3NDA0MzYwYjY2MmE0NWViODhiM2Q4NiA9ICQoJzxkaXYgaWQ9Imh0bWxfYjEzZDQ0OGYyNzQwNDM2MGI2NjJhNDVlYjg4YjNkODYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVkaW5idXJnaCBMZWlzdXJlIChFZGluYnVyZ2gpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80YTllOWQ3ZDIwZGU0MDg4YWRhZjZmMDQ2ZDNmMDlmZC5zZXRDb250ZW50KGh0bWxfYjEzZDQ0OGYyNzQwNDM2MGI2NjJhNDVlYjg4YjNkODYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjkxMWFhYjM1YWViNDg3MWI2Y2ViNGY5NjAwYWQ2MzUuYmluZFBvcHVwKHBvcHVwXzRhOWU5ZDdkMjBkZTQwODhhZGFmNmYwNDZkM2YwOWZkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82N2Y3NzU4MzQ4N2Q0YWY1YmY0MWM3OWQ4OGQ0ZTFkYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUzLjc0NTY3MDksLTAuMzM2NzQxM10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmM5Mjk4MmNmOTY1NGYzYzk2ODBjNGUzMjI2NTI5Y2UpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOWQzYjI1OTg3MjBhNGU0N2JlMDE2NTFiOWY4NDYzNGIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2FiNmQ4ZDkzYzc3NDJiY2JlNzIwZDI5NzJhMzAzOTQgPSAkKCc8ZGl2IGlkPSJodG1sX2NhYjZkOGQ5M2M3NzQyYmNiZTcyMGQyOTcyYTMwMzk0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Vbml2ZXJzaXR5IG9mIEh1bGwgKEh1bGwpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85ZDNiMjU5ODcyMGE0ZTQ3YmUwMTY1MWI5Zjg0NjM0Yi5zZXRDb250ZW50KGh0bWxfY2FiNmQ4ZDkzYzc3NDJiY2JlNzIwZDI5NzJhMzAzOTQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjdmNzc1ODM0ODdkNGFmNWJmNDFjNzlkODhkNGUxZGEuYmluZFBvcHVwKHBvcHVwXzlkM2IyNTk4NzIwYTRlNDdiZTAxNjUxYjlmODQ2MzRiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jNjQ0ZDc3M2JlZmQ0MGVmOWY0NTNlMmQwZTFhZmEzZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUzLjQ4MDc1OTMsLTIuMjQyNjMwNV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmM5Mjk4MmNmOTY1NGYzYzk2ODBjNGUzMjI2NTI5Y2UpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmU2MWY2OTQ1NzIyNDI0NDk4MWJiMjBjOTZkYmVmZTcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2NkNDBjY2RmNmFiNDhhY2FkNTM4Y2UzZjU0Mzc5YzggPSAkKCc8ZGl2IGlkPSJodG1sXzNjZDQwY2NkZjZhYjQ4YWNhZDUzOGNlM2Y1NDM3OWM4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GaXJzdCBBc2lhbiBTdXBwb3J0IFRydXN0IChGQVNUKSAoTWFuY2hlc3Rlcik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JlNjFmNjk0NTcyMjQyNDQ5ODFiYjIwYzk2ZGJlZmU3LnNldENvbnRlbnQoaHRtbF8zY2Q0MGNjZGY2YWI0OGFjYWQ1MzhjZTNmNTQzNzljOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jNjQ0ZDc3M2JlZmQ0MGVmOWY0NTNlMmQwZTFhZmEzZS5iaW5kUG9wdXAocG9wdXBfYmU2MWY2OTQ1NzIyNDI0NDk4MWJiMjBjOTZkYmVmZTcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2YxODJkZmVmYTBiYTRjMmFiN2U2NmFiNTVmNmNkNmM3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNTA3MzUwOSwtMC4xMjc3NTgzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF82YzkyOTgyY2Y5NjU0ZjNjOTY4MGM0ZTMyMjY1MjljZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kMjU5ZmE2NzViNGE0OWNiODY5ODE5OWRlZDU3OTE0YSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83MmExODk3ZjAwYjM0ZWFhYjhhYTJhNzk2MDRmNjNmOCA9ICQoJzxkaXYgaWQ9Imh0bWxfNzJhMTg5N2YwMGIzNGVhYWI4YWEyYTc5NjA0ZjYzZjgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJhYnkgUG9pbnQgKExvbmRvbik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2QyNTlmYTY3NWI0YTQ5Y2I4Njk4MTk5ZGVkNTc5MTRhLnNldENvbnRlbnQoaHRtbF83MmExODk3ZjAwYjM0ZWFhYjhhYTJhNzk2MDRmNjNmOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mMTgyZGZlZmEwYmE0YzJhYjdlNjZhYjU1ZjZjZDZjNy5iaW5kUG9wdXAocG9wdXBfZDI1OWZhNjc1YjRhNDljYjg2OTgxOTlkZWQ1NzkxNGEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzc0ODdmNTAzMWMzNjRhNGFiM2JhNzgwMzliYzY1MWRjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNzk5NzYzLC00Ljc0NDAwOF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmM5Mjk4MmNmOTY1NGYzYzk2ODBjNGUzMjI2NTI5Y2UpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTFiYTIyODBjZDFjNGRhMWE4OWIzMWY3NTAxYTdlYjUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDE5ODRhNGNiYjY2NDFmZmI5NzgxNTAyZjQzODI3MWEgPSAkKCc8ZGl2IGlkPSJodG1sXzQxOTg0YTRjYmI2NjQxZmZiOTc4MTUwMmY0MzgyNzFhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QZW1icm9rZXNoaXJlIExvY2FsIEFjdGlvbiBOZXR3b3JrIGZvciBFbnRlcnByaXNlIGFuZCBEZXZlbG9wbWVudCAoTmFyYmVydGgpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81MWJhMjI4MGNkMWM0ZGExYTg5YjMxZjc1MDFhN2ViNS5zZXRDb250ZW50KGh0bWxfNDE5ODRhNGNiYjY2NDFmZmI5NzgxNTAyZjQzODI3MWEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzQ4N2Y1MDMxYzM2NGE0YWIzYmE3ODAzOWJjNjUxZGMuYmluZFBvcHVwKHBvcHVwXzUxYmEyMjgwY2QxYzRkYTFhODliMzFmNzUwMWE3ZWI1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jYzY3Y2RkNTY2YmI0MzgyYjliNzE0ZGJlNTI3N2E1MCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUzLjIzNTA0OCwtMS40MjE2MjldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzZjOTI5ODJjZjk2NTRmM2M5NjgwYzRlMzIyNjUyOWNlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzI4YzQ2MGQ4NDlhMTQzOTc5Y2UyNmZhM2FjZWNmNGFjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc5OWMzZGZmOGVlZDRhMmY4OTI2MmZmMmMwYzczZGI5ID0gJCgnPGRpdiBpZD0iaHRtbF83OTljM2RmZjhlZWQ0YTJmODkyNjJmZjJjMGM3M2RiOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QXNoZ2F0ZSBIb3NwaWNlY2FyZSAoQ2hlc3RlcmZpZWxkKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjhjNDYwZDg0OWExNDM5NzljZTI2ZmEzYWNlY2Y0YWMuc2V0Q29udGVudChodG1sXzc5OWMzZGZmOGVlZDRhMmY4OTI2MmZmMmMwYzczZGI5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2NjNjdjZGQ1NjZiYjQzODJiOWI3MTRkYmU1Mjc3YTUwLmJpbmRQb3B1cChwb3B1cF8yOGM0NjBkODQ5YTE0Mzk3OWNlMjZmYTNhY2VjZjRhYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzk5OWZiZTA2NzRlNDY1MjkxZGU1ZTg1ZmQ0YTUyZTUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1NS44NjQyMzcsLTQuMjUxODA2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF82YzkyOTgyY2Y5NjU0ZjNjOTY4MGM0ZTMyMjY1MjljZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zYjU1MzNiNGQyYTM0OWI3OTg3MzVmMjRhYzVjNGZjMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xNTA1NmM2OGUwYjE0OGI3OGI2OTJiNWVjOTI4YjM1NyA9ICQoJzxkaXYgaWQ9Imh0bWxfMTUwNTZjNjhlMGIxNDhiNzhiNjkyYjVlYzkyOGIzNTciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNpbW9uIENvbW11bml0eSBTY290bGFuZCAoR2xhc2dvdyk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzNiNTUzM2I0ZDJhMzQ5Yjc5ODczNWYyNGFjNWM0ZmMyLnNldENvbnRlbnQoaHRtbF8xNTA1NmM2OGUwYjE0OGI3OGI2OTJiNWVjOTI4YjM1Nyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83OTk5ZmJlMDY3NGU0NjUyOTFkZTVlODVmZDRhNTJlNS5iaW5kUG9wdXAocG9wdXBfM2I1NTMzYjRkMmEzNDliNzk4NzM1ZjI0YWM1YzRmYzIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2FmMWJhMjlkN2M4ODRkYWNiNDc0YzRlZGQ0Yzk5YzUwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNTA3MzUwOSwtMC4xMjc3NTgzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF82YzkyOTgyY2Y5NjU0ZjNjOTY4MGM0ZTMyMjY1MjljZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82NmZjZjAyMzY3YjM0NGI2YmZkZThlYzgzMjVjZTY0MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jY2M0NjIxODkzMzA0M2ZjYWE0MGVkMTJhNmZlNjkyMSA9ICQoJzxkaXYgaWQ9Imh0bWxfY2NjNDYyMTg5MzMwNDNmY2FhNDBlZDEyYTZmZTY5MjEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9yY2hhcmQgSGlsbCBDb2xsZWdlIChMb25kb24pPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82NmZjZjAyMzY3YjM0NGI2YmZkZThlYzgzMjVjZTY0MC5zZXRDb250ZW50KGh0bWxfY2NjNDYyMTg5MzMwNDNmY2FhNDBlZDEyYTZmZTY5MjEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYWYxYmEyOWQ3Yzg4NGRhY2I0NzRjNGVkZDRjOTljNTAuYmluZFBvcHVwKHBvcHVwXzY2ZmNmMDIzNjdiMzQ0YjZiZmRlOGVjODMyNWNlNjQwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84ZTlmN2FiZDAwNzk0OWE3YmE3MTZhZDM5YTU0NzdiMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjUwNzM1MDksLTAuMTI3NzU4M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmM5Mjk4MmNmOTY1NGYzYzk2ODBjNGUzMjI2NTI5Y2UpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2FhMDk5M2E4MTlmNDAyOTgxYzExMmMxODBkYzJmYzggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNGFjMDY4ZTY4ZmJlNDQ4NGE1M2I3MDI5Njk4NWZiNDYgPSAkKCc8ZGl2IGlkPSJodG1sXzRhYzA2OGU2OGZiZTQ0ODRhNTNiNzAyOTY5ODVmYjQ2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DYWbDqWRpcmVjdCBQcm9kdWNlcnMmIzM5OyBGb3VuZGF0aW9uICggTG9uZG9uLFVLKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfN2FhMDk5M2E4MTlmNDAyOTgxYzExMmMxODBkYzJmYzguc2V0Q29udGVudChodG1sXzRhYzA2OGU2OGZiZTQ0ODRhNTNiNzAyOTY5ODVmYjQ2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzhlOWY3YWJkMDA3OTQ5YTdiYTcxNmFkMzlhNTQ3N2IxLmJpbmRQb3B1cChwb3B1cF83YWEwOTkzYTgxOWY0MDI5ODFjMTEyYzE4MGRjMmZjOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTQzZTYxYjE4YzFmNGRhZTlmZGE2OGMzNzdkYWNiNzQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1NS4wNDQzMiwtNy4wMjAzNTk5OTk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzZjOTI5ODJjZjk2NTRmM2M5NjgwYzRlMzIyNjUyOWNlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2VlNzEyMDcwYzE5NzQyZWM4Y2VjNDQ2NTM0MjdjODc5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2UxODUzZDE2MTY1MjRkOGFhZDM3YzdlZmEwMzY0NjkzID0gJCgnPGRpdiBpZD0iaHRtbF9lMTg1M2QxNjE2NTI0ZDhhYWQzN2M3ZWZhMDM2NDY5MyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2VyZXMgRXVyb3BlIChOSSkgTHRkIChCYWxseWtlbGx5IENvIExvbmRvbmRlcnJ5IE5vcnRoZXJuIElyZWxhbmQpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lZTcxMjA3MGMxOTc0MmVjOGNlYzQ0NjUzNDI3Yzg3OS5zZXRDb250ZW50KGh0bWxfZTE4NTNkMTYxNjUyNGQ4YWFkMzdjN2VmYTAzNjQ2OTMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTQzZTYxYjE4YzFmNGRhZTlmZGE2OGMzNzdkYWNiNzQuYmluZFBvcHVwKHBvcHVwX2VlNzEyMDcwYzE5NzQyZWM4Y2VjNDQ2NTM0MjdjODc5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wNTI3OTc3MjYyYzQ0NTFmOGRjZTgxYWYzM2Y2NWI5MSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjQ1NDUxMywtMi41ODc5MV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmM5Mjk4MmNmOTY1NGYzYzk2ODBjNGUzMjI2NTI5Y2UpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmY5MjZmMDJkNTViNDMxOTg3YmE4OTdhN2Y1YzAwNDEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWZkZTdhNjM0ZDlkNGI5ZmJiNTNlYmY4YjRiY2U1YTIgPSAkKCc8ZGl2IGlkPSJodG1sX2FmZGU3YTYzNGQ5ZDRiOWZiYjUzZWJmOGI0YmNlNWEyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5JbmF1cmEgKEJyaXN0b2wgKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMmY5MjZmMDJkNTViNDMxOTg3YmE4OTdhN2Y1YzAwNDEuc2V0Q29udGVudChodG1sX2FmZGU3YTYzNGQ5ZDRiOWZiYjUzZWJmOGI0YmNlNWEyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzA1Mjc5NzcyNjJjNDQ1MWY4ZGNlODFhZjMzZjY1YjkxLmJpbmRQb3B1cChwb3B1cF8yZjkyNmYwMmQ1NWI0MzE5ODdiYTg5N2E3ZjVjMDA0MSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODU4NTVjZjMxNTc1NDE3OTljNjZiMzE4Yzc0NTU3OGYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS40NDE0NTc5LC0wLjAxMTcwMDZdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzZjOTI5ODJjZjk2NTRmM2M5NjgwYzRlMzIyNjUyOWNlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Y4MjQ4NTBhZDRjZDQ1MzRiYjg4YWJjNDFkODJmZDM4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ExOTBmYzllOTIwOTQxYzU5NTMzYjQxNGM1ZDkzZDRjID0gJCgnPGRpdiBpZD0iaHRtbF9hMTkwZmM5ZTkyMDk0MWM1OTUzM2I0MTRjNWQ5M2Q0YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmUgVG90YWxseSBZb3UgKExld2lzaGFtKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjgyNDg1MGFkNGNkNDUzNGJiODhhYmM0MWQ4MmZkMzguc2V0Q29udGVudChodG1sX2ExOTBmYzllOTIwOTQxYzU5NTMzYjQxNGM1ZDkzZDRjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzg1ODU1Y2YzMTU3NTQxNzk5YzY2YjMxOGM3NDU1NzhmLmJpbmRQb3B1cChwb3B1cF9mODI0ODUwYWQ0Y2Q0NTM0YmI4OGFiYzQxZDgyZmQzOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNGNiMzM2MjUzMzc5NGNhNjkxMWE0MGMyNjNlYjgzMzcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1My45NTk5NjUxMDAwMDAwMSwtMS4wODcyOTc5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF82YzkyOTgyY2Y5NjU0ZjNjOTY4MGM0ZTMyMjY1MjljZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yYTM0MjFmMGY0YTM0ZGUxOTgxMWE3YmMxMTA2OTBiMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82ZjgxNjg3ZjNjMTk0N2UxYWQ4OGUxOWY3OGU4NDk5ZCA9ICQoJzxkaXYgaWQ9Imh0bWxfNmY4MTY4N2YzYzE5NDdlMWFkODhlMTlmNzhlODQ5OWQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPklubm92YXRpb25zIGluIERlbWVudGlhIENJQyAoWW9yayk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzJhMzQyMWYwZjRhMzRkZTE5ODExYTdiYzExMDY5MGIxLnNldENvbnRlbnQoaHRtbF82ZjgxNjg3ZjNjMTk0N2UxYWQ4OGUxOWY3OGU4NDk5ZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80Y2IzMzYyNTMzNzk0Y2E2OTExYTQwYzI2M2ViODMzNy5iaW5kUG9wdXAocG9wdXBfMmEzNDIxZjBmNGEzNGRlMTk4MTFhN2JjMTEwNjkwYjEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzUwNzU3OGJiNzE5NjRkMzY5OWY0MjYxYjBhZjU5ZjllID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTIuMDYyOTAwOSwtMS4zMzk3NzVdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzZjOTI5ODJjZjk2NTRmM2M5NjgwYzRlMzIyNjUyOWNlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzJlYzE2ODg5MTMyZjQyMDQ5YWY4OTI0YjI3NzkyZWZiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzkxMDFiZWI1ZDhhZTQ1ODJiNTJlNzYwNmFkMDlhYzViID0gJCgnPGRpdiBpZD0iaHRtbF85MTAxYmViNWQ4YWU0NTgyYjUyZTc2MDZhZDA5YWM1YiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QWRvcHRpb24gVUsgKEJhbmJ1cnkpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yZWMxNjg4OTEzMmY0MjA0OWFmODkyNGIyNzc5MmVmYi5zZXRDb250ZW50KGh0bWxfOTEwMWJlYjVkOGFlNDU4MmI1MmU3NjA2YWQwOWFjNWIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTA3NTc4YmI3MTk2NGQzNjk5ZjQyNjFiMGFmNTlmOWUuYmluZFBvcHVwKHBvcHVwXzJlYzE2ODg5MTMyZjQyMDQ5YWY4OTI0YjI3NzkyZWZiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wNzYyMmM0NTJkNWM0MTM1YjA4Nzk2YmQ5ZjE5MDhiYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUwLjgyMjUzMDAwMDAwMDAxLC0wLjEzNzE2M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmM5Mjk4MmNmOTY1NGYzYzk2ODBjNGUzMjI2NTI5Y2UpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOGM2NDM3ZDAzMDVmNDNhOTg5ZTRmZWQ4NWJiZGQyMmUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzE4N2UyMGI1ODhjNGJkODk4NThlZDhjNWI0MGMyZGEgPSAkKCc8ZGl2IGlkPSJodG1sXzcxODdlMjBiNTg4YzRiZDg5ODU4ZWQ4YzViNDBjMmRhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CcmlnaHRvbiBPYXNpcyBQcm9qZWN0IChCcmlnaHRvbik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzhjNjQzN2QwMzA1ZjQzYTk4OWU0ZmVkODViYmRkMjJlLnNldENvbnRlbnQoaHRtbF83MTg3ZTIwYjU4OGM0YmQ4OTg1OGVkOGM1YjQwYzJkYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wNzYyMmM0NTJkNWM0MTM1YjA4Nzk2YmQ5ZjE5MDhiYS5iaW5kUG9wdXAocG9wdXBfOGM2NDM3ZDAzMDVmNDNhOTg5ZTRmZWQ4NWJiZGQyMmUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2YxZThkMWEzOGQ5NDRmYTE5ZWIyMDlmNzgzMDg3MmEyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTMuNDk2MTE1LC0yLjUxODcyN10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmM5Mjk4MmNmOTY1NGYzYzk2ODBjNGUzMjI2NTI5Y2UpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmEzYzkwZWI3NDYzNDhiODlhYzRjMWY3ZGYxZjdiODUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDhhYjU4Y2RiZDlmNDMzNmEwZTliMmE2MDg4YjE5ODAgPSAkKCc8ZGl2IGlkPSJodG1sXzA4YWI1OGNkYmQ5ZjQzMzZhMGU5YjJhNjA4OGIxOTgwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5UaGUgQmxhaXIgUHJvamVjdCAoTGVpZ2gpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mYTNjOTBlYjc0NjM0OGI4OWFjNGMxZjdkZjFmN2I4NS5zZXRDb250ZW50KGh0bWxfMDhhYjU4Y2RiZDlmNDMzNmEwZTliMmE2MDg4YjE5ODApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjFlOGQxYTM4ZDk0NGZhMTllYjIwOWY3ODMwODcyYTIuYmluZFBvcHVwKHBvcHVwX2ZhM2M5MGViNzQ2MzQ4Yjg5YWM0YzFmN2RmMWY3Yjg1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xZDAyMGU0ZTE0N2M0NGRiODgyMmE4MDIwNTZjNTRiYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzU0LjU3NDIyNywtMS4yMzQ5NTZdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzZjOTI5ODJjZjk2NTRmM2M5NjgwYzRlMzIyNjUyOWNlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzJmNWRkNWYzZGM2MzQ1OThiNTAyMjZmYmQxMTYyZjIxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzYzZGI4NGU1N2Q5ODRjMTBiMDEyYWMyNTYxZTM3MWZlID0gJCgnPGRpdiBpZD0iaHRtbF82M2RiODRlNTdkOTg0YzEwYjAxMmFjMjU2MWUzNzFmZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SGFsbyBQcm9qZWN0IENoYXJpdHkgIChNaWRkbGVzYnJvdWdoKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMmY1ZGQ1ZjNkYzYzNDU5OGI1MDIyNmZiZDExNjJmMjEuc2V0Q29udGVudChodG1sXzYzZGI4NGU1N2Q5ODRjMTBiMDEyYWMyNTYxZTM3MWZlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzFkMDIwZTRlMTQ3YzQ0ZGI4ODIyYTgwMjA1NmM1NGJiLmJpbmRQb3B1cChwb3B1cF8yZjVkZDVmM2RjNjM0NTk4YjUwMjI2ZmJkMTE2MmYyMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWQ5Yzg5ZGQwZDdjNDBiZGIyNmI4NDlmNTY0NzY2OTcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41MDczNTA5LC0wLjEyNzc1ODNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzZjOTI5ODJjZjk2NTRmM2M5NjgwYzRlMzIyNjUyOWNlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Y0NWViYzMwZjQ5MzQyZmRhNGIyMTBmYzdlOWQxNzI5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFjYjQ5MjI4OTU4ZTQ4MGE5OWI4ZTY4NTRkMjdmYjgwID0gJCgnPGRpdiBpZD0iaHRtbF8xY2I0OTIyODk1OGU0ODBhOTliOGU2ODU0ZDI3ZmI4MCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U29jaWFsIExpZmUgKExvbmRvbik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Y0NWViYzMwZjQ5MzQyZmRhNGIyMTBmYzdlOWQxNzI5LnNldENvbnRlbnQoaHRtbF8xY2I0OTIyODk1OGU0ODBhOTliOGU2ODU0ZDI3ZmI4MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85ZDljODlkZDBkN2M0MGJkYjI2Yjg0OWY1NjQ3NjY5Ny5iaW5kUG9wdXAocG9wdXBfZjQ1ZWJjMzBmNDkzNDJmZGE0YjIxMGZjN2U5ZDE3MjkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JhZGFjMTZhNGY2MDQ3YWJiYzA2MDlhMDM1NjQ5NmYxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTQuNTk3Mjg1MDAwMDAwMDEsLTUuOTMwMTJdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzZjOTI5ODJjZjk2NTRmM2M5NjgwYzRlMzIyNjUyOWNlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzNlNDY5NzU3YzkxNDQ1NmNhMWY5OWJkNGYxM2Q3YzQzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNkYjQxODhhMmU4NzRlNWRiMTA4ZjEwMTVlZWU5ZWNjID0gJCgnPGRpdiBpZD0iaHRtbF8zZGI0MTg4YTJlODc0ZTVkYjEwOGYxMDE1ZWVlOWVjYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RmFiTGFiIEJlbGZhc3QgIChCZWxmYXN0ICk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzNlNDY5NzU3YzkxNDQ1NmNhMWY5OWJkNGYxM2Q3YzQzLnNldENvbnRlbnQoaHRtbF8zZGI0MTg4YTJlODc0ZTVkYjEwOGYxMDE1ZWVlOWVjYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iYWRhYzE2YTRmNjA0N2FiYmMwNjA5YTAzNTY0OTZmMS5iaW5kUG9wdXAocG9wdXBfM2U0Njk3NTdjOTE0NDU2Y2ExZjk5YmQ0ZjEzZDdjNDMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JlNTBjNWYzNTZiOTQ2NDQ5NWM1NWUwZDY3YWY1OWYzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTUuODQ3MjU4LC00LjQ0MDExMzk5OTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmM5Mjk4MmNmOTY1NGYzYzk2ODBjNGUzMjI2NTI5Y2UpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWQ0YmE1ZWY0MDlhNDlhNTk2MGIwZWY4ZjM4MTE3NmQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjRjM2ExOTg5NTAyNDE1MDljYzAxMjViMGMyMjY3ODEgPSAkKCc8ZGl2IGlkPSJodG1sXzY0YzNhMTk4OTUwMjQxNTA5Y2MwMTI1YjBjMjI2NzgxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CaXBvbGFyIFNjb3RsYW5kIChQYWlzbGV5KTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYWQ0YmE1ZWY0MDlhNDlhNTk2MGIwZWY4ZjM4MTE3NmQuc2V0Q29udGVudChodG1sXzY0YzNhMTk4OTUwMjQxNTA5Y2MwMTI1YjBjMjI2NzgxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2JlNTBjNWYzNTZiOTQ2NDQ5NWM1NWUwZDY3YWY1OWYzLmJpbmRQb3B1cChwb3B1cF9hZDRiYTVlZjQwOWE0OWE1OTYwYjBlZjhmMzgxMTc2ZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzk5YzAzNjZiZTVjNGIyNWI4NWFjMzI2ZWZmN2I5YzIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41MDczNTA5LC0wLjEyNzc1ODNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzZjOTI5ODJjZjk2NTRmM2M5NjgwYzRlMzIyNjUyOWNlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2MyYWE1NzgzNDIxZDQ1ZWU5ZDVhMzUzNGYwODJmMTg3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFkMTM3ZmExMWY5ODQ2MjFiMDQ2ZTIyYTU3NGZmMTRhID0gJCgnPGRpdiBpZD0iaHRtbF8xZDEzN2ZhMTFmOTg0NjIxYjA0NmUyMmE1NzRmZjE0YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VW5pdmVyc2l0eSBDb2xsZWdlIExvbmRvbiAoVUNMKSAoTG9uZG9uIC0gVUspPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jMmFhNTc4MzQyMWQ0NWVlOWQ1YTM1MzRmMDgyZjE4Ny5zZXRDb250ZW50KGh0bWxfMWQxMzdmYTExZjk4NDYyMWIwNDZlMjJhNTc0ZmYxNGEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzk5YzAzNjZiZTVjNGIyNWI4NWFjMzI2ZWZmN2I5YzIuYmluZFBvcHVwKHBvcHVwX2MyYWE1NzgzNDIxZDQ1ZWU5ZDVhMzUzNGYwODJmMTg3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wZTUwZmI2NjRlYTI0OWYyYTM0ZjA5ZDNhMzVmNzg0ZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUzLjgwMDc1NTQsLTEuNTQ5MDc3NF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmM5Mjk4MmNmOTY1NGYzYzk2ODBjNGUzMjI2NTI5Y2UpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGM2NzllNWViMzUwNGQ0NDkxZGQ1YmVjZjdjMGE0M2YgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmNhOGI5NjgxY2QxNDI5ZmE1MjMwNzk1ODEzNzA4MDEgPSAkKCc8ZGl2IGlkPSJodG1sXzZjYThiOTY4MWNkMTQyOWZhNTIzMDc5NTgxMzcwODAxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Zb3Jrc2hpcmUgTWVudG9yaW5nIChMZWVkcyBhbmQgSGFsaWZheCk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzBjNjc5ZTVlYjM1MDRkNDQ5MWRkNWJlY2Y3YzBhNDNmLnNldENvbnRlbnQoaHRtbF82Y2E4Yjk2ODFjZDE0MjlmYTUyMzA3OTU4MTM3MDgwMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wZTUwZmI2NjRlYTI0OWYyYTM0ZjA5ZDNhMzVmNzg0Zi5iaW5kUG9wdXAocG9wdXBfMGM2NzllNWViMzUwNGQ0NDkxZGQ1YmVjZjdjMGE0M2YpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzYzZjMwMWE2YjA4MTQ1MDg5NmVmYzMyY2I0N2MzOTJiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNTA3MzUwOSwtMC4xMjc3NTgzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF82YzkyOTgyY2Y5NjU0ZjNjOTY4MGM0ZTMyMjY1MjljZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83M2JhZjk3Yjc0NjI0OTkwYmU5MzQ1MTAwYzI3M2UwOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mMWFkNWVjYzk3OTk0ZWU1YmE3ZTExZDg4MmY0N2U2MSA9ICQoJzxkaXYgaWQ9Imh0bWxfZjFhZDVlY2M5Nzk5NGVlNWJhN2UxMWQ4ODJmNDdlNjEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNvY2lhbCBTcGlkZXIgQ0lDIChMb25kb24pPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83M2JhZjk3Yjc0NjI0OTkwYmU5MzQ1MTAwYzI3M2UwOS5zZXRDb250ZW50KGh0bWxfZjFhZDVlY2M5Nzk5NGVlNWJhN2UxMWQ4ODJmNDdlNjEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjNmMzAxYTZiMDgxNDUwODk2ZWZjMzJjYjQ3YzM5MmIuYmluZFBvcHVwKHBvcHVwXzczYmFmOTdiNzQ2MjQ5OTBiZTkzNDUxMDBjMjczZTA5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81MmM5NmU2NTQzODE0NWYxOTVmYzQxNTU3M2QwZmVkMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjUxMDUzODM5OTk5OTk5LC0wLjU5NTA0MDU5OTk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzZjOTI5ODJjZjk2NTRmM2M5NjgwYzRlMzIyNjUyOWNlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzMxNTg0ZDFiMGRmMDQxMTk5M2I3MDUzMTY4ODBhODdjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzMxODcxMTRkMTkwYzQ2MDM5NmY0MTZjYWQ1MjQ0YjZiID0gJCgnPGRpdiBpZD0iaHRtbF8zMTg3MTE0ZDE5MGM0NjAzOTZmNDE2Y2FkNTI0NGI2YiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+NTAtNTAgU1lOQyBDSUMgKFNsb3VnaCk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzMxNTg0ZDFiMGRmMDQxMTk5M2I3MDUzMTY4ODBhODdjLnNldENvbnRlbnQoaHRtbF8zMTg3MTE0ZDE5MGM0NjAzOTZmNDE2Y2FkNTI0NGI2Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81MmM5NmU2NTQzODE0NWYxOTVmYzQxNTU3M2QwZmVkMS5iaW5kUG9wdXAocG9wdXBfMzE1ODRkMWIwZGYwNDExOTkzYjcwNTMxNjg4MGE4N2MpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzE5OWZiZDk2ZGQwMTQ2M2U4MGEzZDA4NWQwYjkxOGU3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTIuNTM2MTY3NCwtMi4wMTA3OTNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzZjOTI5ODJjZjk2NTRmM2M5NjgwYzRlMzIyNjUyOWNlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzJkNDNmMzAzNzU4NjRlODFiZDVjODg0MDMzNTE4ZmY2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2JhZTgxNTA5YTA1NzQwODc4ZmRjYTU4MTYxN2I4ZGMwID0gJCgnPGRpdiBpZD0iaHRtbF9iYWU4MTUwOWEwNTc0MDg3OGZkY2E1ODE2MTdiOGRjMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QnVpbGRpbmcgQnJpZGdlcyBUcmFpbmluZyAoU2FuZHdlbGwgYW5kIEJpcm1pbmdoYW0pPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yZDQzZjMwMzc1ODY0ZTgxYmQ1Yzg4NDAzMzUxOGZmNi5zZXRDb250ZW50KGh0bWxfYmFlODE1MDlhMDU3NDA4NzhmZGNhNTgxNjE3YjhkYzApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTk5ZmJkOTZkZDAxNDYzZTgwYTNkMDg1ZDBiOTE4ZTcuYmluZFBvcHVwKHBvcHVwXzJkNDNmMzAzNzU4NjRlODFiZDVjODg0MDMzNTE4ZmY2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85MzkxYWE4YWE4MjU0ZTQxYjg3NmNjN2IzZjViNzVlMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjUwNzM1MDksLTAuMTI3NzU4M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmM5Mjk4MmNmOTY1NGYzYzk2ODBjNGUzMjI2NTI5Y2UpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWE5ZWUzMzBjODMyNDc4MmFkZTI3NjJjYzFkZGM1ZjQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjg3Y2RiYmRmY2M1NDRmNjg0YWQ5ZDMyNGI1ODFjYWQgPSAkKCc8ZGl2IGlkPSJodG1sX2I4N2NkYmJkZmNjNTQ0ZjY4NGFkOWQzMjRiNTgxY2FkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5UaGUgSGVhbHRoIEVxdWFsaXR5IGFuZCBSaWdodHMgT3JnYW5pc2F0aW9uIChMb25kb24sIFVLKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYWE5ZWUzMzBjODMyNDc4MmFkZTI3NjJjYzFkZGM1ZjQuc2V0Q29udGVudChodG1sX2I4N2NkYmJkZmNjNTQ0ZjY4NGFkOWQzMjRiNTgxY2FkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzkzOTFhYThhYTgyNTRlNDFiODc2Y2M3YjNmNWI3NWUwLmJpbmRQb3B1cChwb3B1cF9hYTllZTMzMGM4MzI0NzgyYWRlMjc2MmNjMWRkYzVmNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDAwYzNlMWQxZDBhNDk2YjlmYWUyMTBkYmI4MjQxNTIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1NC41MjM2MSwtMS41NTk0NThdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzZjOTI5ODJjZjk2NTRmM2M5NjgwYzRlMzIyNjUyOWNlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM5ZjkzODkyYmYxYjQ0OTBhYTVmNjQ2ODkwNzUyNWM4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U2ODFjODMyODNhODRlZWRhMWZjNTNjZGUwZTRkM2MzID0gJCgnPGRpdiBpZD0iaHRtbF9lNjgxYzgzMjgzYTg0ZWVkYTFmYzUzY2RlMGU0ZDNjMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RGFybGluZ3RvbiBNaW5kIChEYXJsaW5ndG9uKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzlmOTM4OTJiZjFiNDQ5MGFhNWY2NDY4OTA3NTI1Yzguc2V0Q29udGVudChodG1sX2U2ODFjODMyODNhODRlZWRhMWZjNTNjZGUwZTRkM2MzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2QwMGMzZTFkMWQwYTQ5NmI5ZmFlMjEwZGJiODI0MTUyLmJpbmRQb3B1cChwb3B1cF8zOWY5Mzg5MmJmMWI0NDkwYWE1ZjY0Njg5MDc1MjVjOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfN2E3ZDNiMTExZWZhNGJkZTg2NTJkMWM2NzYzODdiMTMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41MDczNTA5LC0wLjEyNzc1ODNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzZjOTI5ODJjZjk2NTRmM2M5NjgwYzRlMzIyNjUyOWNlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQwYjVjMjcyNDhlZDQwMzk5NGI4ODg5OTBhOWJkYTM3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ZiZjhhOWVkZjA4ODQ2NDBiYzJjYjMwNjAxMGViZTE1ID0gJCgnPGRpdiBpZD0iaHRtbF9mYmY4YTllZGYwODg0NjQwYmMyY2IzMDYwMTBlYmUxNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2FtcGFpZ24gQWNhZGVteSAoTG9uZG9uKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDBiNWMyNzI0OGVkNDAzOTk0Yjg4ODk5MGE5YmRhMzcuc2V0Q29udGVudChodG1sX2ZiZjhhOWVkZjA4ODQ2NDBiYzJjYjMwNjAxMGViZTE1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzdhN2QzYjExMWVmYTRiZGU4NjUyZDFjNjc2Mzg3YjEzLmJpbmRQb3B1cChwb3B1cF80MGI1YzI3MjQ4ZWQ0MDM5OTRiODg4OTkwYTliZGEzNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzhlNGM4MmE5NWU4NGNkZWFjNGI0M2I3OGU0YTAxNDIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41MDczNTA5LC0wLjEyNzc1ODNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzZjOTI5ODJjZjk2NTRmM2M5NjgwYzRlMzIyNjUyOWNlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzk2Yjc0YjkxOWJhYzRkYmJhZmZhZWZkOTk5YjMyNTYyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzAzZjBlOWVhYjExODRhODZiMWJiYTQ1ZDkzMmI5OGU2ID0gJCgnPGRpdiBpZD0iaHRtbF8wM2YwZTllYWIxMTg0YTg2YjFiYmE0NWQ5MzJiOThlNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UHJvamVjdHMgRm9yIEFsbCAoTG9uZG9uKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTZiNzRiOTE5YmFjNGRiYmFmZmFlZmQ5OTliMzI1NjIuc2V0Q29udGVudChodG1sXzAzZjBlOWVhYjExODRhODZiMWJiYTQ1ZDkzMmI5OGU2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2M4ZTRjODJhOTVlODRjZGVhYzRiNDNiNzhlNGEwMTQyLmJpbmRQb3B1cChwb3B1cF85NmI3NGI5MTliYWM0ZGJiYWZmYWVmZDk5OWIzMjU2Mik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDQ2MDZhMGY0MWRhNDZkMWE0OTkxYzI2ODQzYjZkYjkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41MDczNTA5LC0wLjEyNzc1ODNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzZjOTI5ODJjZjk2NTRmM2M5NjgwYzRlMzIyNjUyOWNlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzUwMTBhMWNiMDY1ZDQ4Y2Y4NjI3NzEwNGNkZmQ5Y2I1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FkYmU0ZmQ0MTY3ODQ4NjVhMTE3OWQ5ZjZmNjc4ZmZkID0gJCgnPGRpdiBpZD0iaHRtbF9hZGJlNGZkNDE2Nzg0ODY1YTExNzlkOWY2ZjY3OGZmZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QnJpZGdlcyBTZWxmIE1hbmFnZW1lbnQgTGltaXRlZCAoTG9uZG9uKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTAxMGExY2IwNjVkNDhjZjg2Mjc3MTA0Y2RmZDljYjUuc2V0Q29udGVudChodG1sX2FkYmU0ZmQ0MTY3ODQ4NjVhMTE3OWQ5ZjZmNjc4ZmZkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Q0NjA2YTBmNDFkYTQ2ZDFhNDk5MWMyNjg0M2I2ZGI5LmJpbmRQb3B1cChwb3B1cF81MDEwYTFjYjA2NWQ0OGNmODYyNzcxMDRjZGZkOWNiNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWE1ODM4OWMxMjI0NGEyMWIzNjUyMWU3ZjhlZWMxMTUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS42MjE0NCwtMy45NDM2NDU5OTk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzZjOTI5ODJjZjk2NTRmM2M5NjgwYzRlMzIyNjUyOWNlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzUzZjAyMGIyNTQ5ZTRhNjlhN2Q4MzNjMTdjZDFjMzMwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2UyYThlYTBlZTYxZTRlZjM5ODFmZTk0ZDRkZWVjZDJjID0gJCgnPGRpdiBpZD0iaHRtbF9lMmE4ZWEwZWU2MWU0ZWYzOTgxZmU5NGQ0ZGVlY2QyYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VGhlIE11bGxhbnkgRnVuZCAoU3dhbnNlYSk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzUzZjAyMGIyNTQ5ZTRhNjlhN2Q4MzNjMTdjZDFjMzMwLnNldENvbnRlbnQoaHRtbF9lMmE4ZWEwZWU2MWU0ZWYzOTgxZmU5NGQ0ZGVlY2QyYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85YTU4Mzg5YzEyMjQ0YTIxYjM2NTIxZTdmOGVlYzExNS5iaW5kUG9wdXAocG9wdXBfNTNmMDIwYjI1NDllNGE2OWE3ZDgzM2MxN2NkMWMzMzApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzI5MjhkMmIzN2IwZDRjZDA4OTFkMDE5YzE0ZDhmNzdlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNTA3MzUwOSwtMC4xMjc3NTgzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF82YzkyOTgyY2Y5NjU0ZjNjOTY4MGM0ZTMyMjY1MjljZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lOWJiYjE5OWE1NjM0MGZjYTFkNWRkNzRmZDEyNTU5NSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xMDk1YzVmZmE3NTQ0OWRmYTM1OTY3NjE1NTEzYWI0MyA9ICQoJzxkaXYgaWQ9Imh0bWxfMTA5NWM1ZmZhNzU0NDlkZmEzNTk2NzYxNTUxM2FiNDMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlN0IEdpbGVzIFRydXN0ICAoTG9uZG9uKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTliYmIxOTlhNTYzNDBmY2ExZDVkZDc0ZmQxMjU1OTUuc2V0Q29udGVudChodG1sXzEwOTVjNWZmYTc1NDQ5ZGZhMzU5Njc2MTU1MTNhYjQzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzI5MjhkMmIzN2IwZDRjZDA4OTFkMDE5YzE0ZDhmNzdlLmJpbmRQb3B1cChwb3B1cF9lOWJiYjE5OWE1NjM0MGZjYTFkNWRkNzRmZDEyNTU5NSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYmE4NTdlYzczZDRhNGNmMzllMjJhODU5ZDEyZWZiOTYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MC44Mjc5MzE5LC0wLjE2ODc0OV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmM5Mjk4MmNmOTY1NGYzYzk2ODBjNGUzMjI2NTI5Y2UpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzdmZTMyY2NlZmFkNDkzYWJiMDAyOWVhMDMzNWMzNDkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjg0ZjA1MTliMzAwNDFiOGI5YjIwZjY0NWZhMzljZWQgPSAkKCc8ZGl2IGlkPSJodG1sXzY4NGYwNTE5YjMwMDQxYjhiOWIyMGY2NDVmYTM5Y2VkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5ZTUNBIFJpZ2h0IEhlcmUgKEJyaWdodG9uIGFuZCBIb3ZlKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzdmZTMyY2NlZmFkNDkzYWJiMDAyOWVhMDMzNWMzNDkuc2V0Q29udGVudChodG1sXzY4NGYwNTE5YjMwMDQxYjhiOWIyMGY2NDVmYTM5Y2VkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2JhODU3ZWM3M2Q0YTRjZjM5ZTIyYTg1OWQxMmVmYjk2LmJpbmRQb3B1cChwb3B1cF8zN2ZlMzJjY2VmYWQ0OTNhYmIwMDI5ZWEwMzM1YzM0OSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjIwYmE5ZDRmYjU4NGIzYzkzNTUyNGFlZTEyYWNhNmYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41ODQxNTEsLTIuOTk3NjY0XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF82YzkyOTgyY2Y5NjU0ZjNjOTY4MGM0ZTMyMjY1MjljZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iNDViZjE1MDFkYTQ0ZDk2YmYzNmI1YzAzOWFiY2QwZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iYjRkOTMyM2NlOTM0NmEzODdiOGU4N2UzNTM0YzQ5ZCA9ICQoJzxkaXYgaWQ9Imh0bWxfYmI0ZDkzMjNjZTkzNDZhMzg3YjhlODdlMzUzNGM0OWQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5ldyBQYXRod2F5cyAoTmV3cG9ydCwgR3dlbnQpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iNDViZjE1MDFkYTQ0ZDk2YmYzNmI1YzAzOWFiY2QwZi5zZXRDb250ZW50KGh0bWxfYmI0ZDkzMjNjZTkzNDZhMzg3YjhlODdlMzUzNGM0OWQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjIwYmE5ZDRmYjU4NGIzYzkzNTUyNGFlZTEyYWNhNmYuYmluZFBvcHVwKHBvcHVwX2I0NWJmMTUwMWRhNDRkOTZiZjM2YjVjMDM5YWJjZDBmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83MmNhOTdkYzhjZWI0MzBhOTUzZmQyYTk2MDc2ZjMxZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUyLjI0MDQ3NywtMC45MDI2NTYwMDAwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF82YzkyOTgyY2Y5NjU0ZjNjOTY4MGM0ZTMyMjY1MjljZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yMDI4MmQwMjBkM2I0NWRjODM4OTBmNThlMTRiOTI1NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jYmI2ZTQxMGNlM2U0MzM3OThhNzYzNGQ1YTY3NzdiZSA9ICQoJzxkaXYgaWQ9Imh0bWxfY2JiNmU0MTBjZTNlNDMzNzk4YTc2MzRkNWE2Nzc3YmUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlRoZSBDaHJ5c2FsaXMgRm91bmRhdGlvbiAoTm9ydGhhbXB0b24pPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yMDI4MmQwMjBkM2I0NWRjODM4OTBmNThlMTRiOTI1Ny5zZXRDb250ZW50KGh0bWxfY2JiNmU0MTBjZTNlNDMzNzk4YTc2MzRkNWE2Nzc3YmUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzJjYTk3ZGM4Y2ViNDMwYTk1M2ZkMmE5NjA3NmYzMWUuYmluZFBvcHVwKHBvcHVwXzIwMjgyZDAyMGQzYjQ1ZGM4Mzg5MGY1OGUxNGI5MjU3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wYWNmMTgxYThmNGU0YmNmYjBmMzdlNzNkYjA0YWZlMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUyLjk1NDc4MzE5OTk5OTk5LC0xLjE1ODEwODZdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzZjOTI5ODJjZjk2NTRmM2M5NjgwYzRlMzIyNjUyOWNlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U2MzZhZDU0ZGY5ZDQyY2Y5NWFjNzE0NGQwZTYyZWIxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzUyYzZkNjQzZDViNzQ0OWRiMTUwOGIwYWNhNzg5ZWIzID0gJCgnPGRpdiBpZD0iaHRtbF81MmM2ZDY0M2Q1Yjc0NDlkYjE1MDhiMGFjYTc4OWViMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SGFybWxlc3MgQ0lDIChOb3R0aW5naGFtKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTYzNmFkNTRkZjlkNDJjZjk1YWM3MTQ0ZDBlNjJlYjEuc2V0Q29udGVudChodG1sXzUyYzZkNjQzZDViNzQ0OWRiMTUwOGIwYWNhNzg5ZWIzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzBhY2YxODFhOGY0ZTRiY2ZiMGYzN2U3M2RiMDRhZmUxLmJpbmRQb3B1cChwb3B1cF9lNjM2YWQ1NGRmOWQ0MmNmOTVhYzcxNDRkMGU2MmViMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTI3MGJiYjE1NGU3NDJiMmFkZWNiOTEzZTQ5Y2FkYWEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1My40ODA3NTkzLC0yLjI0MjYzMDVdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzZjOTI5ODJjZjk2NTRmM2M5NjgwYzRlMzIyNjUyOWNlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2YzMWY5Y2E5Y2UwMjQ4ZjY4ZjYzNTc0NzY3MDE1NzljID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg5OWQwODFiNDcyMDRiMjU5NWFhZmU2OTE3N2YzOTVmID0gJCgnPGRpdiBpZD0iaHRtbF84OTlkMDgxYjQ3MjA0YjI1OTVhYWZlNjkxNzdmMzk1ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+aW4ycmVjb3ZlcnkgQ0lDIChNYW5jaGVzdGVyKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjMxZjljYTljZTAyNDhmNjhmNjM1NzQ3NjcwMTU3OWMuc2V0Q29udGVudChodG1sXzg5OWQwODFiNDcyMDRiMjU5NWFhZmU2OTE3N2YzOTVmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzEyNzBiYmIxNTRlNzQyYjJhZGVjYjkxM2U0OWNhZGFhLmJpbmRQb3B1cChwb3B1cF9mMzFmOWNhOWNlMDI0OGY2OGY2MzU3NDc2NzAxNTc5Yyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTNmOTQzMzM4ZjMzNDk5YWFjNjgyOTU3YzEwYmRjNjkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41MDczNTA5LC0wLjEyNzc1ODNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDI1MiwgMTU4LCAxODUpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzZjOTI5ODJjZjk2NTRmM2M5NjgwYzRlMzIyNjUyOWNlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Y1M2E4NjAzZmZjYTQzMGNiZGRmZGZlZjc0YjQ2NTVlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2UzNDIyZmQ0ZDBlNDRiNGNiMGE4NmMxMTAzMjg1MmVkID0gJCgnPGRpdiBpZD0iaHRtbF9lMzQyMmZkNGQwZTQ0YjRjYjBhODZjMTEwMzI4NTJlZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q29tbW9uIFZpc2lvbiAoQ29WaSkgKExvbmRvbik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Y1M2E4NjAzZmZjYTQzMGNiZGRmZGZlZjc0YjQ2NTVlLnNldENvbnRlbnQoaHRtbF9lMzQyMmZkNGQwZTQ0YjRjYjBhODZjMTEwMzI4NTJlZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xM2Y5NDMzMzhmMzM0OTlhYWM2ODI5NTdjMTBiZGM2OS5iaW5kUG9wdXAocG9wdXBfZjUzYTg2MDNmZmNhNDMwY2JkZGZkZmVmNzRiNDY1NWUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Y3YmFkYzgwYTNlZjQ1NzU4YmU4ZDNjOWE2YTg4OWFmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNDQxNDU3OSwtMC4wMTE3MDA2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyNTIsIDE1OCwgMTg1KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF82YzkyOTgyY2Y5NjU0ZjNjOTY4MGM0ZTMyMjY1MjljZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wZTFkNWEyOTYzMWY0NTI0OWJmMmYzNjBlMGIxM2FhYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xM2M4NjcwZGRjZDU0YjQzOWU0ZDQzOTUzMTdiYmNlYyA9ICQoJzxkaXYgaWQ9Imh0bWxfMTNjODY3MGRkY2Q1NGI0MzllNGQ0Mzk1MzE3YmJjZWMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1lbW9yeVRyYWNrcyAoTGV3aXNoYW0pPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wZTFkNWEyOTYzMWY0NTI0OWJmMmYzNjBlMGIxM2FhYS5zZXRDb250ZW50KGh0bWxfMTNjODY3MGRkY2Q1NGI0MzllNGQ0Mzk1MzE3YmJjZWMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjdiYWRjODBhM2VmNDU3NThiZThkM2M5YTZhODg5YWYuYmluZFBvcHVwKHBvcHVwXzBlMWQ1YTI5NjMxZjQ1MjQ5YmYyZjM2MGUwYjEzYWFhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jOTNhM2Q3N2QwYmY0ZGM0YTAwMjYzMGExODNiNmJiYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjQ1NDUxMywtMi41ODc5MV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmM5Mjk4MmNmOTY1NGYzYzk2ODBjNGUzMjI2NTI5Y2UpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2I2ZGFlYWU5OTc4NGI1Yjg3MzhjMzdlODkyODYxYzcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNGY3ZDk5NjEwNzUxNGNkYjgxMTc0Nzg5NDQ5MTQ1YWEgPSAkKCc8ZGl2IGlkPSJodG1sXzRmN2Q5OTYxMDc1MTRjZGI4MTE3NDc4OTQ0OTE0NWFhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Lbm93bGUgV2VzdCBNZWRpYSBDZW50cmUgKEJyaXN0b2wpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83YjZkYWVhZTk5Nzg0YjViODczOGMzN2U4OTI4NjFjNy5zZXRDb250ZW50KGh0bWxfNGY3ZDk5NjEwNzUxNGNkYjgxMTc0Nzg5NDQ5MTQ1YWEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzkzYTNkNzdkMGJmNGRjNGEwMDI2MzBhMTgzYjZiYmIuYmluZFBvcHVwKHBvcHVwXzdiNmRhZWFlOTk3ODRiNWI4NzM4YzM3ZTg5Mjg2MWM3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hZDk5MjcyMDhjZDY0MmNlYTFiNjJkMmZlOGNkMGNmOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjUwNzM1MDksLTAuMTI3NzU4M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjUyLCAxNTgsIDE4NSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmM5Mjk4MmNmOTY1NGYzYzk2ODBjNGUzMjI2NTI5Y2UpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmNiNjM5YTEzNmQ2NDY2YmExMDI4OTMyMWMxMmI1NmMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzk1OGRkMTJjMmNhNDU2ZTliYmE1ZTcyZTk3ODg3M2YgPSAkKCc8ZGl2IGlkPSJodG1sXzc5NThkZDEyYzJjYTQ1NmU5YmJhNWU3MmU5Nzg4NzNmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TdHJlZXRJbnZlc3QgKExvbmRvbik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZjYjYzOWExMzZkNjQ2NmJhMTAyODkzMjFjMTJiNTZjLnNldENvbnRlbnQoaHRtbF83OTU4ZGQxMmMyY2E0NTZlOWJiYTVlNzJlOTc4ODczZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hZDk5MjcyMDhjZDY0MmNlYTFiNjJkMmZlOGNkMGNmOC5iaW5kUG9wdXAocG9wdXBfZmNiNjM5YTEzNmQ2NDY2YmExMDI4OTMyMWMxMmI1NmMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGZlYXR1cmVfZ3JvdXBfODMxMThhZDE1MzI4NGMwOGJhZWNiN2U0N2Y0NmVjY2YgPSBMLmZlYXR1cmVHcm91cCgKICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2NjY2ZkNjk1OWFhNzRiOGY5MjhjMGMwY2YzZDJiZGIzKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZmJlMTk1Mjc3ODM3NDBmOGI2ZTc1MjhlOWNjYTlhYjggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41MDczNTA5LC0wLjEyNzc1ODNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDIzNCw3Nyw5NCknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjM0LDc3LDk0KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF84MzExOGFkMTUzMjg0YzA4YmFlY2I3ZTQ3ZjQ2ZWNjZik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81MTMwNmY0Y2NiZmU0YmI5YWZlNzg1NDc0NDMxZDRiNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lMmUwNTBmMGMxYzY0MjhhOTc2MzAzZTY1NjlmMDA5ZCA9ICQoJzxkaXYgaWQ9Imh0bWxfZTJlMDUwZjBjMWM2NDI4YTk3NjMwM2U2NTY5ZjAwOWQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRpc3J1cHREaXNhYmlsaXR5ICAoTG9uZG9uKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTEzMDZmNGNjYmZlNGJiOWFmZTc4NTQ3NDQzMWQ0YjQuc2V0Q29udGVudChodG1sX2UyZTA1MGYwYzFjNjQyOGE5NzYzMDNlNjU2OWYwMDlkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2ZiZTE5NTI3NzgzNzQwZjhiNmU3NTI4ZTljY2E5YWI4LmJpbmRQb3B1cChwb3B1cF81MTMwNmY0Y2NiZmU0YmI5YWZlNzg1NDc0NDMxZDRiNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTQ2NDM3OTI1MDJiNDIwZjg3MmFiNWFlNDJlNjAwNmEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MC43MTg0MTIsLTMuNTMzODk5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyMzQsNzcsOTQpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDIzNCw3Nyw5NCknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfODMxMThhZDE1MzI4NGMwOGJhZWNiN2U0N2Y0NmVjY2YpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjZmMmE4NWZlMjU3NDI2ZjhmODQwNGJlYjVhMGRmMzMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmI1NDk5MWVjMTZhNDBlOWExMGQ0OTg2NTZiZTE4ZTkgPSAkKCc8ZGl2IGlkPSJodG1sX2JiNTQ5OTFlYzE2YTQwZTlhMTBkNDk4NjU2YmUxOGU5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XRVNDIEZvdW5kYXRpb24gLSBUaGUgU3BlY2lhbGlzdCBDZW50cmUgZm9yIFZpc3VhbCBJbXBhaXJtZW50IChFeGV0ZXIpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mNmYyYTg1ZmUyNTc0MjZmOGY4NDA0YmViNWEwZGYzMy5zZXRDb250ZW50KGh0bWxfYmI1NDk5MWVjMTZhNDBlOWExMGQ0OTg2NTZiZTE4ZTkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZTQ2NDM3OTI1MDJiNDIwZjg3MmFiNWFlNDJlNjAwNmEuYmluZFBvcHVwKHBvcHVwX2Y2ZjJhODVmZTI1NzQyNmY4Zjg0MDRiZWI1YTBkZjMzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mYjg3Y2M0Y2M2NjE0NDcwOTJjOTYzYzAyMDg2NDBiOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjUwNzM1MDksLTAuMTI3NzU4M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjM0LDc3LDk0KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyMzQsNzcsOTQpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzgzMTE4YWQxNTMyODRjMDhiYWVjYjdlNDdmNDZlY2NmKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQ0NWVlNzIxOTQyYzQwMzNiYTg2YjY0NzRlMTYyNzNjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzA1MTY5NTM0OTUzNTQ4OTlhZDZiOGFlMDEyZGMyMWFhID0gJCgnPGRpdiBpZD0iaHRtbF8wNTE2OTUzNDk1MzU0ODk5YWQ2YjhhZTAxMmRjMjFhYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T3hmYW0gKExvbmRvbik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQ0NWVlNzIxOTQyYzQwMzNiYTg2YjY0NzRlMTYyNzNjLnNldENvbnRlbnQoaHRtbF8wNTE2OTUzNDk1MzU0ODk5YWQ2YjhhZTAxMmRjMjFhYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mYjg3Y2M0Y2M2NjE0NDcwOTJjOTYzYzAyMDg2NDBiOS5iaW5kUG9wdXAocG9wdXBfNDQ1ZWU3MjE5NDJjNDAzM2JhODZiNjQ3NGUxNjI3M2MpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzY4MGE2YmE0ZDA4OTQxMDM5OTI5YTM3MjA5NTIzMmMxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTQuMDQ2NTc1LC0yLjgwMDczOTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDIzNCw3Nyw5NCknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjM0LDc3LDk0KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF84MzExOGFkMTUzMjg0YzA4YmFlY2I3ZTQ3ZjQ2ZWNjZik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zM2U2ZDBmODA5MTY0ODE5YjMwMWE1OTlkZjY0Mzg2ZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84MzdhZTkwZGRiZjI0NzQzODZlZTM2ZjU1M2U2N2IzMSA9ICQoJzxkaXYgaWQ9Imh0bWxfODM3YWU5MGRkYmYyNDc0Mzg2ZWUzNmY1NTNlNjdiMzEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlRoZSBXZWxsIChMYW5jYXN0ZXIpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zM2U2ZDBmODA5MTY0ODE5YjMwMWE1OTlkZjY0Mzg2ZS5zZXRDb250ZW50KGh0bWxfODM3YWU5MGRkYmYyNDc0Mzg2ZWUzNmY1NTNlNjdiMzEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjgwYTZiYTRkMDg5NDEwMzk5MjlhMzcyMDk1MjMyYzEuYmluZFBvcHVwKHBvcHVwXzMzZTZkMGY4MDkxNjQ4MTliMzAxYTU5OWRmNjQzODZlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zYjYzMTAxNmU0Yzg0MThhODkyNWU3YzRiNmQ1YjEwNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzU1Ljk1MzI1MiwtMy4xODgyNjddLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDIzNCw3Nyw5NCknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjM0LDc3LDk0KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF84MzExOGFkMTUzMjg0YzA4YmFlY2I3ZTQ3ZjQ2ZWNjZik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81MTUyNzAwOTA4ODc0NWZmOWRmOTEzZWRkMWI3YmIzZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iNDJlNTAyM2RlZTU0MGY0YTg3ZjhmMTA2YjVjM2Q3ZCA9ICQoJzxkaXYgaWQ9Imh0bWxfYjQyZTUwMjNkZWU1NDBmNGE4N2Y4ZjEwNmI1YzNkN2QiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNoZWx0ZXIgU2NvdGxhbmQgKEVkaW5idXJnaCk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzUxNTI3MDA5MDg4NzQ1ZmY5ZGY5MTNlZGQxYjdiYjNmLnNldENvbnRlbnQoaHRtbF9iNDJlNTAyM2RlZTU0MGY0YTg3ZjhmMTA2YjVjM2Q3ZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zYjYzMTAxNmU0Yzg0MThhODkyNWU3YzRiNmQ1YjEwNS5iaW5kUG9wdXAocG9wdXBfNTE1MjcwMDkwODg3NDVmZjlkZjkxM2VkZDFiN2JiM2YpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2IyMWE5MTBhYTdlYTQxNmI5YzQwODIzMDQzM2I3NTdkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNTA3MzUwOSwtMC4xMjc3NTgzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyMzQsNzcsOTQpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDIzNCw3Nyw5NCknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfODMxMThhZDE1MzI4NGMwOGJhZWNiN2U0N2Y0NmVjY2YpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmVhZTRhNzMzZGNlNDc1ZmIxODFmN2I2NGViMWJiMzYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNGNkYTRhNzJhMDdjNDMzMjg2ODRlMDg0ZDc4NTE3ZmYgPSAkKCc8ZGl2IGlkPSJodG1sXzRjZGE0YTcyYTA3YzQzMzI4Njg0ZTA4NGQ3ODUxN2ZmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5EZVBhdWwgVUsgKExvbmRvbik8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JlYWU0YTczM2RjZTQ3NWZiMTgxZjdiNjRlYjFiYjM2LnNldENvbnRlbnQoaHRtbF80Y2RhNGE3MmEwN2M0MzMyODY4NGUwODRkNzg1MTdmZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iMjFhOTEwYWE3ZWE0MTZiOWM0MDgyMzA0MzNiNzU3ZC5iaW5kUG9wdXAocG9wdXBfYmVhZTRhNzMzZGNlNDc1ZmIxODFmN2I2NGViMWJiMzYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA5ZGZmNDRkYjQ2MzQwYjU4YzE5NmJlZDYyZjE1MzliID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNTA3MzUwOSwtMC4xMjc3NTgzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigyMzQsNzcsOTQpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDIzNCw3Nyw5NCknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfODMxMThhZDE1MzI4NGMwOGJhZWNiN2U0N2Y0NmVjY2YpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzU0MWJlZWViNmFmNDMzYmIzYzkwNmY3YzM5ZDE4MjQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWNjN2EzOTc0ZGZkNDlmNDgwYjQzYzg4ZmVjNjU1OTQgPSAkKCc8ZGl2IGlkPSJodG1sX2VjYzdhMzk3NGRmZDQ5ZjQ4MGI0M2M4OGZlYzY1NTk0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5UaGUgQWxleGFuZHJhIFJvc2UgQ2hhcml0eSAoTG9uZG9uKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzU0MWJlZWViNmFmNDMzYmIzYzkwNmY3YzM5ZDE4MjQuc2V0Q29udGVudChodG1sX2VjYzdhMzk3NGRmZDQ5ZjQ4MGI0M2M4OGZlYzY1NTk0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzA5ZGZmNDRkYjQ2MzQwYjU4YzE5NmJlZDYyZjE1MzliLmJpbmRQb3B1cChwb3B1cF9jNTQxYmVlZWI2YWY0MzNiYjNjOTA2ZjdjMzlkMTgyNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDcwYmJiOTA3MDE4NDRiMzg1Njg2Zjk0OTBlNDJhOTcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1My4zOTAwNDQxLC0yLjU5Njk1MDFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDIzNCw3Nyw5NCknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjM0LDc3LDk0KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF84MzExOGFkMTUzMjg0YzA4YmFlY2I3ZTQ3ZjQ2ZWNjZik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zODk1OTdlZTg5ZDU0YTY2Yjc2NzZkYTkzNGM3MTVlZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83ZmYyMTg3NWM2ODA0NjdhODhmNDE4ZTBhM2RlMzgzNSA9ICQoJzxkaXYgaWQ9Imh0bWxfN2ZmMjE4NzVjNjgwNDY3YTg4ZjQxOGUwYTNkZTM4MzUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNpZ25IZWFsdGggKFdhcnJpbmd0b24pPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zODk1OTdlZTg5ZDU0YTY2Yjc2NzZkYTkzNGM3MTVlZi5zZXRDb250ZW50KGh0bWxfN2ZmMjE4NzVjNjgwNDY3YTg4ZjQxOGUwYTNkZTM4MzUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDcwYmJiOTA3MDE4NDRiMzg1Njg2Zjk0OTBlNDJhOTcuYmluZFBvcHVwKHBvcHVwXzM4OTU5N2VlODlkNTRhNjZiNzY3NmRhOTM0YzcxNWVmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xOGMwOTUwNThjNTA0YjdiOGVjZmQxNmZkMGI3NjI0ZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjQ1NDUxMywtMi41ODc5MV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjM0LDc3LDk0KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigyMzQsNzcsOTQpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzgzMTE4YWQxNTMyODRjMDhiYWVjYjdlNDdmNDZlY2NmKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQ4N2VkNDBkNDkxNzQ4ZDJiZjEyZDJiZWFjZmYzMDY4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNkYjQ5ZjNlMTVhNDRmZWZiYWJmOWY1YzVlYzY4NDJlID0gJCgnPGRpdiBpZD0iaHRtbF8zZGI0OWYzZTE1YTQ0ZmVmYmFiZjlmNWM1ZWM2ODQyZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QnJpc3RvbCBCcmFpbGxlIFRlY2hub2xvZ3kgQ0lDIChCcmlzdG9sKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDg3ZWQ0MGQ0OTE3NDhkMmJmMTJkMmJlYWNmZjMwNjguc2V0Q29udGVudChodG1sXzNkYjQ5ZjNlMTVhNDRmZWZiYWJmOWY1YzVlYzY4NDJlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzE4YzA5NTA1OGM1MDRiN2I4ZWNmZDE2ZmQwYjc2MjRkLmJpbmRQb3B1cChwb3B1cF80ODdlZDQwZDQ5MTc0OGQyYmYxMmQyYmVhY2ZmMzA2OCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjA1YjVmNWIxMmFmNDNhOGI3Yzg5OGZlOTBhYzczMTMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS40NTQ1MTMsLTIuNTg3OTFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDIzNCw3Nyw5NCknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMjM0LDc3LDk0KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF84MzExOGFkMTUzMjg0YzA4YmFlY2I3ZTQ3ZjQ2ZWNjZik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xYzMzNzFhOTE2MTg0ODRlOWRmYmM4NDAzY2QwYmI0OSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iNDA3MDk3MjU3NGI0YjgzYmM0MWE0OGRlOWRlOTNlOCA9ICQoJzxkaXYgaWQ9Imh0bWxfYjQwNzA5NzI1NzRiNGI4M2JjNDFhNDhkZTlkZTkzZTgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldvbWVuJiMzOTtzIEFpZCAoQnJpc3RvbCk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzFjMzM3MWE5MTYxODQ4NGU5ZGZiYzg0MDNjZDBiYjQ5LnNldENvbnRlbnQoaHRtbF9iNDA3MDk3MjU3NGI0YjgzYmM0MWE0OGRlOWRlOTNlOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mMDViNWY1YjEyYWY0M2E4YjdjODk4ZmU5MGFjNzMxMy5iaW5kUG9wdXAocG9wdXBfMWMzMzcxYTkxNjE4NDg0ZTlkZmJjODQwM2NkMGJiNDkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGZlYXR1cmVfZ3JvdXBfZTk2MTg2MTQ5NDliNGVkZmExNTE0ZDZkMDAyMmNlNTEgPSBMLmZlYXR1cmVHcm91cCgKICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2NjY2ZkNjk1OWFhNzRiOGY5MjhjMGMwY2YzZDJiZGIzKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDcxOTYwMjE3ZjI3NDNhMjkzZDMzMTRiZTA5YzYxY2YgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs1My42MDk3MTM2LC0yLjE1NjFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncmdiKDEyNSwgNDQsIDE2OSknLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZ2IoMTI1LCA0NCwgMTY5KScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuc2V0UmFkaXVzKDYpCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9lOTYxODYxNDk0OWI0ZWRmYTE1MTRkNmQwMDIyY2U1MSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zNGMwYTg0OGJjN2Y0NDQ5ODA2OTBjMWM4NjAyYjc1NiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hOWE1NTg4NWYyOTc0YTY2OGVlOWE5YWVhYjVkMDVjYyA9ICQoJzxkaXYgaWQ9Imh0bWxfYTlhNTU4ODVmMjk3NGE2NjhlZTlhOWFlYWI1ZDA1Y2MiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlZJQkUgKFJvY2hkYWxlKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzRjMGE4NDhiYzdmNDQ0OTgwNjkwYzFjODYwMmI3NTYuc2V0Q29udGVudChodG1sX2E5YTU1ODg1ZjI5NzRhNjY4ZWU5YTlhZWFiNWQwNWNjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzA3MTk2MDIxN2YyNzQzYTI5M2QzMzE0YmUwOWM2MWNmLmJpbmRQb3B1cChwb3B1cF8zNGMwYTg0OGJjN2Y0NDQ5ODA2OTBjMWM4NjAyYjc1Nik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjVhNTMyNjdhNTgzNGE4ODhmMGE1ZDcyNmRmMTIzYTggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszMS41NDQ4Nzc3OTk5OTk5OSw3NC4yOTYwNTQyXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYigxMjUsIDQ0LCAxNjkpJywKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmdiKDEyNSwgNDQsIDE2OSknLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLnNldFJhZGl1cyg2KQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZTk2MTg2MTQ5NDliNGVkZmExNTE0ZDZkMDAyMmNlNTEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzdjYmUyMWM4Y2EyNGYzZmI1M2FlMjllMTk3MzBiZDcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODQ2NGIxOTMzNDVjNGI0NWEwMTZkYzkyODJjMmIwM2YgPSAkKCc8ZGl2IGlkPSJodG1sXzg0NjRiMTkzMzQ1YzRiNDVhMDE2ZGM5MjgyYzJiMDNmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SZXNlbiBGb3IgTmF0aW9ucyAoTERBIENvbG9ueSBMYWhvcmUgUGFraXN0YW4gKTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzdjYmUyMWM4Y2EyNGYzZmI1M2FlMjllMTk3MzBiZDcuc2V0Q29udGVudChodG1sXzg0NjRiMTkzMzQ1YzRiNDVhMDE2ZGM5MjgyYzJiMDNmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2I1YTUzMjY3YTU4MzRhODg4ZjBhNWQ3MjZkZjEyM2E4LmJpbmRQb3B1cChwb3B1cF83N2NiZTIxYzhjYTI0ZjNmYjUzYWUyOWUxOTczMGJkNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfN2M0MzY0OGIyOTZmNDZiYmE5MjgwZDYwZGE1ZWY1ZTUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFsxOC40ODYwNTc1LC02OS45MzEyMTE2OTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2IoMTI1LCA0NCwgMTY5KScsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JnYigxMjUsIDQ0LCAxNjkpJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5zZXRSYWRpdXMoNikKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2U5NjE4NjE0OTQ5YjRlZGZhMTUxNGQ2ZDAwMjJjZTUxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2UxNTI5YzM2YzVkMTRlOTliM2VlZmU5OTc5MTNlZWU0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg0MDcxOWU3MjUyYjQ2MjViNWY5ZDZlMjZmNWFjOGNkID0gJCgnPGRpdiBpZD0iaHRtbF84NDA3MTllNzI1MmI0NjI1YjVmOWQ2ZTI2ZjVhYzhjZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Sm9tcGVhbWUuY29tIChTYW50byBEb21pbmdvLCBEb21pbmljYW4gUmVwdWJsaWMpPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lMTUyOWMzNmM1ZDE0ZTk5YjNlZWZlOTk3OTEzZWVlNC5zZXRDb250ZW50KGh0bWxfODQwNzE5ZTcyNTJiNDYyNWI1ZjlkNmUyNmY1YWM4Y2QpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfN2M0MzY0OGIyOTZmNDZiYmE5MjgwZDYwZGE1ZWY1ZTUuYmluZFBvcHVwKHBvcHVwX2UxNTI5YzM2YzVkMTRlOTliM2VlZmU5OTc5MTNlZWU0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBsYXllcl9jb250cm9sXzI1NDI2YjNkOGY1MzQyMWFiZTBiY2JiMGQwNzFiOWVmID0gewogICAgICAgICAgICAgICAgYmFzZV9sYXllcnMgOiB7ICJzdGFtZW50b25lciIgOiB0aWxlX2xheWVyX2VhZDRiYTU5NDI4ZjRmZmE4ZTFhYTVjZGE3OTA1YjYzLCB9LAogICAgICAgICAgICAgICAgb3ZlcmxheXMgOiB7ICJMb25nbGlzdGVkIiA6IGZlYXR1cmVfZ3JvdXBfMWI5ODQ2NTJlNWU5NGJkMjgwYzFhZDU5MzBmNjhjOTYsIk5vdCBzdWNjZXNzZnVsIiA6IGZlYXR1cmVfZ3JvdXBfNmM5Mjk4MmNmOTY1NGYzYzk2ODBjNGUzMjI2NTI5Y2UsIlN1Y2Nlc3NmdWwiIDogZmVhdHVyZV9ncm91cF84MzExOGFkMTUzMjg0YzA4YmFlY2I3ZTQ3ZjQ2ZWNjZiwiSW5lbGlnaWJsZSIgOiBmZWF0dXJlX2dyb3VwX2U5NjE4NjE0OTQ5YjRlZGZhMTUxNGQ2ZDAwMjJjZTUxLCB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICBMLmNvbnRyb2wubGF5ZXJzKAogICAgICAgICAgICAgICAgbGF5ZXJfY29udHJvbF8yNTQyNmIzZDhmNTM0MjFhYmUwYmNiYjBkMDcxYjllZi5iYXNlX2xheWVycywKICAgICAgICAgICAgICAgIGxheWVyX2NvbnRyb2xfMjU0MjZiM2Q4ZjUzNDIxYWJlMGJjYmIwZDA3MWI5ZWYub3ZlcmxheXMsCiAgICAgICAgICAgICAgICB7cG9zaXRpb246ICd0b3ByaWdodCcsCiAgICAgICAgICAgICAgICAgY29sbGFwc2VkOiB0cnVlLAogICAgICAgICAgICAgICAgIGF1dG9aSW5kZXg6IHRydWUKICAgICAgICAgICAgICAgIH0pLmFkZFRvKG1hcF9jY2NmZDY5NTlhYTc0YjhmOTI4YzBjMGNmM2QyYmRiMyk7CiAgICAgICAgCjwvc2NyaXB0Pg=="
          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+DQogICAgICAgPHNjcmlwdCBzcmM9J2h0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL0NoYXJ0LmpzLzIuNS4wL0NoYXJ0LmJ1bmRsZS5taW4uanMnPjwvc2NyaXB0Pg0KICAgIA0KICAgICAgICA8Y2FudmFzIGlkPSdjaGFydF90ZWNoJz48L2NhbnZhcz4NCiAgICAgICAgPHNjcmlwdD4NCiAgICAgICAgICAgIHZhciBjdHggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2hhcnRfdGVjaCcpLmdldENvbnRleHQoJzJkJyk7DQogICAgICAgICAgICBjdHguY2FudmFzLndpZHRoICA9IDgwMCAtICguMSAqIDgwMCk7DQogICAgICAgICAgICBjdHguY2FudmFzLmhlaWdodCA9IDUwMCAtICguMTUgKiA1MDApOw0KICAgICAgICAgICAgdmFyIG15TmV3Q2hhcnQgPSBuZXcgQ2hhcnQoY3R4LHsgdHlwZTogJ2hvcml6b250YWxCYXInLCBkYXRhOiB7DQogICAgJ2RhdGFzZXRzJzogWw0KICAgICAgICB7DQogICAgICAgICAgICAnbGFiZWwnOiAnTm90IHN1Y2Nlc3NmdWwnLA0KICAgICAgICAgICAgJ2RhdGEnOiBbDQogICAgICAgICAgICAgICAgMjYuMCwNCiAgICAgICAgICAgICAgICAyMi4wLA0KICAgICAgICAgICAgICAgIDcuMCwNCiAgICAgICAgICAgICAgICA2LjAsDQogICAgICAgICAgICAgICAgNi4wLA0KICAgICAgICAgICAgICAgIDUuMCwNCiAgICAgICAgICAgICAgICA1LjAsDQogICAgICAgICAgICAgICAgMy4wLA0KICAgICAgICAgICAgICAgIDUuMCwNCiAgICAgICAgICAgICAgICA2LjANCiAgICAgICAgICAgIF0sDQogICAgICAgICAgICAnYmFja2dyb3VuZENvbG9yJzogJ3JnYigyNTIsIDE1OCwgMTg1KScNCiAgICAgICAgfSwNCiAgICAgICAgew0KICAgICAgICAgICAgJ2xhYmVsJzogJ0xvbmdsaXN0ZWQnLA0KICAgICAgICAgICAgJ2RhdGEnOiBbDQogICAgICAgICAgICAgICAgMTguMCwNCiAgICAgICAgICAgICAgICAyLjAsDQogICAgICAgICAgICAgICAgMy4wLA0KICAgICAgICAgICAgICAgIDQuMCwNCiAgICAgICAgICAgICAgICAxLjAsDQogICAgICAgICAgICAgICAgMi4wLA0KICAgICAgICAgICAgICAgIDIuMCwNCiAgICAgICAgICAgICAgICAzLjAsDQogICAgICAgICAgICAgICAgMS4wLA0KICAgICAgICAgICAgICAgIDEuMA0KICAgICAgICAgICAgXSwNCiAgICAgICAgICAgICdiYWNrZ3JvdW5kQ29sb3InOiAncmdiKDAsIDEyOCwgMTU2KScNCiAgICAgICAgfSwNCiAgICAgICAgew0KICAgICAgICAgICAgJ2xhYmVsJzogJ1N1Y2Nlc3NmdWwnLA0KICAgICAgICAgICAgJ2RhdGEnOiBbDQogICAgICAgICAgICAgICAgNC4wLA0KICAgICAgICAgICAgICAgIDEuMCwNCiAgICAgICAgICAgICAgICAwLjAsDQogICAgICAgICAgICAgICAgMC4wLA0KICAgICAgICAgICAgICAgIDEuMCwNCiAgICAgICAgICAgICAgICAxLjAsDQogICAgICAgICAgICAgICAgMC4wLA0KICAgICAgICAgICAgICAgIDEuMCwNCiAgICAgICAgICAgICAgICAxLjAsDQogICAgICAgICAgICAgICAgMC4wDQogICAgICAgICAgICBdLA0KICAgICAgICAgICAgJ2JhY2tncm91bmRDb2xvcic6ICdyZ2IoMjM0LDc3LDk0KScNCiAgICAgICAgfQ0KICAgIF0sDQogICAgJ2xhYmVscyc6IFsNCiAgICAgICAgJ0FwcCcsDQogICAgICAgICdXZWJzaXRlJywNCiAgICAgICAgJ0RpcmVjdG9yeScsDQogICAgICAgICdTaGFyaW5nJywNCiAgICAgICAgJ0hhcmR3YXJlJywNCiAgICAgICAgJ0NoYXQnLA0KICAgICAgICAnU29jaWFsIG1lZGlhJywNCiAgICAgICAgJ09wZW4gc291cmNlJywNCiAgICAgICAgJ0RhdGEgZ2F0aGVyaW5nJywNCiAgICAgICAgJ0NvbnRlbnQnDQogICAgXQ0KfSwgb3B0aW9uczogew0KICAgICdyZXNwb25zaXZlJzogZmFsc2UsDQogICAgJ2xlZ2VuZCc6IHsNCiAgICAgICAgJ3Bvc2l0aW9uJzogJ2JvdHRvbScsDQogICAgICAgICdsYWJlbHMnOiB7DQogICAgICAgICAgICAnZm9udFNpemUnOiAxNiwNCiAgICAgICAgICAgICdmb250RmFtaWx5JzogJ1wnUm9ib3RvXCcsc2Fucy1zZXJpZicNCiAgICAgICAgfQ0KICAgIH0sDQogICAgJ3NjYWxlcyc6IHsNCiAgICAgICAgJ3lBeGVzJzogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICdncmlkTGluZXMnOiB7DQogICAgICAgICAgICAgICAgICAgICdkaXNwbGF5JzogZmFsc2UsDQogICAgICAgICAgICAgICAgICAgICdkcmF3Qm9yZGVyJzogZmFsc2UNCiAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgICd0aWNrcyc6IHsNCiAgICAgICAgICAgICAgICAgICAgJ2ZvbnRTaXplJzogMjAsDQogICAgICAgICAgICAgICAgICAgICdmb250RmFtaWx5JzogJ1wnUm9ib3RvXCcsc2Fucy1zZXJpZicNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICd4QXhlcyc6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAnZ3JpZExpbmVzJzogew0KICAgICAgICAgICAgICAgICAgICAnZGlzcGxheSc6IGZhbHNlLA0KICAgICAgICAgICAgICAgICAgICAnZHJhd0JvcmRlcic6IHRydWUNCiAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgICd0aWNrcyc6IHsNCiAgICAgICAgICAgICAgICAgICAgJ2ZvbnRTaXplJzogMjAsDQogICAgICAgICAgICAgICAgICAgICdmb250RmFtaWx5JzogJ1wnUm9ib3RvXCcsc2Fucy1zZXJpZicNCiAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgICdzdGFja2VkJzogdHJ1ZQ0KICAgICAgICAgICAgfQ0KICAgICAgICBdDQogICAgfQ0KfSB9KTsNCiAgICAgICAgPC9zY3JpcHQ+DQogICAg"
          style="height:600px;width: 100%;border:none !important;" allowfullscreen="" webkitallowfullscreen="" mozallowfullscreen="">

Tags were applied to all 144 applications, with 53 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.

              Not successful
              Longlisted
              Successful
              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+DQogICAgICAgPHNjcmlwdCBzcmM9J2h0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL0NoYXJ0LmpzLzIuNS4wL0NoYXJ0LmJ1bmRsZS5taW4uanMnPjwvc2NyaXB0Pg0KICAgIA0KICAgICAgICA8Y2FudmFzIGlkPSdjaGFydF9hcHByb2FjaGVzJz48L2NhbnZhcz4NCiAgICAgICAgPHNjcmlwdD4NCiAgICAgICAgICAgIHZhciBjdHggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2hhcnRfYXBwcm9hY2hlcycpLmdldENvbnRleHQoJzJkJyk7DQogICAgICAgICAgICBjdHguY2FudmFzLndpZHRoICA9IDgwMCAtICguMSAqIDgwMCk7DQogICAgICAgICAgICBjdHguY2FudmFzLmhlaWdodCA9IDUwMCAtICguMTUgKiA1MDApOw0KICAgICAgICAgICAgdmFyIG15TmV3Q2hhcnQgPSBuZXcgQ2hhcnQoY3R4LHsgdHlwZTogJ2hvcml6b250YWxCYXInLCBkYXRhOiB7DQogICAgJ2RhdGFzZXRzJzogWw0KICAgICAgICB7DQogICAgICAgICAgICAnbGFiZWwnOiAnSW5lbGlnaWJsZScsDQogICAgICAgICAgICAnZGF0YSc6IFsNCiAgICAgICAgICAgICAgICAwLjAsDQogICAgICAgICAgICAgICAgMC4wLA0KICAgICAgICAgICAgICAgIDAuMCwNCiAgICAgICAgICAgICAgICAwLjAsDQogICAgICAgICAgICAgICAgMC4wLA0KICAgICAgICAgICAgICAgIDAuMCwNCiAgICAgICAgICAgICAgICAwLjAsDQogICAgICAgICAgICAgICAgMC4wLA0KICAgICAgICAgICAgICAgIDAuMCwNCiAgICAgICAgICAgICAgICAwLjAsDQogICAgICAgICAgICAgICAgMC4wLA0KICAgICAgICAgICAgICAgIDAuMCwNCiAgICAgICAgICAgICAgICAwLjAsDQogICAgICAgICAgICAgICAgMC4wLA0KICAgICAgICAgICAgICAgIDAuMA0KICAgICAgICAgICAgXSwNCiAgICAgICAgICAgICdiYWNrZ3JvdW5kQ29sb3InOiAncmdiKDEyNSwgNDQsIDE2OSknDQogICAgICAgIH0sDQogICAgICAgIHsNCiAgICAgICAgICAgICdsYWJlbCc6ICdMb25nbGlzdGVkJywNCiAgICAgICAgICAgICdkYXRhJzogWw0KICAgICAgICAgICAgICAgIDYuMCwNCiAgICAgICAgICAgICAgICA1LjAsDQogICAgICAgICAgICAgICAgNy4wLA0KICAgICAgICAgICAgICAgIDAuMCwNCiAgICAgICAgICAgICAgICAzLjAsDQogICAgICAgICAgICAgICAgMS4wLA0KICAgICAgICAgICAgICAgIDQuMCwNCiAgICAgICAgICAgICAgICAyLjAsDQogICAgICAgICAgICAgICAgNC4wLA0KICAgICAgICAgICAgICAgIDEuMCwNCiAgICAgICAgICAgICAgICAyLjAsDQogICAgICAgICAgICAgICAgMS4wLA0KICAgICAgICAgICAgICAgIDEuMCwNCiAgICAgICAgICAgICAgICAxLjAsDQogICAgICAgICAgICAgICAgMC4wDQogICAgICAgICAgICBdLA0KICAgICAgICAgICAgJ2JhY2tncm91bmRDb2xvcic6ICdyZ2IoMCwgMTI4LCAxNTYpJw0KICAgICAgICB9LA0KICAgICAgICB7DQogICAgICAgICAgICAnbGFiZWwnOiAnTm90IHN1Y2Nlc3NmdWwnLA0KICAgICAgICAgICAgJ2RhdGEnOiBbDQogICAgICAgICAgICAgICAgMjMuMCwNCiAgICAgICAgICAgICAgICAxNi4wLA0KICAgICAgICAgICAgICAgIDEzLjAsDQogICAgICAgICAgICAgICAgMTIuMCwNCiAgICAgICAgICAgICAgICA5LjAsDQogICAgICAgICAgICAgICAgOC4wLA0KICAgICAgICAgICAgICAgIDQuMCwNCiAgICAgICAgICAgICAgICA1LjAsDQogICAgICAgICAgICAgICAgMi4wLA0KICAgICAgICAgICAgICAgIDQuMCwNCiAgICAgICAgICAgICAgICAyLjAsDQogICAgICAgICAgICAgICAgMS4wLA0KICAgICAgICAgICAgICAgIDEuMCwNCiAgICAgICAgICAgICAgICAxLjAsDQogICAgICAgICAgICAgICAgMi4wDQogICAgICAgICAgICBdLA0KICAgICAgICAgICAgJ2JhY2tncm91bmRDb2xvcic6ICdyZ2IoMjUyLCAxNTgsIDE4NSknDQogICAgICAgIH0sDQogICAgICAgIHsNCiAgICAgICAgICAgICdsYWJlbCc6ICdTdWNjZXNzZnVsJywNCiAgICAgICAgICAgICdkYXRhJzogWw0KICAgICAgICAgICAgICAgIDEuMCwNCiAgICAgICAgICAgICAgICAzLjAsDQogICAgICAgICAgICAgICAgMy4wLA0KICAgICAgICAgICAgICAgIDEuMCwNCiAgICAgICAgICAgICAgICAxLjAsDQogICAgICAgICAgICAgICAgMS4wLA0KICAgICAgICAgICAgICAgIDAuMCwNCiAgICAgICAgICAgICAgICAwLjAsDQogICAgICAgICAgICAgICAgMS4wLA0KICAgICAgICAgICAgICAgIDAuMCwNCiAgICAgICAgICAgICAgICAwLjAsDQogICAgICAgICAgICAgICAgMC4wLA0KICAgICAgICAgICAgICAgIDAuMCwNCiAgICAgICAgICAgICAgICAwLjAsDQogICAgICAgICAgICAgICAgMC4wDQogICAgICAgICAgICBdLA0KICAgICAgICAgICAgJ2JhY2tncm91bmRDb2xvcic6ICdyZ2IoMjM0LDc3LDk0KScNCiAgICAgICAgfQ0KICAgIF0sDQogICAgJ2xhYmVscyc6IFsNCiAgICAgICAgJ1Byb3ZpZGluZyBpbmZvcm1hdGlvbicsDQogICAgICAgICdBZHZpY2UnLA0KICAgICAgICAnUHJvdmlkaW5nIHNlcnZpY2VzJywNCiAgICAgICAgJ1RyYWluaW5nJywNCiAgICAgICAgJ1BlZXIgc3VwcG9ydCcsDQogICAgICAgICdFZHVjYXRpb24nLA0KICAgICAgICAnRmluZGluZyBvcHBvcnR1bml0aWVzJywNCiAgICAgICAgJ0xlYXJuaW5nJywNCiAgICAgICAgJ0ZpbmRpbmcgc2VydmljZXMnLA0KICAgICAgICAnUHJvdmlkaW5nIHN1cHBvcnQnLA0KICAgICAgICAnU2tpbGxzJywNCiAgICAgICAgJ1NlbGYtYXNzZXNzbWVudCcsDQogICAgICAgICdSZXBvcnRpbmcnLA0KICAgICAgICAnT3JnYW5pc2F0aW9uJywNCiAgICAgICAgJ0RpcmVjdG9yeScNCiAgICBdDQp9LCBvcHRpb25zOiB7DQogICAgJ3Jlc3BvbnNpdmUnOiBmYWxzZSwNCiAgICAnbGVnZW5kJzogew0KICAgICAgICAncG9zaXRpb24nOiAnYm90dG9tJywNCiAgICAgICAgJ2xhYmVscyc6IHsNCiAgICAgICAgICAgICdmb250U2l6ZSc6IDE2LA0KICAgICAgICAgICAgJ2ZvbnRGYW1pbHknOiAnXCdSb2JvdG9cJyxzYW5zLXNlcmlmJw0KICAgICAgICB9DQogICAgfSwNCiAgICAnc2NhbGVzJzogew0KICAgICAgICAneUF4ZXMnOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgJ2dyaWRMaW5lcyc6IHsNCiAgICAgICAgICAgICAgICAgICAgJ2Rpc3BsYXknOiBmYWxzZSwNCiAgICAgICAgICAgICAgICAgICAgJ2RyYXdCb3JkZXInOiBmYWxzZQ0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgJ3RpY2tzJzogew0KICAgICAgICAgICAgICAgICAgICAnZm9udFNpemUnOiAyMCwNCiAgICAgICAgICAgICAgICAgICAgJ2ZvbnRGYW1pbHknOiAnXCdSb2JvdG9cJyxzYW5zLXNlcmlmJw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgXSwNCiAgICAgICAgJ3hBeGVzJzogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICdncmlkTGluZXMnOiB7DQogICAgICAgICAgICAgICAgICAgICdkaXNwbGF5JzogZmFsc2UsDQogICAgICAgICAgICAgICAgICAgICdkcmF3Qm9yZGVyJzogdHJ1ZQ0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgJ3RpY2tzJzogew0KICAgICAgICAgICAgICAgICAgICAnZm9udFNpemUnOiAyMCwNCiAgICAgICAgICAgICAgICAgICAgJ2ZvbnRGYW1pbHknOiAnXCdSb2JvdG9cJyxzYW5zLXNlcmlmJw0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgJ3N0YWNrZWQnOiB0cnVlDQogICAgICAgICAgICB9DQogICAgICAgIF0NCiAgICB9DQp9IH0pOw0KICAgICAgICA8L3NjcmlwdD4NCiAgICA="
          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.

              Ineligible
              Longlisted
              Not successful
              Successful
              All

              providing information
              0
              6
              23
              1
              30

              advice
              0
              5
              16
              3
              24

              providing services
              0
              7
              13
              3
              23

              training
              0
              0
              12
              1
              13

              peer support
              0
              3
              9
              1
              13

              education
              0
              1
              8
              1
              10

              finding opportunities
              0
              4
              4
              0
              8

              learning
              0
              2
              5
              0
              7

              finding services
              0
              4
              2
              1
              7

              providing support
              0
              1
              4
              0
              5

              skills
              0
              2
              2
              0
              4

              self-assessment
              0
              1
              1
              0
              2

              reporting
              0
              1
              1
              0
              2

              organisation
              0
              1
              1
              0
              2

              directory
              0
              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.

Problems being addressed

Applications were tagged with the problem they were trying to solve, 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)

Key themes of applications

          <iframe src="data:text/html;base64,DQogICAgICAgIDwhLS0gTG9hZCBDaGFydHMuanMgLS0+DQogICAgICAgPHNjcmlwdCBzcmM9J2h0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL0NoYXJ0LmpzLzIuNS4wL0NoYXJ0LmJ1bmRsZS5taW4uanMnPjwvc2NyaXB0Pg0KICAgIA0KICAgICAgICA8Y2FudmFzIGlkPSdjaGFydF9wcm9ibGVtcyc+PC9jYW52YXM+DQogICAgICAgIDxzY3JpcHQ+DQogICAgICAgICAgICB2YXIgY3R4ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NoYXJ0X3Byb2JsZW1zJykuZ2V0Q29udGV4dCgnMmQnKTsNCiAgICAgICAgICAgIGN0eC5jYW52YXMud2lkdGggID0gODAwIC0gKC4xICogODAwKTsNCiAgICAgICAgICAgIGN0eC5jYW52YXMuaGVpZ2h0ID0gNTAwIC0gKC4xNSAqIDUwMCk7DQogICAgICAgICAgICB2YXIgbXlOZXdDaGFydCA9IG5ldyBDaGFydChjdHgseyB0eXBlOiAnaG9yaXpvbnRhbEJhcicsIGRhdGE6IHsNCiAgICAnZGF0YXNldHMnOiBbDQogICAgICAgIHsNCiAgICAgICAgICAgICdsYWJlbCc6ICdJbmVsaWdpYmxlJywNCiAgICAgICAgICAgICdkYXRhJzogWw0KICAgICAgICAgICAgICAgIDAuMCwNCiAgICAgICAgICAgICAgICAxLjAsDQogICAgICAgICAgICAgICAgMC4wLA0KICAgICAgICAgICAgICAgIDAuMCwNCiAgICAgICAgICAgICAgICAwLjANCiAgICAgICAgICAgIF0sDQogICAgICAgICAgICAnYmFja2dyb3VuZENvbG9yJzogJ3JnYigxMjUsIDQ0LCAxNjkpJw0KICAgICAgICB9LA0KICAgICAgICB7DQogICAgICAgICAgICAnbGFiZWwnOiAnTG9uZ2xpc3RlZCcsDQogICAgICAgICAgICAnZGF0YSc6IFsNCiAgICAgICAgICAgICAgICAxMC4wLA0KICAgICAgICAgICAgICAgIDExLjAsDQogICAgICAgICAgICAgICAgMTEuMCwNCiAgICAgICAgICAgICAgICAzLjAsDQogICAgICAgICAgICAgICAgMS4wDQogICAgICAgICAgICBdLA0KICAgICAgICAgICAgJ2JhY2tncm91bmRDb2xvcic6ICdyZ2IoMCwgMTI4LCAxNTYpJw0KICAgICAgICB9LA0KICAgICAgICB7DQogICAgICAgICAgICAnbGFiZWwnOiAnTm90IHN1Y2Nlc3NmdWwnLA0KICAgICAgICAgICAgJ2RhdGEnOiBbDQogICAgICAgICAgICAgICAgMjkuMCwNCiAgICAgICAgICAgICAgICAyNC4wLA0KICAgICAgICAgICAgICAgIDIxLjAsDQogICAgICAgICAgICAgICAgMTIuMCwNCiAgICAgICAgICAgICAgICA2LjANCiAgICAgICAgICAgIF0sDQogICAgICAgICAgICAnYmFja2dyb3VuZENvbG9yJzogJ3JnYigyNTIsIDE1OCwgMTg1KScNCiAgICAgICAgfSwNCiAgICAgICAgew0KICAgICAgICAgICAgJ2xhYmVsJzogJ1N1Y2Nlc3NmdWwnLA0KICAgICAgICAgICAgJ2RhdGEnOiBbDQogICAgICAgICAgICAgICAgNS4wLA0KICAgICAgICAgICAgICAgIDIuMCwNCiAgICAgICAgICAgICAgICAxLjAsDQogICAgICAgICAgICAgICAgMS4wLA0KICAgICAgICAgICAgICAgIDAuMA0KICAgICAgICAgICAgXSwNCiAgICAgICAgICAgICdiYWNrZ3JvdW5kQ29sb3InOiAncmdiKDIzNCw3Nyw5NCknDQogICAgICAgIH0NCiAgICBdLA0KICAgICdsYWJlbHMnOiBbDQogICAgICAgICdIZWFsdGggYW5kIHdlbGxiZWluZycsDQogICAgICAgICdTdHJvbmdlciBjb21tdW5pdGllcycsDQogICAgICAgICdDaGlsZHJlbiBhbmQgeW91bmcgcGVvcGxlJywNCiAgICAgICAgJ1dvbWVuIGFuZCBnaXJscycsDQogICAgICAgICdNaWdyYXRpb24nDQogICAgXQ0KfSwgb3B0aW9uczogew0KICAgICdyZXNwb25zaXZlJzogZmFsc2UsDQogICAgJ2xlZ2VuZCc6IHsNCiAgICAgICAgJ3Bvc2l0aW9uJzogJ2JvdHRvbScsDQogICAgICAgICdsYWJlbHMnOiB7DQogICAgICAgICAgICAnZm9udFNpemUnOiAxNiwNCiAgICAgICAgICAgICdmb250RmFtaWx5JzogJ1wnUm9ib3RvXCcsc2Fucy1zZXJpZicNCiAgICAgICAgfQ0KICAgIH0sDQogICAgJ3NjYWxlcyc6IHsNCiAgICAgICAgJ3lBeGVzJzogWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICdncmlkTGluZXMnOiB7DQogICAgICAgICAgICAgICAgICAgICdkaXNwbGF5JzogZmFsc2UsDQogICAgICAgICAgICAgICAgICAgICdkcmF3Qm9yZGVyJzogZmFsc2UNCiAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgICd0aWNrcyc6IHsNCiAgICAgICAgICAgICAgICAgICAgJ2ZvbnRTaXplJzogMjAsDQogICAgICAgICAgICAgICAgICAgICdmb250RmFtaWx5JzogJ1wnUm9ib3RvXCcsc2Fucy1zZXJpZicNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIF0sDQogICAgICAgICd4QXhlcyc6IFsNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAnZ3JpZExpbmVzJzogew0KICAgICAgICAgICAgICAgICAgICAnZGlzcGxheSc6IGZhbHNlLA0KICAgICAgICAgICAgICAgICAgICAnZHJhd0JvcmRlcic6IHRydWUNCiAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgICd0aWNrcyc6IHsNCiAgICAgICAgICAgICAgICAgICAgJ2ZvbnRTaXplJzogMjAsDQogICAgICAgICAgICAgICAgICAgICdmb250RmFtaWx5JzogJ1wnUm9ib3RvXCcsc2Fucy1zZXJpZicNCiAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgICdzdGFja2VkJzogdHJ1ZQ0KICAgICAgICAgICAgfQ0KICAgICAgICBdDQogICAgfQ0KfSB9KTsNCiAgICAgICAgPC9zY3JpcHQ+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).

              Ineligible
              Longlisted
              Not successful
              Successful
              All

              health and wellbeing
              0
              10
              29
              5
              44

              stronger communities
              1
              11
              24
              2
              38

              children and young people
              0
              11
              21
              1
              33

              women and girls
              0
              3
              12
              1
              16

              migration
              0
              1
              6
              0
              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="">

              Longlisted
              Not successful
              Successful
              All

              beneficiaries
              31
              74
              10
              115

              professionals
              5
              16
              1
              22

              public
              2
              8
              0
              10

              organisations
              2
              7
              0
              9

              volunteers
              1
              1
              0
              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.

              Longlisted
              Not successful
              Successful
              All

              children and young people
              8
              17
              1
              26

              people with health condition
              6
              17
              3
              26

              women and girls
              2
              6
              1
              9

              residents
              2
              5
              0
              7

              migrants and refugees
              1
              6
              0
              7

              homeless
              1
              3
              2
              6

              people with mental health condition
              0
              5
              0
              5

              people with addiction
              2
              2
              1
              5

              people in poverty
              1
              3
              1
              5

              older people
              2
              3
              0
              5

              offenders
              2
              2
              0
              4

              families
              1
              2
              1
              4

              parents
              2
              1
              0
              3

              people with disability
              0
              2
              1
              3

              victims of abuse
              1
              2
              0
              3

              lgbt people
              0
              2
              0
              2

              people with learning disability
              0
              2
              0
              2

              carers
              1
              1
              0
              2

              isolated people
              1
              0
              0
              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.

              Ineligible
              Not successful
              Longlisted
              Successful
              All

              Concept
              0
              42
              8
              1
              51

              Build
              0
              15
              8
              5
              28

              Demonstrate
              0
              14
              12
              1
              27

              Develop
              0
              16
              7
              2
              25

              Readiness
              0
              5
              1
              1
              7

              Scaling
              0
              3
              0
              0
              3

              Unknown
              3
              0
              0
              0
              3

              All
              3
              95
              36
              10
              144