F1 Abu Dhabi Grand Prix hospitality and tickets · 3 to 6 Dec 2026
Feel the speed, soak up the atmosphere and experience every moment live at the F1 season finale.
First GP 2009 Formula 1 at Yas Marina since
Corners 16 Across 5.281 km of circuit
Laps 58 From daylight into the floodlit night
Champions 05 Titles decided at Yas Marina since 2010
LyogZXNWaW1lb0xvb3A6IHNlYW1sZXNzIGhlcm8gbG9vcCwgQ0wtMjAyNjA5MzAtMDQsIGxlYW4gc3RhbmRieSBhbmQgcXVhbGl0eSBjYXAgQ0wtMjAyNjEw
MDctMDUsIDcyMHAgQ0wtMjAyNjEwMDctMDggKi8oZnVuY3Rpb24oKXt2YXIgTz0iaHR0cHM6Ly9wbGF5ZXIudmltZW8uY29tIixtbT13aW5kb3cubWF0Y2hN
ZWRpYT9mdW5jdGlvbihxKXtyZXR1cm4gbWF0Y2hNZWRpYShxKS5tYXRjaGVzfTpmdW5jdGlvbigpe3JldHVybiBmYWxzZX07dmFyIFJNPW1tKCIocHJlZmVy
cy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKSIpLFE9IjcyMHAiO3ZhciB3cmFwcz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuaGVyby12aWRlby13cmFw
Iik7Zm9yKHZhciB3PTA7dzx3cmFwcy5sZW5ndGg7dysrKShmdW5jdGlvbih3cmFwKXt2YXIgYT13cmFwLnF1ZXJ5U2VsZWN0b3IoImlmcmFtZSIpO2lmKCFh
fHwoYS5nZXRBdHRyaWJ1dGUoInNyYyIpfHwiIikuaW5kZXhPZihPKSE9PTB8fHdyYXAuaGFzQXR0cmlidXRlKCJkYXRhLWVzdmwiKSlyZXR1cm47d3JhcC5z
ZXRBdHRyaWJ1dGUoImRhdGEtZXN2bCIsIjEiKTtpZihSTSYmd3JhcC5jbG9zZXN0JiZ3cmFwLmNsb3Nlc3QoIi5wYWdlLWhlcm8iKSl7YS5wYXJlbnROb2Rl
LnJlbW92ZUNoaWxkKGEpO3JldHVybn12YXIgUD1be2Y6YSxkdXI6MCx0aWNrczowLHE6MH0sbnVsbF0sYWN0PTAsZmFkaW5nPTAsaGVsZD0wLExFQUQ9MS4x
LEZBREU9OTAwLFBSRVA9MTA7ZnVuY3Rpb24gc2VuZChwLG0sdil7aWYoIXApcmV0dXJuO3RyeXt2YXIgbz17bWV0aG9kOm19O2lmKHYhPT12b2lkIDApby52
YWx1ZT12O3AuZi5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KG8pLE8pfWNhdGNoKGUpe319ZnVuY3Rpb24gYXJtKHApe2lmKCFw
LnEpc2VuZChwLCJzZXRRdWFsaXR5IixRKTtpZihSTSlyZXR1cm47c2VuZChwLCJhZGRFdmVudExpc3RlbmVyIiwidGltZXVwZGF0ZSIpO3NlbmQocCwiZ2V0
RHVyYXRpb24iKX1mdW5jdGlvbiBwYXJrKHApe3NlbmQocCwicGF1c2UiKTtzZW5kKHAsInNldEN1cnJlbnRUaW1lIiwwKX1mdW5jdGlvbiBtYWtlKCl7dmFy
IGI9YS5jbG9uZU5vZGUoZmFsc2UpO2IucmVtb3ZlQXR0cmlidXRlKCJpZCIpO2Iuc2V0QXR0cmlidXRlKCJsb2FkaW5nIiwiZWFnZXIiKTtiLnNldEF0dHJp
YnV0ZSgidGFiaW5kZXgiLCItMSIpO2Iuc2V0QXR0cmlidXRlKCJkYXRhLWVzdmwiLCJvZmYiKTt2YXIgcD17ZjpiLGR1cjowLHRpY2tzOjAscTowfTtQWzEt
YWN0XT1wO2IuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsZnVuY3Rpb24oKXthcm0ocCl9KTt3cmFwLmFwcGVuZENoaWxkKGIpO3ZhciBuPTAsdD1zZXRJbnRl
cnZhbChmdW5jdGlvbigpe2lmKHAudGlja3N8fCsrbj44KXtjbGVhckludGVydmFsKHQpO3JldHVybn1hcm0ocCl9LDE1MDApfWZ1bmN0aW9uIHN3YXAoKXt2
YXIgbj1QWzEtYWN0XSxjPVBbYWN0XTtpZihmYWRpbmd8fGhlbGR8fCFufHwhbi50aWNrcylyZXR1cm47ZmFkaW5nPTE7c2VuZChuLCJzZXRDdXJyZW50VGlt
ZSIsMCk7c2VuZChuLCJwbGF5Iik7Yy5mLnNldEF0dHJpYnV0ZSgiZGF0YS1lc3ZsIiwidW5kZXIiKTtuLmYuc2V0QXR0cmlidXRlKCJkYXRhLWVzdmwiLCJv
biIpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtwYXJrKGMpO2MuZi5zZXRBdHRyaWJ1dGUoImRhdGEtZXN2bCIsIm9mZiIpO2FjdD0xLWFjdDtmYWRpbmc9MH0s
RkFERSl9YS5zZXRBdHRyaWJ1dGUoImRhdGEtZXN2bCIsIm9uIik7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixmdW5jdGlvbigpe2FybShQWzBdKX0pO2Fy
bShQWzBdKTt2YXIgbjA9MCx0MD1zZXRJbnRlcnZhbChmdW5jdGlvbigpe2lmKChQWzBdLnRpY2tzfHxSTSkmJlBbMF0ucXx8KytuMD4xMil7Y2xlYXJJbnRl
cnZhbCh0MCk7cmV0dXJufWFybShQWzBdKX0sMTUwMCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGUpe2lmKGUub3JpZ2lu
IT09TylyZXR1cm47dmFyIGk9LTE7Zm9yKHZhciBrPTA7azwyO2srKylpZihQW2tdJiZlLnNvdXJjZT09PVBba10uZi5jb250ZW50V2luZG93KWk9aztpZihp
PDApcmV0dXJuO3ZhciBkPWUuZGF0YTtpZih0eXBlb2YgZD09PSJzdHJpbmciKXt0cnl7ZD1KU09OLnBhcnNlKGQpfWNhdGNoKHgpe3JldHVybn19aWYoIWQp
cmV0dXJuO3ZhciBwPVBbaV07aWYoZC5ldmVudD09PSJyZWFkeSIpe2FybShwKTtyZXR1cm59aWYoZC5tZXRob2Q9PT0ic2V0UXVhbGl0eSIpe3AucT0xO3Jl
dHVybn1pZihkLm1ldGhvZD09PSJnZXREdXJhdGlvbiIpe3AuZHVyPStkLnZhbHVlfHxwLmR1cjtyZXR1cm59aWYoUk0pcmV0dXJuO2lmKChkLmV2ZW50PT09
InBsYXlQcm9ncmVzcyJ8fGQuZXZlbnQ9PT0idGltZXVwZGF0ZSIpJiZkLmRhdGEpe3AudGlja3MrKztpZihkLmRhdGEuZHVyYXRpb24pcC5kdXI9ZC5kYXRh
LmR1cmF0aW9uO2lmKGk9PT1hY3Qpe3ZhciBsZWZ0PXAuZHVyLWQuZGF0YS5zZWNvbmRzO2lmKHAuZHVyJiYhaGVsZCYmIWZhZGluZyYmIVBbMS1hY3RdJiZs
ZWZ0PkxFQUQmJmxlZnQ8PU1hdGgubWluKFBSRVAscC5kdXIvMikpbWFrZSgpO2lmKCFmYWRpbmcmJnAuZHVyJiZsZWZ0PD1MRUFEKXN3YXAoKX1lbHNlIGlm
KCFmYWRpbmcmJiFoZWxkJiZkLmRhdGEuc2Vjb25kcz4uMDUpcGFyayhwKX19KTt2YXIgaGVybz13cmFwLmNsb3Nlc3Q/d3JhcC5jbG9zZXN0KCIucGFnZS1o
ZXJvLC5oZXJvIik6bnVsbCxidG49aGVybyYmaGVyby5xdWVyeVNlbGVjdG9yKCIuaGVyby12aWQtdG9nZ2xlIik7aWYoYnRuKWJ0bi5hZGRFdmVudExpc3Rl
bmVyKCJjbGljayIsZnVuY3Rpb24oKXtoZWxkPWJ0bi5nZXRBdHRyaWJ1dGUoImFyaWEtcHJlc3NlZCIpPT09InRydWUiO2lmKGhlbGQpe3NlbmQoUFswXSwi
cGF1c2UiKTtzZW5kKFBbMV0sInBhdXNlIil9ZWxzZXtzZW5kKFBbYWN0XSwicGxheSIpO2lmKFBbMS1hY3RdKXBhcmsoUFsxLWFjdF0pfX0pO30pKHdyYXBz
W3ddKTt9KSgpOw==
F1 Abu Dhabi Grand Prix · 3 to 6 Dec 2026 · Packages Now Live
Race Weekend
Where The ChampionshipIs Decided.
The final race of the F1 season lands in Abu Dhabi, bringing three days of speed,
spectacle and high-stakes racing to Yas Marina.
Be there for every moment. This is where championships are decided, rivalries reach their climax and
the world’s best drivers go head-to-head one last time. Add the marina, the atmosphere and the after-race
concerts and you’ve got a race weekend that goes well beyond the track.
As an official Abu Dhabi Grand Prix reseller, we put you closer to the action. Choose from
grandstand and Abu Dhabi Hill tickets through to the Sunset Lounge and trackside suites,
with hotels and transfers available through our team.
One race. One finale. One weekend you’ll be talking about for years.
Yas Marina Circuit, Abu Dhabi Grand Prix
Yas Marina Circuit · 3 to 6 Dec 2026
On Sale Now
Buy Official F1 Abu Dhabi Grand Prix Tickets
←
→
Grandstand Main Grandstand The grid, the pit lane and the podium
Over the starting grid, the pit stops, the finish line and the podium celebrations, with the F1 Fanzone, Oasis areas and After-Race Concerts included.
Hospitality Sunset Lounge Indoor lounge and terrace over Turn 5
An indoor lounge with an outdoor terrace over the Turn 5 braking zone, with food and drink included. Part of our private hospitality range at Yas Marina.
Grandstand West Grandstand The end of the longest straight, into Turns 6 and 7
The cars arrive flat out at the end of the longest straight on the circuit and brake hard for Turns 6 and 7 in front of you. Fanzone, Oasis areas and After-Race Concerts included.
General Admission Abu Dhabi Hill The grass hill inside the North section
Laid-back open-air viewing across Turns 2 to 6, with the freedom to roam between vantage points. Fanzone, Oasis areas and After-Race Concerts included.
Grandstand North Grandstand Over the Turn 5 braking zone
Watch the cars arrive at full speed, hard on the brakes, and fight for the corner at one of the best overtaking spots on the circuit. Fanzone, Oasis areas and After-Race Concerts included.
→ Enquire Now
Grandstand North Straight Grandstand Cars at full speed below
Above the straight, with the cars passing at full speed below you. Pure pace across the race weekend, with the Fanzone, Oasis areas and After-Race Concerts included.
→ Enquire Now
Grandstand West Straight Grandstand Inside the DRS zone, into Turns 6 and 7
Inside the DRS zone on the back straight, where the cars run flat out toward Turns 6 and 7 and the overtakes are set up in front of you. Fanzone, Oasis areas and After-Race Concerts included.
→ Enquire Now
Private hospitality
Private Suites.
Private hospitality at the Abu Dhabi Grand Prix deserves its own space. Our trackside
suites, lounges and private hosted spaces are detailed on our private hospitality page, with full
inventory, floor plans and everything you need to choose the right space.
Shams Suite, Yas Marina Circuit
Most circuits earn a reputation lap by lap over decades. This one opened with a title decider and has crowned world champions ever since.
Read the full story Close the story
Yas Marina opened in 2009 with a season finale and has closed the Formula 1 calendar in most years since. The race begins in daylight and finishes under floodlights, and the transition through sunset is the circuit's signature: track temperature drops sharply through the race and shifts the balance of the cars. The layout was substantially reprofiled in 2021, opening out the hairpin and the marina section, and the racing has been better for it ever since.
ES Sport holds confirmed allocation across the hospitality inventory here , which makes this the one round on the calendar where availability questions get an immediate answer.
First Grand Prix 2009
Location Yas Island, Abu Dhabi
Circuit length 5.281 km
Corners 16
Race laps 58
Capacity Around 60,000
Season finale Every year since 2014
Lap record 1:25.637, Magnussen, 2024
Reprofiled 2021
2026 dates 3 to 6 December
Full house. The Main Grandstand runs the length of the start/finish straight, with the grid and the podium playing out in front of it.
Race configuration. Sixteen corners from daylight into the floodlit night. This is the circuit the 2026 season will be decided on.
Key corners
T1
Turn 1 A tight left immediately after the start, and a regular first lap flashpoint.
T5
Turn 5 Heavy braking at the end of the long back straight and the primary overtaking point on the lap.
T9
Turn 9 Reprofiled in 2021 into a faster, more open corner that improved the following section considerably.
T12–14
Marina section Through the harbour past the yachts and under the Yas Hotel, the most recognisable stretch of the circuit.
T16
Final corner Onto the start/finish straight, deciding the run to the line.
Yasalam Concerts
After-race concerts at Etihad Live every night of the event, with Lewis Capaldi and Zara Larsson leading the 2026 line-up. General admission included.
F1 Fanzone
Access to the F1 Fanzone and all Oasis areas across the circuit throughout the weekend.
Yas Theme Parks
A one day pass to a Yas Island theme park, from Ferrari World to Yas Waterworld.
Museum Entry
Entry to selected museums, making a race weekend an Abu Dhabi weekend.
✓ Included with every ES Sport F1 Abu Dhabi ticket package. Not an upgrade, not an add-on.
Travel How do you get to Yas Marina Circuit?
The circuit is on Yas Island, around 15 minutes from Zayed International Airport and 40 minutes from the city centre. Yas Island accommodation puts you within walking distance of a gate, which is the reason it books out first.
If walking is not an option, taxis and ride-hailing services run to Yas Island throughout the weekend, and there are designated drop-off points close to the gates. Shuttle buses also operate from Yas Island hotels and from set points in Abu Dhabi and Dubai on race days. We can arrange private transfers as part of your package. Tell us your hotel and any accessibility requirements when you enquire and we will confirm the best route in.
Travel First time at the Abu Dhabi GP?
December in the UAE is the most comfortable weather of any round on the calendar. The weekend extends well beyond the circuit: concerts, the island's hotels and the after race programme are a substantial part of what people come for.
FAQ When is the 2026 Abu Dhabi GP?
The race weekend runs 4 to 6 December 2026 at Yas Marina Circuit, with the event opening on 3 December. It closes the Formula 1 season.
FAQ Does ES Sport hold allocation here?
Yes. Abu Dhabi is our home round and we work across suites, lounges, terraces and grandstand seating. Enquiries here get a fast, direct answer on availability.
FAQ Which hospitality option should I choose?
It depends on whether you want the racing or the occasion. Trackside lounges and terrace collections put you at the circuit; suites are the full hosted weekend. Tell us the party and the priority and we will match it.
FAQ Are grandstand tickets sold separately?
Some Yas Marina inventory carries a hotel stay condition rather than being available standalone. We will tell you which applies before you commit to anything.
FAQ What about the concerts?
The Yasalam After-Race Concerts are included with most weekend tickets and are a significant part of the event, with Lewis Capaldi and Zara Larsson leading the 2026 line-up. We can advise on which packages carry which access.
×
Enquire
Secure YourRace Weekend.
We'll get back to you.
LyogRjEgbWFwLCAxMSBTZXAgMjAyNjogY2xvc2UgY29udHJvbCBmb3IgdGhlIGRlc2t0b3Agem9uZSBwYW5lbCwgYW5kIHRoZSBtYXAgcmVkdWNlZCB0byB0
aGUKICAgem9uZXMgd2Ugc3RvY2sgYW5kIHJlZHJhd24gc28gZWFjaCBvbmUgcmVhZHMuIERvbmUgaGVyZSByYXRoZXIgdGhhbiBpbiB0aGUgbWluaWZpZWQg
bWFwIGNvZGUKICAgaW5zaWRlICNlc01haW5Kcy4KCiAgIFNoaXBwZWQgYXMgYmFzZTY0IGZvciB0aGUgc2FtZSByZWFzb24gI2VzTWFpbkpzIGlzOiBzZXJ2
ZWQgdGhyb3VnaCBXb3JkUHJlc3MsIGEgcGxhaW4gaW5saW5lCiAgIHNjcmlwdCBjb21lcyBiYWNrIHdpdGggc29tZSBvZiBpdHMgJiYgcmV3cml0dGVuIHRv
ICYjMDM4OyYjMDM4Oywgd2hpY2ggaXMgYSBzeW50YXggZXJyb3IgYW5kCiAgIHRha2VzIHRoZSB3aG9sZSBibG9jayBkb3duLiBJdCBtYW5nbGVkIHRocmVl
IG9mIHRoZSBzaXh0ZWVuIGhlcmUgYW5kIGxlZnQgdGhlIHJlc3QgYWxvbmUuICovCihmdW5jdGlvbigpewogIHZhciBaT05FUz1bWyJiZDdhOTQ4YTRlNjI0
MWFjYTZlY2M5ZmY1N2Q4YzBmN19jdGciLCJBYnUgRGhhYmkgSGlsbCIsIkFCVSBESEFCSSBISUxMIiwiZ2EiLC02LDE3Ml0sWyJmYTM0OWFmYzUxODY0Y2Fj
Yjk1YTM5OTU1ZDgyYjM3OV9jdGciLCJNYWluIEdyYW5kc3RhbmQiLCJNQUlOIEdSQU5EU1RBTkQiLCJncmFuZHN0YW5kIiwtMTI2LDQ2XSxbIjA5MGUxNjUy
YmQyYTRmYmFiMzBjY2ZhYzk4YzZmYzNjX2N0ZyIsIldlc3QgR3JhbmRzdGFuZCIsIldFU1QgR1JBTkRTVEFORCIsImdyYW5kc3RhbmQiLDIxMCwtNDBdLFsi
ZGRhNDc0ZTU3YzcyNGJmNzk2MDZhNmJhMzJkMjYyZDJfY3RnIiwiU3Vuc2V0IExvdW5nZSIsIlNVTlNFVCBMT1VOR0UiLCJsb3VuZ2UiLDAsLTY2XV0sIEhJ
TEw9ImJkN2E5NDhhNGU2MjQxYWNhNmVjYzlmZjU3ZDhjMGY3X2N0ZyIsIE5TPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI7CiAgLyogc3VidGxlOiB0
aGUgYmFuZCBhIHNoYWRlIGFib3ZlIHRoZSBpbnNpZGUsIHRoZSBlZGdlcyBhIHNoYWRlIGFib3ZlIHRoZSBiYW5kICovCiAgdmFyIFJJTkdfVz0xOCwgUklO
R19UPSIjMkUzNjUwIiwgUklOR19MPSIjNUE2Njg0IiwgUklOR19JPSIjMUIyMTMwIjsKICB2YXIgQlk9e307IFpPTkVTLmZvckVhY2goZnVuY3Rpb24oeil7
IEJZW3pbMF1dPXo7IH0pOwoKICAvKiAtLS0tLS0tLS0tIDEuIGNsb3NlIGNvbnRyb2wgb24gdGhlIGRlc2t0b3Agem9uZSBwYW5lbCAtLS0tLS0tLS0tICov
CiAgdmFyIHBhbmVsPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ6b25lUGFuZWwiKTsgaWYoIXBhbmVsKSByZXR1cm47CiAgdmFyIHRpdGxlPWRvY3VtZW50
LmdldEVsZW1lbnRCeUlkKCJ6cFRpdGxlIiksIGRlc2M9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInpwRGVzYyIpLAogICAgICB0aWVyPWRvY3VtZW50Lmdl
dEVsZW1lbnRCeUlkKCJ6cFRpZXIiKSwgY29kZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgienBDb2RlIiksCiAgICAgIG1lZGlhPWRvY3VtZW50LmdldEVs
ZW1lbnRCeUlkKCJ6cE1lZGlhIiksIHBrZz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgienBQa2ciKTsKICBpZighdGl0bGUpIHJldHVybjsKICB2YXIgYmFz
ZT17dGl0bGU6dGl0bGUudGV4dENvbnRlbnQsZGVzYzpkZXNjP2Rlc2MudGV4dENvbnRlbnQ6IiIsdGllcjp0aWVyP3RpZXIudGV4dENvbnRlbnQ6IiIsY29k
ZTpjb2RlP2NvZGUudGV4dENvbnRlbnQ6IiJ9OwogIHZhciBidG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnV0dG9uIik7CiAgYnRuLnR5cGU9ImJ1dHRv
biI7IGJ0bi5jbGFzc05hbWU9InpwLXgiOyBidG4uc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIiwiQ2xvc2Ugem9uZSBkZXRhaWxzIik7CiAgYnRuLmlubmVy
SFRNTD0iJnRpbWVzOyI7CiAgcGFuZWwuaW5zZXJ0QmVmb3JlKGJ0bixwYW5lbC5maXJzdENoaWxkKTsKICBmdW5jdGlvbiBjbG9zZVBhbmVsKCl7CiAgICB0
aXRsZS50ZXh0Q29udGVudD1iYXNlLnRpdGxlOwogICAgaWYoZGVzYykgZGVzYy50ZXh0Q29udGVudD1iYXNlLmRlc2M7CiAgICBpZih0aWVyKSB0aWVyLnRl
eHRDb250ZW50PWJhc2UudGllcjsKICAgIGlmKGNvZGUpIGNvZGUudGV4dENvbnRlbnQ9YmFzZS5jb2RlOwogICAgaWYobWVkaWEpIG1lZGlhLmhpZGRlbj10
cnVlOwogICAgaWYocGtnKSBwa2cuaGlkZGVuPXRydWU7CiAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JB
bGwoIi5lcy16b25lLmVzLWFjdGl2ZSIpLGZ1bmN0aW9uKHope3ouY2xhc3NMaXN0LnJlbW92ZSgiZXMtYWN0aXZlIik7fSk7CiAgICAvKiB0aGUgbWFwIGRy
YXdzIGl0cyBvd24gY29ybmVyIGJyYWNrZXRzIGludG8gYSA8ZyBpZD0iZXMtbG9jayI+LCBzZXBhcmF0ZWx5IGZyb20gLmVzLWFjdGl2ZSwKICAgICAgIHNv
IGNsZWFyaW5nIHRoZSBjbGFzcyBhbG9uZSBsZWZ0IHRoZSBzdGFuZCBzdGlsbCBsb29raW5nIHBpY2tlZCAqLwogICAgdmFyIGxvY2s9ZG9jdW1lbnQuZ2V0
RWxlbWVudEJ5SWQoImVzLWxvY2siKTsKICAgIGlmKGxvY2spIGxvY2suc3R5bGUuZGlzcGxheT0ibm9uZSI7CiAgICBwYW5lbC5jbGFzc0xpc3QucmVtb3Zl
KCJ6cC1vcGVuIik7CiAgfQogIGJ0bi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsY2xvc2VQYW5lbCk7CiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigi
a2V5ZG93biIsZnVuY3Rpb24oZSl7CiAgICB2YXIgbW9kYWw9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInpvbmVNb2RhbCIpOwogICAgaWYoZS5rZXk9PT0i
RXNjYXBlIiAmJiBwYW5lbC5jbGFzc0xpc3QuY29udGFpbnMoInpwLW9wZW4iKSAmJiAoIW1vZGFsfHxtb2RhbC5oaWRkZW4pKSBjbG9zZVBhbmVsKCk7CiAg
fSk7CiAgbmV3IE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24oKXsKICAgIHBhbmVsLmNsYXNzTGlzdC50b2dnbGUoInpwLW9wZW4iLCB0aXRsZS50ZXh0Q29u
dGVudCE9PWJhc2UudGl0bGUpOwogIH0pLm9ic2VydmUodGl0bGUse2NoaWxkTGlzdDp0cnVlLGNoYXJhY3RlckRhdGE6dHJ1ZSxzdWJ0cmVlOnRydWV9KTsK
CiAgLyogLS0tLS0tLS0tLSAyLiB0aGUgbWFwIGl0c2VsZiAtLS0tLS0tLS0tICovCiAgZnVuY3Rpb24gYm94KGVsKXsgdHJ5eyB2YXIgYj1lbC5nZXRCQm94
KCk7IGlmKCFiLndpZHRoJiYhYi5oZWlnaHQpIHJldHVybiBudWxsOyByZXR1cm4gYjsgfWNhdGNoKGUpeyByZXR1cm4gbnVsbDsgfSB9CiAgZnVuY3Rpb24g
aGlkZShlbCl7IGVsLnN0eWxlLmRpc3BsYXk9Im5vbmUiOyBlbC5zZXRBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIiwidHJ1ZSIpOyBlbC5yZW1vdmVBdHRyaWJ1
dGUoInRhYmluZGV4Iik7IH0KCiAgLyogQWJ1IERoYWJpIEhpbGwgc2hpcHMgYXMgYSBuYXJyb3cgYmFuZCBodWdnaW5nIHRoZSB0cmFjayBlZGdlLiBUaGUg
b2ZmaWNpYWwgbWFwIGRyYXdzIGl0IGFzCiAgICAgdGhlIGxhcmdlIGFyZWEgaXQgaXMsIHNvIHRoZSB0cmFjay1zaWRlIGVkZ2UgaXMgbGVmdCBleGFjdGx5
IHdoZXJlIGl0IGlzIGFuZCB0aGUgZmFyIGVkZ2UgaXMKICAgICBwdXNoZWQgYXdheSBmcm9tIGl0LiAqLwogIGZ1bmN0aW9uIGQyKGEsYil7IHJldHVybiAo
YS54LWIueCkqKGEueC1iLngpKyhhLnktYi55KSooYS55LWIueSk7IH0KICBmdW5jdGlvbiB4eShhKXsgcmV0dXJuIGEueC50b0ZpeGVkKDIpKyIgIithLnku
dG9GaXhlZCgyKTsgfQogIGZ1bmN0aW9uIHdpZGVuKGVsLGYpewogICAgdmFyIEw9ZWwuZ2V0VG90YWxMZW5ndGgmJmVsLmdldFRvdGFsTGVuZ3RoKCk7IGlm
KCFMKSByZXR1cm47CiAgICB2YXIgTj0xMjAscD1bXSxpLGo7CiAgICBmb3IoaT0wO2k8TjtpKyspeyB2YXIgcT1lbC5nZXRQb2ludEF0TGVuZ3RoKEwqaS9O
KTsgcC5wdXNoKHt4OnEueCx5OnEueX0pOyB9CiAgICB2YXIgZmFyPTAsYmVzdD0tMTsKICAgIGZvcihpPTE7aTxOO2krKyl7IHZhciBkPWQyKHBbaV0scFsw
XSk7IGlmKGQ+YmVzdCl7IGJlc3Q9ZDsgZmFyPWk7IH0gfQogICAgaWYoZmFyPDEwfHxmYXI+Ti0xMCkgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgIC8q
IG5vdCBhIGJhbmQsIGxlYXZlIGl0IGFsb25lICovCiAgICB2YXIgb3V0ZXI9cC5zbGljZSgwLGZhcisxKSwgaW5uZXI9cC5zbGljZShmYXIrMSk7CiAgICBp
Zihpbm5lci5sZW5ndGg8NikgcmV0dXJuOwoKICAgIC8qIG91dHdhcmQgZGlyZWN0aW9uIGFuZCBsb2NhbCBiYW5kIHdpZHRoLCB0YWtlbiBmcm9tIHRoZSBu
ZWFyZXN0IHBvaW50IG9uIHRoZSB0cmFjay1zaWRlIGVkZ2UgKi8KICAgIHZhciBkaXI9W10sd2lkPVtdOwogICAgb3V0ZXIuZm9yRWFjaChmdW5jdGlvbihh
KXsKICAgICAgdmFyIHE9aW5uZXJbMF0sYmQ9SW5maW5pdHk7CiAgICAgIGlubmVyLmZvckVhY2goZnVuY3Rpb24oYyl7IHZhciBkPWQyKGMsYSk7IGlmKGQ8
YmQpeyBiZD1kOyBxPWM7IH0gfSk7CiAgICAgIHZhciBkeD1hLngtcS54LCBkeT1hLnktcS55LCBtPU1hdGguc3FydChkeCpkeCtkeSpkeSl8fDE7CiAgICAg
IGRpci5wdXNoKHt4OmR4L20seTpkeS9tfSk7IHdpZC5wdXNoKG0pOwogICAgfSk7CiAgICAvKiB0aGUgdHdvIGVuZCBjYXBzIGZsaXAgdGhhdCBkaXJlY3Rp
b24gYW5kIHNwaWtlIHRoZSBvZmZzZXQsIHNvIHNtb290aCBpdCBhbG9uZyB0aGUgcnVuICovCiAgICB2YXIgc209W107CiAgICBmb3IoaT0wO2k8ZGlyLmxl
bmd0aDtpKyspewogICAgICB2YXIgc3g9MCxzeT0wOwogICAgICBmb3Ioaj1NYXRoLm1heCgwLGktNCk7ajw9TWF0aC5taW4oZGlyLmxlbmd0aC0xLGkrNCk7
aisrKXsgc3grPWRpcltqXS54OyBzeSs9ZGlyW2pdLnk7IH0KICAgICAgdmFyIG0yPU1hdGguc3FydChzeCpzeCtzeSpzeSl8fDE7CiAgICAgIHNtLnB1c2go
e3g6c3gvbTIseTpzeS9tMn0pOwogICAgfQogICAgdmFyIG1lZD13aWQuc2xpY2UoKS5zb3J0KGZ1bmN0aW9uKGEsYil7IHJldHVybiBhLWI7IH0pW01hdGgu
Zmxvb3Iod2lkLmxlbmd0aC8yKV07CiAgICB2YXIgcHVzaD1tZWQqKGYtMSksIG49b3V0ZXIubGVuZ3RoOwogICAgdmFyIG1vdmVkPW91dGVyLm1hcChmdW5j
dGlvbihhLGkpewogICAgICAvKiB0YXBlciB0byBub3RoaW5nIGF0IGJvdGggZW5kcyBzbyB0aGUgYXJlYSBjbG9zZXMgYmFjayBvbnRvIHRoZSBiYW5kICov
CiAgICAgIHZhciBnPU1hdGgubWluKDEsTWF0aC5tYXgoMCxNYXRoLm1pbihpLG4tMS1pKS8obiowLjE4KSkpOwogICAgICBnPWcqZyooMy0yKmcpOwogICAg
ICByZXR1cm4ge3g6YS54K3NtW2ldLngqcHVzaCpnLCB5OmEueStzbVtpXS55KnB1c2gqZ307CiAgICB9KTsKICAgIGVsLnNldEF0dHJpYnV0ZSgiZCIsIk0g
Iittb3ZlZC5tYXAoeHkpLmpvaW4oIiBMICIpKyIgTCAiK2lubmVyLm1hcCh4eSkuam9pbigiIEwgIikrIiBaIik7CiAgfQoKICBmdW5jdGlvbiBsYWJlbChz
dmcsdGV4dCx4LHksc2l6ZSl7CiAgICB2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoTlMsInRleHQiKTsKICAgIHQuc2V0QXR0cmlidXRlKCJkYXRh
LWVzLWxhYmVsIiwiMSIpOwogICAgdC5zZXRBdHRyaWJ1dGUoIngiLHgpOyB0LnNldEF0dHJpYnV0ZSgieSIseSk7CiAgICB0LnNldEF0dHJpYnV0ZSgidGV4
dC1hbmNob3IiLCJtaWRkbGUiKTsKICAgIHQuc2V0QXR0cmlidXRlKCJwb2ludGVyLWV2ZW50cyIsIm5vbmUiKTsKICAgIC8qIEltcGFjdCBpbiBvcmFuZ2Us
IG5vIG91dGxpbmU6IHRoZSBzYW1lIGZhY2UgdGhlIGNhcmQgaGVhZGluZ3MgdXNlICovCiAgICB0LnN0eWxlLmZpbGw9IiNGRjQ3MTMiOyB0LnN0eWxlLnN0
cm9rZT0ibm9uZSI7CiAgICB0LnN0eWxlLmZvbnRGYW1pbHk9IkltcGFjdCwnQW50b24nLCdBcmlhbCBOYXJyb3cnLHNhbnMtc2VyaWYiOyB0LnN0eWxlLmZv
bnRXZWlnaHQ9IjQwMCI7CiAgICB0LnN0eWxlLmZvbnRTaXplPXNpemUrInB4IjsgdC5zdHlsZS5sZXR0ZXJTcGFjaW5nPShzaXplKjAuMDMpKyJweCI7CiAg
ICAvKiB0d28gbGluZXMsIHNvIGEgZnVsbCBzdGFuZCBuYW1lIHNpdHMgYmVzaWRlIGl0cyBoYXRjaCBpbnN0ZWFkIG9mIGFjcm9zcyB0aGUgY2lyY3VpdCAq
LwogICAgdmFyIHc9dGV4dC5zcGxpdCgiICIpLCBsaW5lcz1bdGV4dF07CiAgICBpZih0ZXh0Lmxlbmd0aD4xMCYmdy5sZW5ndGg+MSl7CiAgICAgIHZhciBj
dXQ9MTsKICAgICAgaWYody5sZW5ndGg+MikgY3V0PSh3WzBdKyIgIit3WzFdKS5sZW5ndGg8PTEwPzI6MTsKICAgICAgbGluZXM9W3cuc2xpY2UoMCxjdXQp
LmpvaW4oIiAiKSwgdy5zbGljZShjdXQpLmpvaW4oIiAiKV07CiAgICB9CiAgICBsaW5lcy5mb3JFYWNoKGZ1bmN0aW9uKGxpbmUsaSl7CiAgICAgIHZhciBz
PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhOUywidHNwYW4iKTsKICAgICAgcy5zZXRBdHRyaWJ1dGUoIngiLHgpOwogICAgICBzLnNldEF0dHJpYnV0ZSgi
eSIseSsoaS0obGluZXMubGVuZ3RoLTEpLzIpKnNpemUqMS4wOCk7CiAgICAgIHMuc2V0QXR0cmlidXRlKCJkb21pbmFudC1iYXNlbGluZSIsIm1pZGRsZSIp
OwogICAgICBzLnRleHRDb250ZW50PWxpbmU7CiAgICAgIHQuYXBwZW5kQ2hpbGQocyk7CiAgICB9KTsKICAgIHN2Zy5hcHBlbmRDaGlsZCh0KTsKICAgIHJl
dHVybiB0OwogIH0KCiAgZnVuY3Rpb24gZWwodGFnLGF0dHJzKXsKICAgIHZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhOUyx0YWcpOwogICAgT2Jq
ZWN0LmtleXMoYXR0cnMpLmZvckVhY2goZnVuY3Rpb24oayl7IGUuc2V0QXR0cmlidXRlKGssYXR0cnNba10pOyB9KTsKICAgIGUuc2V0QXR0cmlidXRlKCJk
YXRhLWVzLXJpbmciLCIxIik7CiAgICByZXR1cm4gZTsKICB9CiAgLyogVGhlIGdyb3VuZHMgb3V0bGluZSwgY29udHJhY3RlZCBieSBSSU5HX1cgYW5kIHRo
ZSBkaWZmZXJlbmNlIHJlY29sb3VyZWQuIERvbmUgd2l0aCBjbGlwcGVkCiAgICAgc3Ryb2tlcyByYXRoZXIgdGhhbiBhbiBvZmZzZXQgcGF0aDogYSBzdHJv
a2Ugc2l0cyBoYWxmIGluc2lkZSB0aGUgZWRnZSwgYW5kIGNsaXBwaW5nIHRvIHRoZQogICAgIG91dGxpbmUga2VlcHMgb25seSB0aGF0IGlubmVyIGhhbGYs
IHdoaWNoIGlzIGV4YWN0bHkgdGhlIGJhbmQgYmV0d2VlbiB0aGUgb3V0bGluZSBhbmQgaXRzCiAgICAgY29udHJhY3Rpb24uIExpZ2h0IGF0IGJvdGggZWRn
ZXMgb2YgdGhlIGJhbmQgc28gaXQgcmVhZHMgYXMgYSByb2FkLiAqLwogIGZ1bmN0aW9uIHJpbmcoc3ZnKXsKICAgIHZhciBiYXNlPXN2Zy5xdWVyeVNlbGVj
dG9yKCIudHJhY2stZHJpdmUiKTsgaWYoIWJhc2UpIHJldHVybjsKICAgIHZhciBkPWJhc2UuZ2V0QXR0cmlidXRlKCJkIik7IGlmKCFkKSByZXR1cm47CiAg
ICBbXS5zbGljZS5jYWxsKHN2Zy5xdWVyeVNlbGVjdG9yQWxsKCJbZGF0YS1lcy1yaW5nXSIpKS5mb3JFYWNoKGZ1bmN0aW9uKGUpeyBlLnJlbW92ZSgpOyB9
KTsKICAgIHZhciBkZWZzPXN2Zy5xdWVyeVNlbGVjdG9yKCJkZWZzIik7CiAgICBpZighZGVmcyl7IGRlZnM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKE5T
LCJkZWZzIik7IHN2Zy5pbnNlcnRCZWZvcmUoZGVmcyxzdmcuZmlyc3RDaGlsZCk7IH0KICAgIHZhciBjcD1lbCgiY2xpcFBhdGgiLHtpZDoiZXNSaW5nQ2xp
cCJ9KTsgY3AuYXBwZW5kQ2hpbGQoZWwoInBhdGgiLHtkOmR9KSk7IGRlZnMuYXBwZW5kQ2hpbGQoY3ApOwogICAgdmFyIGc9ZWwoImciLHt9KTsKICAgIGcu
YXBwZW5kQ2hpbGQoZWwoInBhdGgiLHtkOmQsZmlsbDpSSU5HX0l9KSk7CiAgICB2YXIgYz1lbCgiZyIseyJjbGlwLXBhdGgiOiJ1cmwoI2VzUmluZ0NsaXAp
In0pOwogICAgYy5hcHBlbmRDaGlsZChlbCgicGF0aCIse2Q6ZCxmaWxsOiJub25lIixzdHJva2U6UklOR19MLCJzdHJva2Utd2lkdGgiOjIqUklOR19XLCJz
dHJva2UtbGluZWpvaW4iOiJyb3VuZCJ9KSk7CiAgICBjLmFwcGVuZENoaWxkKGVsKCJwYXRoIix7ZDpkLGZpbGw6Im5vbmUiLHN0cm9rZTpSSU5HX1QsInN0
cm9rZS13aWR0aCI6MipSSU5HX1ctMywic3Ryb2tlLWxpbmVqb2luIjoicm91bmQifSkpOwogICAgYy5hcHBlbmRDaGlsZChlbCgicGF0aCIse2Q6ZCxmaWxs
OiJub25lIixzdHJva2U6UklOR19MLCJzdHJva2Utd2lkdGgiOjMsInN0cm9rZS1saW5lam9pbiI6InJvdW5kIn0pKTsKICAgIGcuYXBwZW5kQ2hpbGQoYyk7
CgogICAgLyogc21hbGwgZ29sZCBwb2ludGVycyBhbG9uZyB0aGUgbWlkZGxlIG9mIHRoZSBiYW5kLiBUaGUgb3V0bGluZSBpcyB0cmFjZWQgaW4gdGhlIGRy
aXZpbmcKICAgICAgIGRpcmVjdGlvbiAoZG93biB0aGUgcGl0IHN0cmFpZ2h0IHRoZSB3YXkgdGhlIHZlbnVlJ3Mgb3duIGFycm93IHBvaW50cykgd2l0aCB0
aGUgZ3JvdW5kcyBvbgogICAgICAgaXRzIGxlZnQsIHNvIHRoZSB0YW5nZW50IGlzIHRoZSBkaXJlY3Rpb24gYW5kIHRoZSBsZWZ0IG5vcm1hbCBwb2ludHMg
aW50byB0aGUgYmFuZC4gVGhlCiAgICAgICBjb3B5IGluIHRoZSBjbGlwUGF0aCBpcyBtZWFzdXJlZCByYXRoZXIgdGhhbiB0aGUgaGlkZGVuIG9yaWdpbmFs
LiAqLwogICAgdmFyIGdlbz1jcC5maXJzdENoaWxkLCBMPWdlby5nZXRUb3RhbExlbmd0aCgpOwogICAgaWYoTCl7CiAgICAgIHZhciBuPTE0LCBzdGVwPUwv
biwgb2ZmPVJJTkdfVy8yLCBwdD1zdmcuY3JlYXRlU1ZHUG9pbnQoKSwgaW5zaWRlPTAsIGNhbmQ9W107CiAgICAgIGZvcih2YXIgaT0wO2k8bjtpKyspewog
ICAgICAgIHZhciBhdD1pKnN0ZXArc3RlcC8yLCBwPWdlby5nZXRQb2ludEF0TGVuZ3RoKGF0KSwgcT1nZW8uZ2V0UG9pbnRBdExlbmd0aCgoYXQrMyklTCk7
CiAgICAgICAgdmFyIGR4PXEueC1wLngsIGR5PXEueS1wLnksIG09TWF0aC5zcXJ0KGR4KmR4K2R5KmR5KXx8MTsgZHgvPW07IGR5Lz1tOwogICAgICAgIHZh
ciBjeD1wLngrZHkqb2ZmLCBjeT1wLnktZHgqb2ZmOwogICAgICAgIHB0Lng9Y3g7IHB0Lnk9Y3k7IGlmKGdlby5pc1BvaW50SW5GaWxsKHB0KSkgaW5zaWRl
Kys7CiAgICAgICAgY2FuZC5wdXNoKHt4OmN4LHk6Y3ksYTpNYXRoLmF0YW4yKGR5LGR4KSoxODAvTWF0aC5QSSxweDpwLngscHk6cC55LGR4OmR4LGR5OmR5
fSk7CiAgICAgIH0KICAgICAgdmFyIGZsaXA9aW5zaWRlPG4vMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZSBvdXRsaW5lIHJhbiB0aGUg
b3RoZXIgd2F5IHJvdW5kICovCiAgICAgIHZhciBib3hlcz1bXS5zbGljZS5jYWxsKHN2Zy5xdWVyeVNlbGVjdG9yQWxsKCJbZGF0YS1lcy1sYWJlbF0iKSku
bWFwKGZ1bmN0aW9uKHQpeyByZXR1cm4gdC5nZXRCQm94KCk7IH0pOwogICAgICBjYW5kLmZvckVhY2goZnVuY3Rpb24oYzIpewogICAgICAgIHZhciBjeD1m
bGlwP2MyLnB4LWMyLmR5Km9mZjpjMi54LCBjeT1mbGlwP2MyLnB5K2MyLmR4Km9mZjpjMi55OwogICAgICAgIGlmKE1hdGguc3FydCgoY3gtMjYyKSooY3gt
MjYyKSsoY3ktMTQzKSooY3ktMTQzKSk8NjApIHJldHVybjsgICAvKiBsZWF2ZSB0aGUgZmxhZyBhbG9uZSAqLwogICAgICAgIGlmKGJveGVzLnNvbWUoZnVu
Y3Rpb24oYil7IHJldHVybiBjeD5iLngtOCYmY3g8Yi54K2Iud2lkdGgrOCYmY3k+Yi55LTgmJmN5PGIueStiLmhlaWdodCs4OyB9KSkgcmV0dXJuOwogICAg
ICAgIGcuYXBwZW5kQ2hpbGQoZWwoInBvbHlnb24iLHtwb2ludHM6IjUuNSwwIC00LDMuOCAtNCwtMy44IixmaWxsOiIjRjRCMjIzIiwKICAgICAgICAgIHRy
YW5zZm9ybToidHJhbnNsYXRlKCIrY3gudG9GaXhlZCgxKSsiICIrY3kudG9GaXhlZCgxKSsiKSByb3RhdGUoIitjMi5hLnRvRml4ZWQoMSkrIikifSkpOwog
ICAgICB9KTsKICAgIH0KICAgIGJhc2UucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxiYXNlLm5leHRTaWJsaW5nKTsKICB9CgogIHZhciBkcmF3bj1mYWxz
ZTsKICBmdW5jdGlvbiBwcnVuZSgpewogICAgdmFyIHdyYXA9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm1hcFdyYXAiKTsKICAgIHZhciBzdmc9d3JhcCYm
d3JhcC5xdWVyeVNlbGVjdG9yKCJzdmciKTsKICAgIHZhciB6b25lcz1zdmc/W10uc2xpY2UuY2FsbChzdmcucXVlcnlTZWxlY3RvckFsbCgiLmVzLXpvbmUi
KSk6W107CiAgICBpZighem9uZXMubGVuZ3RoKSByZXR1cm4gZmFsc2U7CiAgICB2YXIga2VlcD1bXSxkcm9wPVtdOwogICAgem9uZXMuZm9yRWFjaChmdW5j
dGlvbih6KXsgKHouZGF0YXNldC5lc0lkJiZCWVt6LmRhdGFzZXQuZXNJZF0/a2VlcDpkcm9wKS5wdXNoKHopOyB9KTsKICAgIGlmKCFrZWVwLmxlbmd0aCkg
cmV0dXJuIGZhbHNlOwoKICAgIC8qIHRoZSB2ZW51ZSBmaWxlIGRyYXdzIHRoZSBIaWxsIGFzIGFuIG91dGxpbmUgYW5kIHRoZSByZXN0IGhhdGNoZWQ7IExv
dWlzIHdhbnRzIHRoZW0gYWxpa2UgKi8KICAgIGtlZXAuZm9yRWFjaChmdW5jdGlvbih6KXsgei5jbGFzc0xpc3QucmVtb3ZlKCJlcy1vdXRsaW5lIik7IH0p
OwoKICAgIGtlZXAuZm9yRWFjaChmdW5jdGlvbih6KXsKICAgICAgaWYoei5kYXRhc2V0LmVzSWQ9PT1ISUxMJiYhei5oYXNBdHRyaWJ1dGUoImRhdGEtZXMt
d2lkZSIpKXsKICAgICAgICB3aWRlbih6LDMuNSk7IHouc2V0QXR0cmlidXRlKCJkYXRhLWVzLXdpZGUiLCIxIik7CiAgICAgIH0KICAgIH0pOwoKICAgIC8q
IG9uZSBib3ggcGVyIHpvbmUuIFRoZSB2ZW51ZSBmaWxlIGdpdmVzIHRoZSBNYWluIEdyYW5kc3RhbmQgYSBzdHJheSAyMXgyMSBkb3Qgb24gdGhlIGZhcgog
ICAgICAgc2lkZSBvZiB0aGUgY2lyY3VpdCwgd2hpY2ggc2hhcmVkIHRoZSB6b25lIGlkIGFuZCBzbyBsaXQgdXAgd2hlbiB0aGUgc3RhbmQgd2FzIHNlbGVj
dGVkLAogICAgICAgYW5kIHRoZSBTdW5zZXQgTG91bmdlIGEgc2Vjb25kIHF1YWQgYXdheSBmcm9tIHRoZSBsb3VuZ2UgaXRzZWxmLiBMb3VpcyB3YW50cyBl
YWNoIHN0YW5kCiAgICAgICByZWFkaW5nIGFzIGEgc2luZ2xlIGJveCwgc28gb25seSB0aGUgbGFyZ2VzdCBzaGFwZSBvZiBlYWNoIHpvbmUgaXMga2VwdC4g
Ki8KICAgIHZhciBiaWc9e307CiAgICBrZWVwLmZvckVhY2goZnVuY3Rpb24oeil7CiAgICAgIHZhciBiPWJveCh6KTsgaWYoIWIpIHJldHVybjsKICAgICAg
dmFyIGE9Yi53aWR0aCpiLmhlaWdodCwgaWQ9ei5kYXRhc2V0LmVzSWQ7CiAgICAgIGlmKCEoaWQgaW4gYmlnKXx8YT5iaWdbaWRdKSBiaWdbaWRdPWE7CiAg
ICB9KTsKICAgIHZhciBsaXZlPVtdLGJlc3Q9e307CiAgICBrZWVwLmZvckVhY2goZnVuY3Rpb24oeil7CiAgICAgIHZhciBiPWJveCh6KSwgaWQ9ei5kYXRh
c2V0LmVzSWQ7CiAgICAgIGlmKCFifHxiZXN0W2lkXXx8Yi53aWR0aCpiLmhlaWdodDxiaWdbaWRdKXsgaGlkZSh6KTsgcmV0dXJuOyB9CiAgICAgIGJlc3Rb
aWRdPTE7IGxpdmUucHVzaCh6KTsKICAgIH0pOwoKICAgIC8qIGxhYmVsIGFuY2hvcjogdGhlIGNlbnRyZSBvZiBlYWNoIHpvbmUncyBsYXJnZXN0IHNoYXBl
LiBOb3QgdGhlIHVuaW9uIG9mIGl0cyBzaGFwZXMsIHdoaWNoCiAgICAgICBmb3IgYSB6b25lIGRyYXduIGFzIHR3byBibG9ja3MgbGFuZHMgb24gdGhlIGVt
cHR5IHRyYWNrIGJldHdlZW4gdGhlbS4gKi8KICAgIHZhciBzcGFucz17fTsKICAgIGxpdmUuZm9yRWFjaChmdW5jdGlvbih6KXsKICAgICAgdmFyIGI9Ym94
KHopOyBpZighYikgcmV0dXJuOwogICAgICB2YXIgaWQ9ei5kYXRhc2V0LmVzSWQsIGE9Yi53aWR0aCpiLmhlaWdodCwgcz1zcGFuc1tpZF07CiAgICAgIGlm
KCFzfHxhPnMuYXJlYSkgc3BhbnNbaWRdPXt4OmIueCtiLndpZHRoLzIseTpiLnkrYi5oZWlnaHQvMixhcmVhOmF9OwogICAgfSk7CgogICAgZHJvcC5mb3JF
YWNoKGhpZGUpOwoKICAgIC8qIHRoZSB2ZW51ZSdzIG93biBsYWJlbHMgbmFtZSB6b25lcyB3ZSBubyBsb25nZXIgc2hvdyBhbmQgc2l0IG91dHNpZGUgdGhl
IHpvbmUgcGF0aHMsIHNvIHRoZXkKICAgICAgIGNhbm5vdCBiZSBtYXRjaGVkIGJhY2sgcmVsaWFibHkuIEhpZGUgdGhlbSBhbGwgYW5kIGRyYXcgb3VyIG93
bi4gKi8KICAgIFtdLnNsaWNlLmNhbGwoc3ZnLnF1ZXJ5U2VsZWN0b3JBbGwoInRleHQiKSkuZm9yRWFjaChmdW5jdGlvbih0KXsKICAgICAgaWYoIXQuZ2V0
QXR0cmlidXRlKCJkYXRhLWVzLWxhYmVsIikpIHQuc3R5bGUuZGlzcGxheT0ibm9uZSI7CiAgICB9KTsKICAgIGRyYXdMYWJlbHMoc3ZnLHNwYW5zKTsKICAg
IHJpbmcoc3ZnKTsKCiAgICAvKiBwcmlvcml0eS16b25lIHF1aWNrIGxpbmtzOiBrZWVwIG9ubHkgem9uZXMgc3RpbGwgb24gdGhlIG1hcCAqLwogICAgdmFy
IGxpbmtzPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ6cFF1aWNrTGlua3MiKTsKICAgIGlmKGxpbmtzKXsKICAgICAgdmFyIG5hbWVzPXt9OyBPYmplY3Qu
a2V5cyhzcGFucykuZm9yRWFjaChmdW5jdGlvbihpZCl7IG5hbWVzW0JZW2lkXVsxXS50b0xvd2VyQ2FzZSgpXT0xOyB9KTsKICAgICAgW10uc2xpY2UuY2Fs
bChsaW5rcy5xdWVyeVNlbGVjdG9yQWxsKCJidXR0b24iKSkuZm9yRWFjaChmdW5jdGlvbihiKXsKICAgICAgICBpZighbmFtZXNbKGIudGV4dENvbnRlbnR8
fCIiKS50cmltKCkudG9Mb3dlckNhc2UoKV0pIGIuc3R5bGUuZGlzcGxheT0ibm9uZSI7CiAgICAgIH0pOwogICAgfQogICAgZHJhd249dHJ1ZTsKICAgIGxh
c3RTcGFucz1zcGFuczsKICAgIHJldHVybiB0cnVlOwogIH0KCiAgdmFyIGxhc3RTcGFucz1udWxsOwogIGZ1bmN0aW9uIGRyYXdMYWJlbHMoc3ZnLHNwYW5z
KXsKICAgIFtdLnNsaWNlLmNhbGwoc3ZnLnF1ZXJ5U2VsZWN0b3JBbGwoIltkYXRhLWVzLWxhYmVsXSIpKS5mb3JFYWNoKGZ1bmN0aW9uKHQpeyB0LnJlbW92
ZSgpOyB9KTsKICAgIC8qIHNpemVkIGZyb20gdGhlIGxpdmUgc2NhbGU6IHRoZSB2aWV3Qm94IGlzIGFib3V0IDE1MDkgdW5pdHMgd2lkZSBhbmQgcmVuZGVy
cyBuZWFyIDg2MHB4LCBzbwogICAgICAgYSBDU1MtcGl4ZWwgZm9udC1zaXplIGhlcmUgd291bGQgZHJhdyBhdCByb3VnaGx5IGhhbGYgb2Ygd2hhdCBpdCBz
YXlzICovCiAgICB2YXIgdmI9c3ZnLnZpZXdCb3gmJnN2Zy52aWV3Qm94LmJhc2VWYWwsIHI9c3ZnLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgdmFy
IGs9KHZiJiZ2Yi53aWR0aCYmci53aWR0aCk/ci53aWR0aC92Yi53aWR0aDoxOwogICAgaWYoIWt8fCFpc0Zpbml0ZShrKSkgaz0xOwogICAgdmFyIHNpemU9
TWF0aC5taW4oMTgvayw0OCk7CiAgICBPYmplY3Qua2V5cyhzcGFucykuZm9yRWFjaChmdW5jdGlvbihpZCl7CiAgICAgIHZhciBzPXNwYW5zW2lkXSwgej1C
WVtpZF07CiAgICAgIGxhYmVsKHN2Zyx6WzJdLHMueCt6WzRdLHMueSt6WzVdLHNpemUpOwogICAgfSk7CiAgfQoKICBpZighcHJ1bmUoKSl7CiAgICB2YXIg
dHJpZXM9MCwgaXY9c2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXsgaWYocHJ1bmUoKXx8Kyt0cmllcz40MCkgY2xlYXJJbnRlcnZhbChpdik7IH0sNDAwKTsKICB9
CiAgdmFyIHJ0PW51bGw7CiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsZnVuY3Rpb24oKXsKICAgIGlmKCFkcmF3bnx8IWxhc3RTcGFucykg
cmV0dXJuOwogICAgY2xlYXJUaW1lb3V0KHJ0KTsKICAgIHJ0PXNldFRpbWVvdXQoZnVuY3Rpb24oKXsKICAgICAgdmFyIHN2Zz1kb2N1bWVudC5xdWVyeVNl
bGVjdG9yKCIjbWFwV3JhcCBzdmciKTsKICAgICAgaWYoc3ZnKSBkcmF3TGFiZWxzKHN2ZyxsYXN0U3BhbnMpOwogICAgfSwyMDApOwogIH0pOwovKiAtLS0t
LS0tLS0tIDMuIHRocmVlIHN1aXRlcyBvbiB0aGUgbWFwIChDTC0yMDI2MTAwNi0wNSwgdjIgQ0wtMjAyNjEwMDYtMDksIHYzIENMLTIwMjYxMDA2LTEwKSAt
LS0tLS0tLS0tICovCiAgLyogVGhlIE1haW4gR3JhbmRzdGFuZCBiYW5kIGluIHRoZSB2ZW51ZSBmaWxlIHJ1bnMgZnJvbSBpdHMgdG9wIGVkZ2UgKDI4OSw3
NCktKDI2Niw4MykgdG8gdGhlIGJvdHRvbS1sZWZ0IGNvcm5lcgogICAgICgzNzYsMzEwKTsgaXRzIGNlbnRyZWxpbmUsIG1lYXN1cmVkIG9uIDYgT2N0IDIw
MjYsIGdvZXMgZnJvbSAoMjc3LDc3LjUpIHRvICgzODcsMzA0LjUpLCAyNSB1bml0cyB3aWRlLCBhdCA2NAogICAgIGRlZ3JlZXMuIFR3byBzb2xpZCBvcmFu
Z2UgYm94ZXMgc2l0IG9uIHRoYXQgbGluZSBhdCAyNy41JSBhbmQgNjklIG9mIGl0cyBsZW5ndGgsIHRoZSBwb3NpdGlvbnMgTG91aXMgbWFya2VkLiBUaGUK
ICAgICBTaGFtcyBTdWl0ZSBib3ggc2l0cyBhYm92ZSB0aGUgYmFjayBzdHJhaWdodCwgd2hpY2ggcnVucyBhbG9uZyB5ID0gLTYwLCB0byB0aGUgbGVmdCBv
ZiB0aGUgU3Vuc2V0IExvdW5nZS4gKi8KICB2YXIgU1VJVEVfTElORT17eDA6Mjc3LHkwOjc3LjUseDE6Mzg3LHkxOjMwNC41LGFuZ2xlOjYzLjl9OwogIHZh
ciBTVUlURVM9WwogICAge2lkOiJlcy1zdWl0ZS1tMTciLG5hbWU6Ik0xNyBQb2RpdW0gU3VpdGUiLGxhYmVsVGV4dDoiTTE3IFBPRElVTSIsY29kZToiU1RF
LTAxIix0OjAuMjc1LHNvbGlkOnRydWUsCiAgICAgY2F0OiJNMTcgUG9kaXVtIFN1aXRlIixkZXNjOiJBIGdsYXNzLWZyb250ZWQgc3VpdGUgaW4gdGhlIE1h
aW4gR3JhbmRzdGFuZCBidWlsZGluZyBvdmVyIHRoZSBzdGFydC1maW5pc2ggbGluZSwgd2l0aCB0aGUgcGl0IGxhbmUgb3Bwb3NpdGUgYW5kIHRoZSBwb2Rp
dW0gY2VyZW1vbnkgaW4gZnJvbnQgb2YgeW91LiIsCiAgICAgc3VtOiJIb3N0ZWQgZGluaW5nIGluc2lkZSwgcmVzZXJ2ZWQgc2VhdHMgb3V0c2lkZSwgdGhl
IGdyaWQsIHRoZSBwaXQgc3RvcHMgYW5kIHRoZSBwb2RpdW0gZnJvbSBvbmUgc3BvdC4iLAogICAgIGluYzpbIkZvdXItZGF5IGFjY2VzcywgVGh1cnNkYXkg
dG8gU3VuZGF5IiwiSG9zdGVkIGRpbmluZyBhbmQgYmV2ZXJhZ2VzIGluIHRoZSBzdWl0ZSIsIlJlc2VydmVkIHNlYXRpbmcgb3ZlciB0aGUgc3RhcnQtZmlu
aXNoIGxpbmUiLCJHZW5lcmFsIGFkbWlzc2lvbiB0byB0aGUgQWZ0ZXItUmFjZSBDb25jZXJ0cyIsIk9uZSBkYXkgYXQgdGVhbUxhYiBQaGVub21lbmEgb3Ig
YSBZYXMgSXNsYW5kIHRoZW1lIHBhcmsiLCJGMSBGYW56b25lIGFuZCBhbGwgT2FzaXMgYXJlYXMiXSwKICAgICBpZGVhbDpbIlBvZGl1bSB2aWV3cyIsIkNs
aWVudCBob3N0aW5nIiwiUmFjZS1sb25nIGNvbWZvcnQiXSxub3RlOiJGdWxsIGluY2x1c2lvbnMgYW5kIHByaWNpbmcgY29uZmlybWVkIG9uIGVucXVpcnku
IiwKICAgICBzaG90czpbe3NyYzoiaHR0cHM6Ly93d3cuZXMtc3BvcnQuYWUvd3AtY29udGVudC91cGxvYWRzLzIwMjYvMDYvQURHUF9XZWJfTWFpbl9HcmFu
ZHN0YW5kXzE5MjB4Njk0cHhfVjIuanBnIixjYXA6IlRoZSBwaXQgc3RyYWlnaHQsIHBpdCBidWlsZGluZyBhbmQgcG9kaXVtIGZyb20gdGhlIE1haW4gR3Jh
bmRzdGFuZCJ9LHtzcmM6Imh0dHBzOi8vd3d3LmVzLXNwb3J0LmFlL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzA2LzE4MDQyMTU2NDkuanBnIixjYXA6IlRo
ZSBwb2RpdW0gY2VyZW1vbnkgYWNyb3NzIHRoZSBzdGFydC1maW5pc2ggc3RyYWlnaHQifSx7c3JjOiJodHRwczovL3d3dy5lcy1zcG9ydC5hZS93cC1jb250
ZW50L3VwbG9hZHMvMjAyNi8wNy8zMTI5OS1tYWluX2dyYW5kc3RhbmRfeWFzX21hcmluYS03ZmZlYmZjMjBhOTU1ODRhOWRkZWI4ODExOWJkNDhiZi0xLmpw
ZyIsY2FwOiJUaGUgcmFjZSBzdGFydCBmcm9tIHRoZSBNYWluIEdyYW5kc3RhbmQifV0sdXJsOiJodHRwczovL3d3dy5lcy1zcG9ydC5hZS9mMS1tMTctcG9k
aXVtLXN1aXRlLTlmNGMyLyIsbGFiZWxEeDotNDAsbGFiZWxEeTotMzYsbGFiZWxBbmNob3I6ImVuZCJ9LAogICAge2lkOiJlcy1zdWl0ZS1waXRsYW5lIixu
YW1lOiJQaXRsYW5lIFZpZXdzIFN1aXRlIixsYWJlbFRleHQ6IlBJVExBTkV8VklFV1MiLGNvZGU6IlNURS0wMiIsdDowLjY5LHNvbGlkOnRydWUsCiAgICAg
Y2F0OiJQaXRsYW5lIFZpZXdzIE0yMCBTdWl0ZSIsZGVzYzoiQW4gZWxlZ2FudCBpbmRvb3IgbG91bmdlIHdpdGggZ291cm1ldCBkaW5pbmcgYW5kIHByZW1p
dW0gYmV2ZXJhZ2VzLCBhbmQgYSBiYWxjb255IG92ZXIgdGhlIGdyaWQgZm9yIHJhY2UgbGF1bmNoZXMgYW5kIHBpdCBzdG9wcy4iLAogICAgIHN1bToiQSBy
ZWZpbmVkIHZhbnRhZ2UgcG9pbnQgb3ZlciB0aGUgc3RhcnRpbmcgZ3JpZCwgd2hlcmUgYW50aWNpcGF0aW9uIGJ1aWxkcyBhbmQgd2lubmVycyBhcmUgZGVj
aWRlZC4iLAogICAgIGluYzpbIkZvdXItZGF5IGFjY2VzcywgVGh1cnNkYXkgdG8gU3VuZGF5IiwiSW5kb29yIGxvdW5nZSB3aXRoIGdvdXJtZXQgZGluaW5n
IGFuZCBwcmVtaXVtIGJldmVyYWdlcyIsIkJhbGNvbnkgb3Zlcmxvb2tpbmcgdGhlIHBpdCBsYW5lIGdhcmFnZXMiLCJHZW5lcmFsIGFkbWlzc2lvbiB0byB0
aGUgQWZ0ZXItUmFjZSBDb25jZXJ0cyIsIk9uZSBkYXkgYXQgdGVhbUxhYiBQaGVub21lbmEgb3IgYSBZYXMgSXNsYW5kIHRoZW1lIHBhcmsiLCJFbnRyeSB0
byB0aGUgTG91dnJlIEFidSBEaGFiaSwgUWFzciBBbCBXYXRhbiwgWmF5ZWQgTmF0aW9uYWwgTXVzZXVtIGFuZCB0aGUgTmF0dXJhbCBIaXN0b3J5IE11c2V1
bSIsIkYxIEZhbnpvbmUgYW5kIGFsbCBPYXNpcyBhcmVhcyJdLAogICAgIGlkZWFsOlsiR3JpZCBhbmQgcGl0IGxhbmUiLCJDYWxtLCByZWZpbmVkIHNldHRp
bmciLCJDbGllbnQgaG9zdGluZyJdLG5vdGU6IlByaWNpbmcgYW5kIGF2YWlsYWJpbGl0eSBjb25maXJtZWQgb24gZW5xdWlyeS4iLAogICAgIHNob3RzOlt7
c3JjOiJodHRwczovL3d3dy5lcy1zcG9ydC5hZS93cC1jb250ZW50L3VwbG9hZHMvMjAyNi8wNi8xODA0MjE1NjQ5LmpwZyIsY2FwOiJQaXRsYW5lIFZpZXdz
IFN1aXRlIn1dLAogICAgIHVybDoiaHR0cHM6Ly93d3cuZXMtc3BvcnQuYWUvZjEtcGl0bGFuZS12aWV3cy1zdWl0ZS05ZjRjMi8iLGxhYmVsRHg6LTYwLGxh
YmVsRHk6MTAwLGxhYmVsQW5jaG9yOiJtaWRkbGUifSwKICAgIHtpZDoiZXMtc3VpdGUtc2hhbXMiLG5hbWU6IlNoYW1zIFN1aXRlIixsYWJlbFRleHQ6IlNI
QU1TfFNVSVRFIixjb2RlOiJTVEUtMDMiLHg6Nzk0LHk6LTkyLHc6NDQsaDoyMixzb2xpZDpmYWxzZSwKICAgICBjYXQ6IlNoYW1zIFN1aXRlIixkZXNjOiJN
aWRkbGUgRWFzdGVybiBhbmQgTm9ydGggQWZyaWNhbiBmbGF2b3VycyBieSBOaW5pdmUgaW4gYSBwbHVzaCwgYWlyLWNvbmRpdGlvbmVkIGxvdW5nZSwgd2l0
aCBhIGJhbGNvbnkgb3ZlciB0aGUgVHVybiA1IGhhaXJwaW4gYW5kIGdlbmVyYWwgYWRtaXNzaW9uIHRvIHRoZSBBZnRlci1SYWNlIENvbmNlcnRzLiIsCiAg
ICAgc3VtOiJOaW5pdmUncyBzaWduYXR1cmUgZGlzaGVzIGFuZCBjcmFmdGVkIGNvY2t0YWlscywgd2l0aCB0aGUgaGFpcnBpbiBiZWxvdyB0aGUgYmFsY29u
eS4iLAogICAgIGluYzpbIkZvdXItZGF5IGFjY2VzcywgVGh1cnNkYXkgdG8gU3VuZGF5IiwiTmluaXZlJ3MgTWlkZGxlIEVhc3Rlcm4gYW5kIE5vcnRoIEFm
cmljYW4gbWVudSB3aXRoIGNyYWZ0ZWQgY29ja3RhaWxzIiwiQWlyLWNvbmRpdGlvbmVkIGxvdW5nZSBhbmQgYmFsY29ueSBvdmVyIFR1cm4gNSIsIkxpdmUg
ZW50ZXJ0YWlubWVudCIsIkdlbmVyYWwgYWRtaXNzaW9uIHRvIHRoZSBBZnRlci1SYWNlIENvbmNlcnRzIiwiT25lIGRheSBhdCB0ZWFtTGFiIFBoZW5vbWVu
YSBvciBhIFlhcyBJc2xhbmQgdGhlbWUgcGFyayIsIkVudHJ5IHRvIHRoZSBMb3V2cmUgQWJ1IERoYWJpLCBRYXNyIEFsIFdhdGFuLCBaYXllZCBOYXRpb25h
bCBNdXNldW0gYW5kIHRoZSBOYXR1cmFsIEhpc3RvcnkgTXVzZXVtIiwiRjEgRmFuem9uZSBhbmQgYWxsIE9hc2lzIGFyZWFzIl0sCiAgICAgaWRlYWw6WyJG
b29kIGFuZCBhdG1vc3BoZXJlIiwiVGhlIGhhaXJwaW4iLCJHcm91cHMgYW5kIGNlbGVicmF0aW9ucyJdLG5vdGU6IlByaWNpbmcgYW5kIGF2YWlsYWJpbGl0
eSBjb25maXJtZWQgb24gZW5xdWlyeS4iLAogICAgIHNob3RzOlt7c3JjOiJodHRwczovL3d3dy5lcy1zcG9ydC5hZS93cC1jb250ZW50L3VwbG9hZHMvMjAy
Ni8wOS9zaGFtcy1pbmRvb3Itd2l0aC1jcm93ZC5wbmciLGNhcDoiSW5zaWRlIHRoZSBTaGFtcyBTdWl0ZSJ9XSwKICAgICB1cmw6Imh0dHBzOi8vd3d3LmVz
LXNwb3J0LmFlL2YxLXNoYW1zLXN1aXRlLTlmNGMyLyIsbGFiZWxEeDo0MCxsYWJlbER5Oi00MCxsYWJlbEFuY2hvcjoic3RhcnQifQogIF07CiAgdmFyIHN1
aXRlQWN0aXZlPW51bGw7CiAgZnVuY3Rpb24gc3VpdGVDZW50cmUocyl7CiAgICBpZihzLnQ9PW51bGwpIHJldHVybiB7eDpzLngseTpzLnl9OwogICAgcmV0
dXJuIHt4OlNVSVRFX0xJTkUueDArKFNVSVRFX0xJTkUueDEtU1VJVEVfTElORS54MCkqcy50LCB5OlNVSVRFX0xJTkUueTArKFNVSVRFX0xJTkUueTEtU1VJ
VEVfTElORS55MCkqcy50fTsKICB9CiAgZnVuY3Rpb24gc3VpdGVMYWJlbChzdmcsdGV4dCx4LHksYW5jaG9yLHNpemUpewogICAgdmFyIHQ9ZG9jdW1lbnQu
Y3JlYXRlRWxlbWVudE5TKE5TLCJ0ZXh0Iik7CiAgICB0LnNldEF0dHJpYnV0ZSgiZGF0YS1lcy1sYWJlbCIsIjEiKTsgdC5zZXRBdHRyaWJ1dGUoImRhdGEt
ZXMtc3VpdGUtbGFiZWwiLCIxIik7CiAgICB0LnNldEF0dHJpYnV0ZSgieCIseCk7IHQuc2V0QXR0cmlidXRlKCJ5Iix5KTsgdC5zZXRBdHRyaWJ1dGUoInRl
eHQtYW5jaG9yIixhbmNob3IpOyB0LnNldEF0dHJpYnV0ZSgicG9pbnRlci1ldmVudHMiLCJub25lIik7CiAgICB0LnN0eWxlLmZpbGw9IiNGRjQ3MTMiOyB0
LnN0eWxlLnN0cm9rZT0ibm9uZSI7IHQuc3R5bGUuZm9udEZhbWlseT0iSW1wYWN0LCdBbnRvbicsJ0FyaWFsIE5hcnJvdycsc2Fucy1zZXJpZiI7IHQuc3R5
bGUuZm9udFdlaWdodD0iNDAwIjsKICAgIHQuc3R5bGUuZm9udFNpemU9c2l6ZSsicHgiOyB0LnN0eWxlLmxldHRlclNwYWNpbmc9KHNpemUqMC4wMykrInB4
IjsKICAgIHZhciBsaW5lcz10ZXh0LnNwbGl0KCJ8Iik7CiAgICBsaW5lcy5mb3JFYWNoKGZ1bmN0aW9uKGxpbmUsaSl7CiAgICAgIHZhciBzcD1kb2N1bWVu
dC5jcmVhdGVFbGVtZW50TlMoTlMsInRzcGFuIik7IHNwLnNldEF0dHJpYnV0ZSgieCIseCk7CiAgICAgIHNwLnNldEF0dHJpYnV0ZSgieSIseSsoaS0obGlu
ZXMubGVuZ3RoLTEpLzIpKnNpemUqMS4wOCk7IHNwLnNldEF0dHJpYnV0ZSgiZG9taW5hbnQtYmFzZWxpbmUiLCJtaWRkbGUiKTsKICAgICAgc3AudGV4dENv
bnRlbnQ9bGluZTsgdC5hcHBlbmRDaGlsZChzcCk7CiAgICB9KTsKICAgIHN2Zy5hcHBlbmRDaGlsZCh0KTsgcmV0dXJuIHQ7CiAgfQogIGZ1bmN0aW9uIGNs
ZWFyU3VpdGVBY3RpdmUoKXsKICAgIHN1aXRlQWN0aXZlPW51bGw7CiAgICB2YXIgcGtnPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ6cFBrZyIpOwogICAg
aWYocGtnKXsgW10uc2xpY2UuY2FsbChwa2cucXVlcnlTZWxlY3RvckFsbCgiLnpwLXBrZy1oZWFkLC56cC1wcmljZSIpKS5mb3JFYWNoKGZ1bmN0aW9uKGUp
eyBlLmhpZGRlbj1mYWxzZTsgZS5zdHlsZS5kaXNwbGF5PSIiOyB9KTsgfQogICAgW10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIu
ZXMtem9uZVtkYXRhLWVzLXN1aXRlXS5lcy1hY3RpdmUiKSkuZm9yRWFjaChmdW5jdGlvbih6KXsgei5jbGFzc0xpc3QucmVtb3ZlKCJlcy1hY3RpdmUiKTsg
fSk7CiAgfQogIGZ1bmN0aW9uIG9wZW5TdWl0ZShzLHNoYXBlKXsKICAgIC8qIHRoZSBtYWluIHNjcmlwdCdzIHBhbmVsIHJvdXRpbmUgaXMgcHJpdmF0ZTsg
YSBxdWljay1saW5rIGJ1dHRvbiBydW5zIGl0IChhbmQgb3BlbnMgdGhlIG1vZGFsIG9uIHBob25lcyksCiAgICAgICB0aGVuIHRoZSBwYW5lbCBpcyByZXdy
aXR0ZW4gZm9yIHRoZSBzdWl0ZSAqLwogICAgdmFyIHFsPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiN6cFF1aWNrTGlua3MgYnV0dG9uIik7IGlmKHFsKSBx
bC5jbGljaygpOwogICAgW10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuZXMtem9uZS5lcy1hY3RpdmUiKSkuZm9yRWFjaChmdW5j
dGlvbih6KXsgei5jbGFzc0xpc3QucmVtb3ZlKCJlcy1hY3RpdmUiKTsgfSk7CiAgICB2YXIgbG9jaz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZXMtbG9j
ayIpOyBpZihsb2NrKSBsb2NrLnN0eWxlLmRpc3BsYXk9Im5vbmUiOwogICAgaWYoc2hhcGUpIHNoYXBlLmNsYXNzTGlzdC5hZGQoImVzLWFjdGl2ZSIpOwog
ICAgc3VpdGVBY3RpdmU9cy5pZDsKICAgIHZhciBnPWZ1bmN0aW9uKGlkKXsgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTsgfTsKICAgIGlm
KGcoInpwVGllciIpKSBnKCJ6cFRpZXIiKS50ZXh0Q29udGVudD0iU3VpdGUiOwogICAgaWYoZygienBDb2RlIikpIGcoInpwQ29kZSIpLnRleHRDb250ZW50
PXMuY29kZTsKICAgIGlmKGcoInpwRGVzYyIpKSBnKCJ6cERlc2MiKS50ZXh0Q29udGVudD1zLmRlc2M7CiAgICB2YXIgc2hvdHM9ZygienBTaG90cyIpLCBt
ZWRpYUJveD1nKCJ6cE1lZGlhIik7CiAgICBpZihzaG90cyl7CiAgICAgIHNob3RzLmlubmVySFRNTD0iIjsgc2hvdHMuc2Nyb2xsTGVmdD0wOwogICAgICBz
LnNob3RzLmZvckVhY2goZnVuY3Rpb24oc2gpewogICAgICAgIHZhciBkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOyBkLmNsYXNzTmFtZT0ienAt
c2hvdCI7CiAgICAgICAgdmFyIGltPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpOyBpbS5sb2FkaW5nPSJsYXp5IjsgaW0uZGVjb2Rpbmc9ImFzeW5j
IjsgaW0uYWx0PXMubmFtZSsoc2guY2FwPyIsICIrc2guY2FwOiIiKTsgaW0uc3JjPXNoLnNyYzsKICAgICAgICBpbS5hZGRFdmVudExpc3RlbmVyKCJlcnJv
ciIsZnVuY3Rpb24oKXsgZC5yZW1vdmUoKTsgaWYobWVkaWFCb3gmJiFzaG90cy5xdWVyeVNlbGVjdG9yKCIuenAtc2hvdCIpKSBtZWRpYUJveC5oaWRkZW49
dHJ1ZTsgfSk7CiAgICAgICAgZC5hcHBlbmRDaGlsZChpbSk7CiAgICAgICAgaWYoc2guY2FwKXsgdmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2
Iik7IGMuY2xhc3NOYW1lPSJjYXAiOyBjLnRleHRDb250ZW50PXNoLmNhcDsgZC5hcHBlbmRDaGlsZChjKTsgfQogICAgICAgIHNob3RzLmFwcGVuZENoaWxk
KGQpOwogICAgICB9KTsKICAgICAgaWYobWVkaWFCb3gpIG1lZGlhQm94LmhpZGRlbj1zLnNob3RzLmxlbmd0aD09PTA7CiAgICB9CiAgICAvKiB0aGUgcGFj
a2FnZSBibG9jayB3aXRob3V0IHN0b2NrIG9yIHByaWNlOiBzdW1tYXJ5LCBpbmNsdXNpb25zLCB3aG8gaXQgc3VpdHMsIGEgbm90ZSAqLwogICAgdmFyIHBr
Zz1nKCJ6cFBrZyIpOwogICAgaWYocGtnKXsKICAgICAgcGtnLmhpZGRlbj1mYWxzZTsKICAgICAgdmFyIGhlYWQ9cGtnLnF1ZXJ5U2VsZWN0b3IoIi56cC1w
a2ctaGVhZCIpOyBpZihoZWFkKXsgaGVhZC5oaWRkZW49dHJ1ZTsgaGVhZC5zdHlsZS5kaXNwbGF5PSJub25lIjsgfQogICAgICB2YXIgcHJpY2U9cGtnLnF1
ZXJ5U2VsZWN0b3IoIi56cC1wcmljZSIpOyBpZihwcmljZSl7IHByaWNlLmhpZGRlbj10cnVlOyBwcmljZS5zdHlsZS5kaXNwbGF5PSJub25lIjsgfQogICAg
ICBpZihnKCJ6cFN1bSIpKSBnKCJ6cFN1bSIpLnRleHRDb250ZW50PXMuc3VtfHwiIjsKICAgICAgaWYoZygienBUaXAiKSl7IGcoInpwVGlwIikudGV4dENv
bnRlbnQ9IiI7IGcoInpwVGlwIikuaGlkZGVuPXRydWU7IH0KICAgICAgdmFyIGluYz1nKCJ6cEluYyIpOyBpZihpbmMpeyBpbmMuaW5uZXJIVE1MPSIiOyAo
cy5pbmN8fFtdKS5mb3JFYWNoKGZ1bmN0aW9uKHgpeyB2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsgZC50ZXh0Q29udGVudD14OyBpbmMu
YXBwZW5kQ2hpbGQoZCk7IH0pOyB9CiAgICAgIHZhciBpZGVhbD1nKCJ6cElkZWFsIik7IGlmKGlkZWFsKXsgaWRlYWwuaW5uZXJIVE1MPSIiOyAocy5pZGVh
bHx8W10pLmZvckVhY2goZnVuY3Rpb24oeCl7IHZhciBzcD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7IHNwLnRleHRDb250ZW50PXg7IGlkZWFs
LmFwcGVuZENoaWxkKHNwKTsgfSk7IH0KICAgICAgaWYoZygienBOb3RlIikpeyBnKCJ6cE5vdGUiKS5oaWRkZW49IXMubm90ZTsgZygienBOb3RlIikudGV4
dENvbnRlbnQ9cy5ub3RlfHwiIjsgfQogICAgfQogICAgW10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIjem9uZVBhbmVsIFtkYXRh
LWVzLWhvdGVsLWN0YV0iKSkuZm9yRWFjaChmdW5jdGlvbihjKXsgYy5oaWRkZW49dHJ1ZTsgYy5zdHlsZS5kaXNwbGF5PSJub25lIjsgfSk7CiAgICB2YXIg
Ym9vaz1nKCJ6cEN0YUJvb2siKTsKICAgIGlmKGJvb2spewogICAgICBpZihzLnVybCl7IGJvb2suaGlkZGVuPWZhbHNlOyBib29rLnRleHRDb250ZW50PSJW
aWV3IHRoZSBzdWl0ZSI7IGJvb2suaHJlZj1zLnVybDsgYm9vay5yZW1vdmVBdHRyaWJ1dGUoInRhcmdldCIpOyBib29rLm9uY2xpY2s9bnVsbDsgfQogICAg
ICBlbHNlIHsgYm9vay5oaWRkZW49dHJ1ZTsgYm9vay5yZW1vdmVBdHRyaWJ1dGUoImhyZWYiKTsgfQogICAgfQogICAgdmFyIGVucT1nKCJ6cEN0YUVucXVp
cmUiKTsKICAgIGlmKGVucSl7CiAgICAgIGVucS5oaWRkZW49ZmFsc2U7IGVucS5zdHlsZS5kaXNwbGF5PSIiOyBlbnEudGV4dENvbnRlbnQ9IkVucXVpcmUg
YWJvdXQgdGhpcyBzdWl0ZSI7CiAgICAgIGVucS5zZXRBdHRyaWJ1dGUoImhyZWYiLCIjZW5xdWlyZSIpOyBlbnEuc2V0QXR0cmlidXRlKCJkYXRhLW9wZW4t
cmZpIiwiIik7IGVucS5zZXRBdHRyaWJ1dGUoImRhdGEtY2F0IixzLmNhdCk7CiAgICAgIGVucS5vbmNsaWNrPWZ1bmN0aW9uKGV2KXsKICAgICAgICBldi5w
cmV2ZW50RGVmYXVsdCgpOyBldi5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICB2YXIgc2VsPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJmLWNhdCIpOwog
ICAgICAgIGlmKHNlbCl7IGZvcih2YXIgaz0wO2s8c2VsLm9wdGlvbnMubGVuZ3RoO2srKyl7IGlmKHNlbC5vcHRpb25zW2tdLnRleHQ9PT1zLmNhdCl7IHNl
bC5zZWxlY3RlZEluZGV4PWs7IGJyZWFrOyB9IH0gfQogICAgICAgIHZhciBoPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNyZmkgaW5wdXRbbmFtZT1lZWJf
Y2F0ZWdvcnldIik7IGlmKGgpIGgudmFsdWU9cy5jYXQ7CiAgICAgICAgdmFyIG9wZW5lcj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIubmF2LWN0YVtkYXRh
LW9wZW4tcmZpXSIpfHxkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJbZGF0YS1vcGVuLXJmaV0iKTsKICAgICAgICBpZihvcGVuZXIpIG9wZW5lci5jbGljaygp
OwogICAgICB9OwogICAgfQogICAgLyogdGhlIHRpdGxlIGxhc3Q6IHRoZSBwYW5lbCBvcGVucywgYW5kIHRoZSBkZXZlbG9wZXIncyBzeW5jIHJlYWRzIGl0
LCBvbiB0aGlzIGNoYW5nZSAqLwogICAgaWYoZygienBUaXRsZSIpKSBnKCJ6cFRpdGxlIikudGV4dENvbnRlbnQ9cy5uYW1lOwogICAgdmFyIHNjPWRvY3Vt
ZW50LnF1ZXJ5U2VsZWN0b3IoIiN6b25lUGFuZWwgLnpwLXNjcm9sbCIpOyBpZihzYykgc2Muc2Nyb2xsVG9wPTA7CiAgfQogIGZ1bmN0aW9uIGRyYXdTdWl0
ZXMoc3ZnKXsKICAgIGlmKCFzdmcpIHJldHVybjsKICAgIFtdLnNsaWNlLmNhbGwoc3ZnLnF1ZXJ5U2VsZWN0b3JBbGwoIltkYXRhLWVzLXN1aXRlXSxbZGF0
YS1lcy1zdWl0ZS1sYWJlbF0iKSkuZm9yRWFjaChmdW5jdGlvbihlKXsgZS5yZW1vdmUoKTsgfSk7CiAgICB2YXIgcmVmPXN2Zy5xdWVyeVNlbGVjdG9yKCJ0
ZXh0W2RhdGEtZXMtbGFiZWxdOm5vdChbZGF0YS1lcy1zdWl0ZS1sYWJlbF0pIik7CiAgICB2YXIgc2l6ZT1yZWY/cGFyc2VGbG9hdChyZWYuc3R5bGUuZm9u
dFNpemUpOjM2OyAgIC8qIHRoZSBzdGFuZCBsYWJlbHMnIHNpemU6IGV2ZXJ5IGxhYmVsIG9uIHRoZSBtYXAgcmVhZHMgYWxpa2UgKi8KICAgIFNVSVRFUy5m
b3JFYWNoKGZ1bmN0aW9uKHMpewogICAgICB2YXIgYz1zdWl0ZUNlbnRyZShzKSwgc2hhcGU7CiAgICAgIGlmKHMudCE9bnVsbCl7CiAgICAgICAgLyogYSAz
NCB4IDE2IGJveCB0dXJuZWQgdG8gdGhlIGJhbmQncyBhbmdsZSwgYXMgYWJzb2x1dGUgcG9pbnRzIHNvIG5vIHRyYW5zZm9ybSBydWxlIGNhbiBtb3ZlIGl0
ICovCiAgICAgICAgdmFyIGE9U1VJVEVfTElORS5hbmdsZSpNYXRoLlBJLzE4MCwgY2E9TWF0aC5jb3MoYSksIHNhPU1hdGguc2luKGEpLCBodz0xNywgaGg9
ODsKICAgICAgICB2YXIgcHRzPVtbLWh3LC1oaF0sW2h3LC1oaF0sW2h3LGhoXSxbLWh3LGhoXV0ubWFwKGZ1bmN0aW9uKHApeyByZXR1cm4gKGMueCtwWzBd
KmNhLXBbMV0qc2EpLnRvRml4ZWQoMSkrIiwiKyhjLnkrcFswXSpzYStwWzFdKmNhKS50b0ZpeGVkKDEpOyB9KTsKICAgICAgICBzaGFwZT1kb2N1bWVudC5j
cmVhdGVFbGVtZW50TlMoTlMsInBvbHlnb24iKTsKICAgICAgICBzaGFwZS5zZXRBdHRyaWJ1dGUoInBvaW50cyIscHRzLmpvaW4oIiAiKSk7IHNoYXBlLnNl
dEF0dHJpYnV0ZSgic3Ryb2tlLWxpbmVqb2luIiwicm91bmQiKTsKICAgICAgfWVsc2V7CiAgICAgICAgc2hhcGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5T
KE5TLCJyZWN0Iik7CiAgICAgICAgc2hhcGUuc2V0QXR0cmlidXRlKCJ4IiwoYy54LXMudy8yKS50b0ZpeGVkKDEpKTsgc2hhcGUuc2V0QXR0cmlidXRlKCJ5
IiwoYy55LXMuaC8yKS50b0ZpeGVkKDEpKTsgc2hhcGUuc2V0QXR0cmlidXRlKCJ3aWR0aCIscy53KTsgc2hhcGUuc2V0QXR0cmlidXRlKCJoZWlnaHQiLHMu
aCk7IHNoYXBlLnNldEF0dHJpYnV0ZSgicngiLDEuNSk7CiAgICAgIH0KICAgICAgc2hhcGUuc2V0QXR0cmlidXRlKCJjbGFzcyIsImVzLXpvbmUgZXMtcGtn
Iisocy5zb2xpZD8iIGVzLXN1aXRlLXNvbGlkIjoiIikpOwogICAgICBzaGFwZS5zZXRBdHRyaWJ1dGUoImRhdGEtZXMtc3VpdGUiLCIxIik7IHNoYXBlLmRh
dGFzZXQuZXNJZD1zLmlkOwogICAgICBzaGFwZS5zZXRBdHRyaWJ1dGUoInJvbGUiLCJidXR0b24iKTsgc2hhcGUuc2V0QXR0cmlidXRlKCJ0YWJpbmRleCIs
IjAiKTsgc2hhcGUuc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIixzLm5hbWUrIiwgIitzLmNvZGUpOwogICAgICBzaGFwZS5hZGRFdmVudExpc3RlbmVyKCJt
b3VzZWRvd24iLGZ1bmN0aW9uKGUpeyBlLnByZXZlbnREZWZhdWx0KCk7IH0pOwogICAgICBzaGFwZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rp
b24oZSl7IGUuc3RvcFByb3BhZ2F0aW9uKCk7IG9wZW5TdWl0ZShzLHNoYXBlKTsgfSk7CiAgICAgIHNoYXBlLmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24i
LGZ1bmN0aW9uKGUpeyBpZihlLmtleT09PSJFbnRlciJ8fGUua2V5PT09IiAiKXsgZS5wcmV2ZW50RGVmYXVsdCgpOyBlLnN0b3BQcm9wYWdhdGlvbigpOyBv
cGVuU3VpdGUocyxzaGFwZSk7IH0gfSk7CiAgICAgIGlmKHN1aXRlQWN0aXZlPT09cy5pZCkgc2hhcGUuY2xhc3NMaXN0LmFkZCgiZXMtYWN0aXZlIik7CiAg
ICAgIHN2Zy5hcHBlbmRDaGlsZChzaGFwZSk7CiAgICAgIC8qIHBvc2l0aW9ucyBmcm9tIGEgZml0IHNlYXJjaCBvbiB0aGUgbGl2ZSBtYXAgKDYgT2N0IDIw
MjYpOiBjbGVhciBvZiBldmVyeSB6b25lLCBsYWJlbCBhbmQgdGhlIG1hcCBlZGdlIGF0CiAgICAgICAgIHRoZSBzdGFuZC1sYWJlbCBzaXplLCB3aXRoIHRo
ZSBNYWluIEdyYW5kc3RhbmQgbGFiZWwgbW92ZWQgNDAgdW5pdHMgZG93biB0byBtYWtlIHJvb20gKi8KICAgICAgc3VpdGVMYWJlbChzdmcscy5sYWJlbFRl
eHQsYy54K3MubGFiZWxEeCxjLnkrcy5sYWJlbER5LHMubGFiZWxBbmNob3Isc2l6ZSk7CiAgICB9KTsKICAgIC8qIHRoZSB0aWVyIGZpbHRlciBjaGlwcyBk
aW0gZXZlcnkgem9uZSB0aGUgbWFpbiBzY3JpcHQgZG9lcyBub3Qga25vdzsgdGhlIHN1aXRlcyBmb2xsb3cgdGhlIFN1aXRlIGNoaXAgKi8KICAgIHZhciBj
aGlwcz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIjbWFwRmlsdGVycyAubWFwLWNoaXAiKTsKICAgIGlmKGNoaXBzLmxlbmd0aCYmIXN2Zy5oYXNBdHRy
aWJ1dGUoImRhdGEtZXMtc3VpdGUtY2hpcHMiKSl7CiAgICAgIHN2Zy5zZXRBdHRyaWJ1dGUoImRhdGEtZXMtc3VpdGUtY2hpcHMiLCIxIik7CiAgICAgIEFy
cmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoY2hpcHMsZnVuY3Rpb24oY2gpewogICAgICAgIGNoLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlv
bigpewogICAgICAgICAgdmFyIHQ9Y2guZGF0YXNldC50aWVyOwogICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpewogICAgICAgICAgICBbXS5zbGlj
ZS5jYWxsKHN2Zy5xdWVyeVNlbGVjdG9yQWxsKCIuZXMtem9uZVtkYXRhLWVzLXN1aXRlXSIpKS5mb3JFYWNoKGZ1bmN0aW9uKHopeyB6LmNsYXNzTGlzdC50
b2dnbGUoImVzLWRpbSIsISgiYWxsIj09PXR8fCJzdWl0ZSI9PT10KSk7IH0pOwogICAgICAgICAgfSwwKTsKICAgICAgICB9KTsKICAgICAgfSk7CiAgICB9
CiAgfQogIC8qIHJlZHJhdyBhZnRlciBldmVyeSBsYWJlbCBwYXNzIChmaXJzdCBkcmF3IGFuZCBldmVyeSByZXNpemUpOyB0aGUgbGFiZWxzIGFyZSByZWRy
YXduIHRoZSBzYW1lIHdheSAqLwogIHZhciBfZHJhd0xhYmVscz1kcmF3TGFiZWxzOwogIGRyYXdMYWJlbHM9ZnVuY3Rpb24oc3ZnLHNwYW5zKXsgX2RyYXdM
YWJlbHMoc3ZnLHNwYW5zKTsgdHJ5eyBkcmF3U3VpdGVzKHN2Zyk7IH1jYXRjaChlKXt9IH07CiAgLyogYSBzdGFuZCBvciBsb3VuZ2UgcGlja2VkIGFmdGVy
IGEgc3VpdGU6IHRoZSBzdWl0ZSdzIGhpZ2hsaWdodCBnb2VzICovCiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGUpewog
ICAgaWYoZS5pc1RydXN0ZWQ9PT1mYWxzZSkgcmV0dXJuOyAgIC8qIG9wZW5TdWl0ZSBwcmVzc2VzIGEgcXVpY2sgbGluayBpdHNlbGYgKi8KICAgIHZhciB6
PWUudGFyZ2V0JiZlLnRhcmdldC5jbG9zZXN0JiZlLnRhcmdldC5jbG9zZXN0KCIuZXMtem9uZTpub3QoW2RhdGEtZXMtc3VpdGVdKSwjenBRdWlja0xpbmtz
IGJ1dHRvbiwjc3RhbmRBY2MgLmFjYy1xOm5vdChbZGF0YS1lcy1zdWl0ZS1yb3ddKSIpOwogICAgaWYoeikgc2V0VGltZW91dChjbGVhclN1aXRlQWN0aXZl
LDApOwogIH0sdHJ1ZSk7CiAgLyogdGhlIHRocmVlIHJvd3MgaW4gdGhlIFN0YW5kcyBhbmQgTG91bmdlcyBsaXN0ICovCiAgW10uc2xpY2UuY2FsbChkb2N1
bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIjc3RhbmRBY2MgLmFjYy1xW2RhdGEtZXMtc3VpdGUtcm93XSIpKS5mb3JFYWNoKGZ1bmN0aW9uKGJ0bil7CiAgICB2
YXIgcz1udWxsOyBTVUlURVMuZm9yRWFjaChmdW5jdGlvbih4KXsgaWYoeC5pZD09PWJ0bi5nZXRBdHRyaWJ1dGUoImRhdGEtZXMtc3VpdGUtcm93IikpIHM9
eDsgfSk7CiAgICBpZighcykgcmV0dXJuOwogICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbihlKXsKICAgICAgZS5wcmV2ZW50RGVm
YXVsdCgpOyBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICB2YXIgc3ZnPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNtYXBXcmFwIHN2ZyIpOwogICAgICBv
cGVuU3VpdGUocyxzdmcmJnN2Zy5xdWVyeVNlbGVjdG9yKCdbZGF0YS1lcy1pZD0iJytzLmlkKyciXScpKTsKICAgIH0sdHJ1ZSk7CiAgfSk7Cn0pKCk7Cg==
IWZ1bmN0aW9uKCl7dmFyIGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVzLXBhZ2UiKTtlJiZlLmNsYXNzTGlzdC5hZGQoImpzIiksZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7dmFyIGU9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LHQ9bnVsbDt0cnl7dD1sb2NhbFN0b3JhZ2UuZ2V0SXRlbSgiZXNUaGVtZSIpfWNhdGNoKEEpe30ibGlnaHQiPT09dHx8ImRhcmsiPT09dD9lLnNldEF0dHJpYnV0ZSgiZGF0YS10aGVtZSIsdCk6d2luZG93Lm1hdGNoTWVkaWEmJndpbmRvdy5tYXRjaE1lZGlhKCIocHJlZmVycy1jb2xvci1zY2hlbWU6IGxpZ2h0KSIpLm1hdGNoZXMmJmUuc2V0QXR0cmlidXRlKCJkYXRhLXRoZW1lIiwibGlnaHQiKTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGhlbWVCdG4iKSxuPXdpbmRvdy5tYXRjaE1lZGlhJiZ3aW5kb3cubWF0Y2hNZWRpYSgiKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSkiKS5tYXRjaGVzO2Z1bmN0aW9uIGkodCl7ZS5zZXRBdHRyaWJ1dGUoImRhdGEtdGhlbWUiLHQpO3RyeXtsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgiZXNUaGVtZSIsdCl9Y2F0Y2goQSl7fX1hLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3ZhciB0PSJsaWdodCI9PT1lLmdldEF0dHJpYnV0ZSgiZGF0YS10aGVtZSIpPyJkYXJrIjoibGlnaHQiO2lmKGEuY2xhc3NMaXN0LmFkZCgic3BpbiIpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXthLmNsYXNzTGlzdC5yZW1vdmUoInNwaW4iKX0sNTIwKSwhbiYmZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbil7dmFyIG89YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPW8ubGVmdCtvLndpZHRoLzIscj1vLnRvcCtvLmhlaWdodC8yLHM9TWF0aC5oeXBvdChNYXRoLm1heChjLHdpbmRvdy5pbm5lcldpZHRoLWMpLE1hdGgubWF4KHIsd2luZG93LmlubmVySGVpZ2h0LXIpKTtkb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKGZ1bmN0aW9uKCl7aSh0KX0pLnJlYWR5LnRoZW4oZnVuY3Rpb24oKXtlLmFuaW1hdGUoe2NsaXBQYXRoOlsiY2lyY2xlKDBweCBhdCAiK2MrInB4ICIrcisicHgpIiwiY2lyY2xlKCIrcysicHggYXQgIitjKyJweCAiK3IrInB4KSJdfSx7ZHVyYXRpb246NjIwLGVhc2luZzoiY3ViaWMtYmV6aWVyKC40LDAsLjIsMSkiLHBzZXVkb0VsZW1lbnQ6Ijo6dmlldy10cmFuc2l0aW9uLW5ldyhyb290KSJ9KX0pLmNhdGNoKGZ1bmN0aW9uKCl7fSl9ZWxzZSFmdW5jdGlvbih0KXtlLmNsYXNzTGlzdC5hZGQoInRoZW1pbmciKSxpKHQpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmNsYXNzTGlzdC5yZW1vdmUoInRoZW1pbmciKX0sNTYwKX0odCl9KTt2YXIgbz1mdW5jdGlvbigpe307IWZ1bmN0aW9uKCl7dmFyIGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImhlcm9UaXRsZSIpLHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLmhlcm8tcGlsbGFycyIpO2lmKGUmJnQmJiFuJiZlLmFuaW1hdGUpe3ZhciBhPTI0MCxpPWZ1bmN0aW9uKGUpe3ZhciB0PVtdLGE9W10sbj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlLmNoaWxkTm9kZXMpO2Z1bmN0aW9uIGkoZSxuKXtlLnNwbGl0KC8oXHMrKS8pLmZvckVhY2goZnVuY3Rpb24oZSl7aWYoZSlpZigvXlxzKyQvLnRlc3QoZSkpbi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiICIpKTtlbHNle3ZhciBpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtpLmNsYXNzTmFtZT0idyIsQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChlLGZ1bmN0aW9uKGUpe3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTt0LmNsYXNzTmFtZT0iYyIsdC50ZXh0Q29udGVudD1lLGkuYXBwZW5kQ2hpbGQodCksYS5wdXNoKHQpfSksbi5hcHBlbmRDaGlsZChpKSx0LnB1c2goaSl9fSl9cmV0dXJuIGUuaW5uZXJIVE1MPSIiLG4uZm9yRWFjaChmdW5jdGlvbih0KXtpZigzPT09dC5ub2RlVHlwZSlpKHQudGV4dENvbnRlbnQsZSk7ZWxzZXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KHQudGFnTmFtZS50b0xvd2VyQ2FzZSgpKTthLmNsYXNzTmFtZT10LmNsYXNzTmFtZSxlLmFwcGVuZENoaWxkKGEpLGkodC50ZXh0Q29udGVudCxhKX19KSx7d29yZHM6dCxjaGFyczphfX0oZSksYz10LnF1ZXJ5U2VsZWN0b3JBbGwoImEiKTt0LmNsYXNzTGlzdC5hZGQoImxpZnQiKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGMsZnVuY3Rpb24oZSl7ZS5zdHlsZS5vcGFjaXR5PSIwIn0pLG89ZnVuY3Rpb24oKXtkb2N1bWVudC5mb250cyYmZG9jdW1lbnQuZm9udHMucmVhZHk/ZG9jdW1lbnQuZm9udHMucmVhZHkudGhlbihyKS5jYXRjaChyKTpyKCl9fWZ1bmN0aW9uIHIoKXt2YXIgbj1mdW5jdGlvbigpe3ZhciB0PWUucXVlcnlTZWxlY3RvcigiZW0iKTtpZighdClyZXR1cm4gbnVsbDt2YXIgYT10LnF1ZXJ5U2VsZWN0b3JBbGwoIi53Iik7aWYoYS5sZW5ndGg8MilyZXR1cm4gbnVsbDtmb3IodmFyIG49YVswXS5xdWVyeVNlbGVjdG9yQWxsKCIuYyIpLGk9YVsxXS5xdWVyeVNlbGVjdG9yQWxsKCIuYyIpLG89bnVsbCxjPWkubGVuZ3RoLTE7Yz49MDtjLS0paWYoInQiPT09aVtjXS50ZXh0Q29udGVudC50b0xvd2VyQ2FzZSgpKXtvPWlbY107YnJlYWt9cmV0dXJuIG5bMF0mJm5bMV0mJm8/W25bMF0sblsxXSxvXTpudWxsfSgpO2lmKCFufHxjLmxlbmd0aDwzKXJldHVybiBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGMsZnVuY3Rpb24oZSl7ZS5zdHlsZS5vcGFjaXR5PSIifSksdm9pZCB0LmNsYXNzTGlzdC5yZW1vdmUoImxpZnQiKTtpLmNoYXJzLmZvckVhY2goZnVuY3Rpb24oZSx0KXtlLmFuaW1hdGUoW3t0cmFuc2Zvcm06InRyYW5zbGF0ZVkoNDZweCkiLG9wYWNpdHk6MH0se3RyYW5zZm9ybToidHJhbnNsYXRlWSgwKSIsb3BhY2l0eToxfV0se2R1cmF0aW9uOjg2MCxkZWxheToyNCp0LGVhc2luZzoiY3ViaWMtYmV6aWVyKC4xNiwxLC4zLDEpIixmaWxsOiJib3RoIn0pfSk7dmFyIG89W107QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChjLGZ1bmN0aW9uKGUsdCl7dmFyIGE9blt0XS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxpPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7by5wdXNoKHtlbDplLGR4OmEubGVmdC1pLmxlZnQsZHk6YS50b3AtaS50b3B9KX0pO3ZhciByPTExODAscz0wO28uZm9yRWFjaChmdW5jdGlvbihlLHQpe3ZhciBpPTFlMyszODAqdDtzPU1hdGgubWF4KHMsaSs1MCtyKTt2YXIgbz1nZXRDb21wdXRlZFN0eWxlKG5bdF0pLmNvbG9yO25bdF0uYW5pbWF0ZShbe3RyYW5zZm9ybToic2NhbGUoMSkiLGNvbG9yOm99LHt0cmFuc2Zvcm06InNjYWxlKDEuMykiLGNvbG9yOiIjRUJCNDQ2IixvZmZzZXQ6LjMzLGVhc2luZzoiY3ViaWMtYmV6aWVyKC4yNSwuNDYsLjQ1LC45NCkifSx7dHJhbnNmb3JtOiJzY2FsZSgxKSIsY29sb3I6byxlYXNpbmc6ImN1YmljLWJlemllciguMzQsMS41NiwuNjQsMSkifV0se2R1cmF0aW9uOjQ1MCxkZWxheTppLGZpbGw6Im5vbmUifSk7dmFyIGM9InRyYW5zbGF0ZSgiK2UuZHgrInB4LCIrZS5keSsicHgpIHNjYWxlKDEuNCwxLjQpIjtlLmVsLmFuaW1hdGUoW3t0cmFuc2Zvcm06YyxvcGFjaXR5OjAsb2Zmc2V0OjB9LHt0cmFuc2Zvcm06YyxvcGFjaXR5OjEsb2Zmc2V0OjEzMC9yfSx7dHJhbnNmb3JtOmMsb3BhY2l0eToxLG9mZnNldDphL3IsZWFzaW5nOiJjdWJpYy1iZXppZXIoLjU1LC4wODUsLjY4LC41MykifSx7dHJhbnNmb3JtOiJ0cmFuc2xhdGUoMHB4LDBweCkgc2NhbGUoMSwxKSIsb3BhY2l0eToxLG9mZnNldDo4ODAvcixlYXNpbmc6ImVhc2Utb3V0In0se3RyYW5zZm9ybToidHJhbnNsYXRlKDBweCwwcHgpIHNjYWxlKDEsMC44NSkiLG9wYWNpdHk6MSxvZmZzZXQ6OTcwL3IsZWFzaW5nOiJlYXNlLW91dCJ9LHt0cmFuc2Zvcm06InRyYW5zbGF0ZSgwcHgsMHB4KSBzY2FsZSgxLDEpIixvcGFjaXR5OjEsb2Zmc2V0OjF9XSx7ZHVyYXRpb246cixkZWxheTppKzUwLGZpbGw6ImJvdGgifSl9KSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChjLGZ1bmN0aW9uKGUpe2UuZ2V0QW5pbWF0aW9ucygpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5jYW5jZWwoKX0pLGUuc3R5bGUub3BhY2l0eT0iIixlLnN0eWxlLnRyYW5zZm9ybT0iIn0pLHQuY2xhc3NMaXN0LnJlbW92ZSgibGlmdCIpfSxzKzQwKX19KCk7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVzTG9hZGVyIikscj1kb2N1bWVudC5ib2R5LHM9ITA7dHJ5e3M9ITB9Y2F0Y2goQSl7fWZ1bmN0aW9uIGQoKXtjLmNsYXNzTGlzdC5hZGQoImlzLW91dCIpLHIuY2xhc3NMaXN0LnJlbW92ZSgiZXNsLWxvY2siKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Yy5oaWRkZW49ITB9LDcwMCk7dHJ5e3Nlc3Npb25TdG9yYWdlLnNldEl0ZW0oImVzU2VlbkxvYWRlciIsIjEiKX1jYXRjaChBKXt9c2V0VGltZW91dChvLDMwMCl9cz8oYy5oaWRkZW49ITAsci5jbGFzc0xpc3QucmVtb3ZlKCJlc2wtbG9jayIpLHNldFRpbWVvdXQobywyNjApKTooc2V0VGltZW91dChkLDIwNTApLGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGQpKSxkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuY2FyLWJ0biIpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt2YXIgdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChlLmRhdGFzZXQudGFyZ2V0KTtpZih0KXt2YXIgYT10LmZpcnN0RWxlbWVudENoaWxkLG49YT9hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoKzQ6LjgqdC5jbGllbnRXaWR0aDt0LnNjcm9sbEJ5KHtsZWZ0Om4qK2UuZGF0YXNldC5kaXIsYmVoYXZpb3I6InNtb290aCJ9KX19KX0pO3ZhciBsPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZmlNb2RhbCIpLHU9bC5xdWVyeVNlbGVjdG9yKCIucmZpLWRsZyIpLHA9bnVsbCxmPW51bGwsaD0wO2Z1bmN0aW9uIG0oKXtpZighKGgrKz4wKSl7dmFyIGU9d2luZG93LmlubmVyV2lkdGgtZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoO2U+MCYmKGRvY3VtZW50LmJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0PWUrInB4IiksZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIn19ZnVuY3Rpb24gZygpeyhoPU1hdGgubWF4KDAsaC0xKSk+MHx8KGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3c9IiIsZG9jdW1lbnQuYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQ9IiIpfWZ1bmN0aW9uIGIoKXtsLmhpZGRlbnx8KGwuY2xhc3NMaXN0LnJlbW92ZSgiaXMtb3BlbiIpLGwuY2xhc3NMaXN0LmFkZCgiaXMtY2xvc2luZyIpLGNsZWFyVGltZW91dChmKSxmPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtsLmhpZGRlbj0hMCxsLmNsYXNzTGlzdC5yZW1vdmUoImlzLWNsb3NpbmciKSxnKCkscCYmcC5mb2N1cyYmcC5mb2N1cygpLHA9bnVsbH0sbj8wOjI0MCkpfWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIltkYXRhLW9wZW4tcmZpXSIpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24odCl7dC5wcmV2ZW50RGVmYXVsdCgpO3ZhciBhLGk9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm5hdlBhbmVsIik7aWYoaSYmIWkuaGlkZGVuKXtpLmNsYXNzTGlzdC5yZW1vdmUoImlzLW9wZW4iKSxpLmNsYXNzTGlzdC5hZGQoImlzLWNsb3NpbmciKTt2YXIgbz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibmF2QnVyZ2VyIik7byYmKG8uc2V0QXR0cmlidXRlKCJhcmlhLWV4cGFuZGVkIiwiZmFsc2UiKSxvLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsIk9wZW4gbWVudSIpKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aS5oaWRkZW49ITAsaS5jbGFzc0xpc3QucmVtb3ZlKCJpcy1jbG9zaW5nIiksZygpfSxuPzA6MjYwKX1hPWUsY2xlYXJUaW1lb3V0KGYpLHA9YXx8bnVsbCxsLmNsYXNzTGlzdC5yZW1vdmUoImlzLWNsb3NpbmciKSxsLmhpZGRlbj0hMSxtKCksbC5vZmZzZXRXaWR0aCxsLmNsYXNzTGlzdC5hZGQoImlzLW9wZW4iKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImYtZmlyc3QiKTtpZihlKXRyeXtlLmZvY3VzKHtwcmV2ZW50U2Nyb2xsOiEwfSl9Y2F0Y2goQSl7ZS5mb2N1cygpfX0sbj8wOjI2MCl9KX0pLGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIltkYXRhLWNsb3NlLXJmaV0iKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7YigpfSl9KSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixmdW5jdGlvbihlKXsiRXNjYXBlIiE9PWUua2V5fHxsLmhpZGRlbnx8YigpfSksbC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixmdW5jdGlvbihlKXtpZigiVGFiIj09PWUua2V5KXtmb3IodmFyIHQ9dS5xdWVyeVNlbGVjdG9yQWxsKCJhW2hyZWZdLCBidXR0b246bm90KFtkaXNhYmxlZF0pLCBpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYSIpLGE9W10sbj0wO248dC5sZW5ndGg7bisrKW51bGwhPT10W25dLm9mZnNldFBhcmVudCYmYS5wdXNoKHRbbl0pO2lmKGEubGVuZ3RoKXt2YXIgaT1hWzBdLG89YVthLmxlbmd0aC0xXTtlLnNoaWZ0S2V5JiZkb2N1bWVudC5hY3RpdmVFbGVtZW50PT09aT8oZS5wcmV2ZW50RGVmYXVsdCgpLG8uZm9jdXMoKSk6ZS5zaGlmdEtleXx8ZG9jdW1lbnQuYWN0aXZlRWxlbWVudCE9PW98fChlLnByZXZlbnREZWZhdWx0KCksaS5mb2N1cygpKX19fSksZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJmaSIpLmFkZEV2ZW50TGlzdGVuZXIoInN1Ym1pdCIsZnVuY3Rpb24oZSl7ZS5wcmV2ZW50RGVmYXVsdCgpO3ZhciB0PWUudGFyZ2V0O2lmKHQuY2hlY2tWYWxpZGl0eSgpKXt2YXIgYT10LmRhdGFzZXQuZW5kcG9pbnQsbj1mdW5jdGlvbigpe3ZhciBzPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZW50Iik7cy5jbGFzc0xpc3QuYWRkKCJvbiIpO3QucmVzZXQoKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cy5jbGFzc0xpc3QucmVtb3ZlKCJvbiIpfSw3MDAwKX07YT9mZXRjaChhLHttZXRob2Q6IlBPU1QiLGJvZHk6bmV3IEZvcm1EYXRhKHQpfSkudGhlbihuKS5jYXRjaChuKTpuKCl9ZWxzZSB0LnJlcG9ydFZhbGlkaXR5KCl9KTt2YXIgdj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibmF2QnVyZ2VyIikseT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibmF2UGFuZWwiKSx3PW51bGw7ZnVuY3Rpb24gRSgpe3kuaGlkZGVufHwoeS5jbGFzc0xpc3QucmVtb3ZlKCJpcy1vcGVuIikseS5jbGFzc0xpc3QuYWRkKCJpcy1jbG9zaW5nIiksdi5zZXRBdHRyaWJ1dGUoImFyaWEtZXhwYW5kZWQiLCJmYWxzZSIpLHYuc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIiwiT3BlbiBtZW51IiksY2xlYXJUaW1lb3V0KHcpLHc9c2V0VGltZW91dChmdW5jdGlvbigpe3kuaGlkZGVuPSEwLHkuY2xhc3NMaXN0LnJlbW92ZSgiaXMtY2xvc2luZyIpLGcoKX0sbj8wOjI2MCkpfXYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7eS5oaWRkZW4/KGNsZWFyVGltZW91dCh3KSx5LmNsYXNzTGlzdC5yZW1vdmUoImlzLWNsb3NpbmciKSx5LmhpZGRlbj0hMSxtKCkseS5vZmZzZXRXaWR0aCx5LmNsYXNzTGlzdC5hZGQoImlzLW9wZW4iKSx2LnNldEF0dHJpYnV0ZSgiYXJpYS1leHBhbmRlZCIsInRydWUiKSx2LnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsIkNsb3NlIG1lbnUiKSk6RSgpfSkseS5xdWVyeVNlbGVjdG9yQWxsKCJbZGF0YS1jbG9zZS1tZW51XSIpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXtFKCl9KX0pLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLGZ1bmN0aW9uKGUpeyJFc2NhcGUiIT09ZS5rZXl8fHkuaGlkZGVufHwoRSgpLHYuZm9jdXMoKSl9KTt2YXIgUz13aW5kb3cubWF0Y2hNZWRpYSgiKG1pbi13aWR0aDogMTAwMXB4KSIpLEw9ZnVuY3Rpb24oZSl7ZS5tYXRjaGVzJiZFKCl9O1MuYWRkRXZlbnRMaXN0ZW5lcj9TLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsTCk6Uy5hZGRMaXN0ZW5lciYmUy5hZGRMaXN0ZW5lcihMKTt2YXIgaz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibmF2Iik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsZnVuY3Rpb24oKXtrLmNsYXNzTGlzdC50b2dnbGUoInNjcm9sbGVkIix3aW5kb3cuc2Nyb2xsWT42MCl9KTt2YXIgeD1uZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24oZSl7ZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuaXNJbnRlcnNlY3RpbmcmJihlLnRhcmdldC5jbGFzc0xpc3QuYWRkKCJ2IikseC51bm9ic2VydmUoZS50YXJnZXQpKX0pfSx7dGhyZXNob2xkOi4wOH0pO2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5yLCAuc2VjdGlvbi1oZWFkZXIiKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3gub2JzZXJ2ZShlKX0pfSgpLGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciBlPXdpbmRvdy5tYXRjaE1lZGlhJiZ3aW5kb3cubWF0Y2hNZWRpYSgiKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSkiKS5tYXRjaGVzLHQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVzeFRpdGxlIiksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZXN4UGlsbGFycyIpO2lmKHQmJmEmJiFlJiZ0LmFuaW1hdGUpe3ZhciBuPTI0MCxpPWZ1bmN0aW9uKGUpe3ZhciB0PVtdLGE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZS5jaGlsZE5vZGVzKTtmdW5jdGlvbiBuKGUsYSl7ZS5zcGxpdCgvKFxzKykvKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2lmKGUpaWYoL15ccyskLy50ZXN0KGUpKWEuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIiAiKSk7ZWxzZXt2YXIgbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7bi5jbGFzc05hbWU9InciLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZSxmdW5jdGlvbihlKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7YS5jbGFzc05hbWU9ImMiLGEudGV4dENvbnRlbnQ9ZSxuLmFwcGVuZENoaWxkKGEpLHQucHVzaChhKX0pLGEuYXBwZW5kQ2hpbGQobil9fSl9cmV0dXJuIGUuaW5uZXJIVE1MPSIiLGEuZm9yRWFjaChmdW5jdGlvbih0KXtpZigzPT09dC5ub2RlVHlwZSluKHQudGV4dENvbnRlbnQsZSk7ZWxzZXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KHQudGFnTmFtZS50b0xvd2VyQ2FzZSgpKTthLmNsYXNzTmFtZT10LmNsYXNzTmFtZSxlLmFwcGVuZENoaWxkKGEpLG4odC50ZXh0Q29udGVudCxhKX19KSx0fSh0KSxvPWEucXVlcnlTZWxlY3RvcigiYSIpO2EuY2xhc3NMaXN0LmFkZCgibGlmdCIpLG8mJihvLnN0eWxlLm9wYWNpdHk9IjAiKTt2YXIgYz1hLnF1ZXJ5U2VsZWN0b3IoImxpOm50aC1jaGlsZCgyKSIpO2MmJmMuY2xhc3NMaXN0LmFkZCgidGFnLXdhaXQiKTt2YXIgcj0hMDt0cnl7cj0hMH1jYXRjaChkKXt9c2V0VGltZW91dChmdW5jdGlvbigpe2RvY3VtZW50LmZvbnRzJiZkb2N1bWVudC5mb250cy5yZWFkeT9kb2N1bWVudC5mb250cy5yZWFkeS50aGVuKHMpLmNhdGNoKHMpOnMoKX0scj8yNjA6MjM1MCl9ZnVuY3Rpb24gcygpe3ZhciBlPWZ1bmN0aW9uKCl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yKCJlbSIpO2lmKCFlKXJldHVybiBudWxsO3ZhciBuPWUucXVlcnlTZWxlY3RvckFsbCgiLnciKTtpZighbi5sZW5ndGgpcmV0dXJuIG51bGw7dmFyIGk9cGFyc2VJbnQoYS5nZXRBdHRyaWJ1dGUoImRhdGEtc3JjLWluZGV4Iil8fCIwIiwxMCl8fDAsbz1uWzBdLnF1ZXJ5U2VsZWN0b3JBbGwoIi5jIik7cmV0dXJuIG9baV18fG9bMF18fG51bGx9KCk7aWYoIWV8fCFvKXJldHVybiBvJiYoby5zdHlsZS5vcGFjaXR5PSIiKSxjJiZjLmNsYXNzTGlzdC5yZW1vdmUoInRhZy13YWl0Iiksdm9pZCBhLmNsYXNzTGlzdC5yZW1vdmUoImxpZnQiKTtpLmZvckVhY2goZnVuY3Rpb24oZSx0KXtlLmFuaW1hdGUoW3t0cmFuc2Zvcm06InRyYW5zbGF0ZVkoNDZweCkiLG9wYWNpdHk6MH0se3RyYW5zZm9ybToidHJhbnNsYXRlWSgwKSIsb3BhY2l0eToxfV0se2R1cmF0aW9uOjg2MCxkZWxheToyNCp0LGVhc2luZzoiY3ViaWMtYmV6aWVyKC4xNiwxLC4zLDEpIixmaWxsOiJib3RoIn0pfSk7dmFyIHI9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxzPW8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksZD1NYXRoLm1pbigxLjQsTWF0aC5tYXgoLjIsci5oZWlnaHQvcy5oZWlnaHQqMS4xNSkpLGw9ci5sZWZ0LXMubGVmdCx1PXIuYm90dG9tLXMuYm90dG9tLHA9MTE4MCxmPTFlMyxoPWdldENvbXB1dGVkU3R5bGUoZSkuY29sb3I7ZS5hbmltYXRlKFt7dHJhbnNmb3JtOiJzY2FsZSgxKSIsY29sb3I6aH0se3RyYW5zZm9ybToic2NhbGUoMS4zKSIsY29sb3I6IiNFQkI0NDYiLG9mZnNldDouMzMsZWFzaW5nOiJjdWJpYy1iZXppZXIoLjI1LC40NiwuNDUsLjk0KSJ9LHt0cmFuc2Zvcm06InNjYWxlKDEpIixjb2xvcjpoLGVhc2luZzoiY3ViaWMtYmV6aWVyKC4zNCwxLjU2LC42NCwxKSJ9XSx7ZHVyYXRpb246NDUwLGRlbGF5OmYsZmlsbDoibm9uZSJ9KTt2YXIgbT0idHJhbnNsYXRlKCIrbCsicHgsIit1KyJweCkgc2NhbGUoIitkKyIsIitkKyIpIjtvLmFuaW1hdGUoW3t0cmFuc2Zvcm06bSxvcGFjaXR5OjAsb2Zmc2V0OjB9LHt0cmFuc2Zvcm06bSxvcGFjaXR5OjEsb2Zmc2V0OjEzMC9wfSx7dHJhbnNmb3JtOm0sb3BhY2l0eToxLG9mZnNldDpuL3AsZWFzaW5nOiJjdWJpYy1iZXppZXIoLjU1LC4wODUsLjY4LC41MykifSx7dHJhbnNmb3JtOiJ0cmFuc2xhdGUoMHB4LDBweCkgc2NhbGUoMSwxKSIsb3BhY2l0eToxLG9mZnNldDo4ODAvcCxlYXNpbmc6ImVhc2Utb3V0In0se3RyYW5zZm9ybToidHJhbnNsYXRlKDBweCwwcHgpIHNjYWxlKDEsMC44NSkiLG9wYWNpdHk6MSxvZmZzZXQ6OTcwL3AsZWFzaW5nOiJlYXNlLW91dCJ9LHt0cmFuc2Zvcm06InRyYW5zbGF0ZSgwcHgsMHB4KSBzY2FsZSgxLDEpIixvcGFjaXR5OjEsb2Zmc2V0OjF9XSx7ZHVyYXRpb246cCxkZWxheToxMDUwLGZpbGw6ImJvdGgifSksc2V0VGltZW91dChmdW5jdGlvbigpe28uZ2V0QW5pbWF0aW9ucygpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5jYW5jZWwoKX0pLG8uc3R5bGUub3BhY2l0eT0iIixvLnN0eWxlLnRyYW5zZm9ybT0iIixhLmNsYXNzTGlzdC5yZW1vdmUoImxpZnQiKSxjJiYoYy5jbGFzc0xpc3QucmVtb3ZlKCJ0YWctd2FpdCIpLGMuY2xhc3NMaXN0LmFkZCgidGFnLWluIikpfSwyMjcwKX19KCksZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7dmFyIGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInZlbnVlRmlsZSIpO2lmKGUpe3ZhciB0PWUucXVlcnlTZWxlY3RvcigiLmFiLXRvZ2dsZSIpLGE9ZS5xdWVyeVNlbGVjdG9yKCIuYWItbGVhZCIpLG49ZnVuY3Rpb24oKXt2YXIgYT1lLmNsYXNzTGlzdC50b2dnbGUoIm9wZW4iKTt0LnNldEF0dHJpYnV0ZSgiYXJpYS1leHBhbmRlZCIsYT8idHJ1ZSI6ImZhbHNlIil9O2EuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLG4pLHQuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsZnVuY3Rpb24oZSl7IkVudGVyIiE9PWUua2V5JiYiICIhPT1lLmtleXx8KGUucHJldmVudERlZmF1bHQoKSxlLnN0b3BQcm9wYWdhdGlvbigpLG4oKSl9KX1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuYWNjLWl0ZW0iKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWUucXVlcnlTZWxlY3RvcigiLmFjYy1xIik7dC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt2YXIgYT1lLmNsYXNzTGlzdC50b2dnbGUoIm9wZW4iKTt0LnNldEF0dHJpYnV0ZSgiYXJpYS1leHBhbmRlZCIsYT8idHJ1ZSI6ImZhbHNlIil9KX0pfSgpLGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciBlPSJodHRwczovL2Nkbi54czJldmVudC5jb20vdmVudWVzL2VmOGU0ODViZDY0MTQ2MzJiYjEwYmFhMGU2ZTIzMWZlX3ZueC5zdmciLHQ9e2ZhMzQ5YWZjNTE4NjRjYWNiOTVhMzk5NTVkODJiMzc5X2N0Zzp7bmFtZToiTWFpbiBHcmFuZHN0YW5kIix0aWVyOiJncmFuZHN0YW5kIixkZXNjOiJEaXJlY3RseSBvcHBvc2l0ZSB0aGUgcGl0IGxhbmUgb24gdGhlIHN0YXJ04oCTZmluaXNoIHN0cmFpZ2h0IOKAlCB0aGUgZ3JpZCwgcGl0IHN0b3BzLCBhbmQgdGhlIHBvZGl1bSBhbGwgcGxheSBvdXQgaW4gZnJvbnQgb2YgeW91LiJ9LGQyZmZiMTczNjczYzQ5Nzg5ZTcxOWM2OTU2YzAyNjVmX2N0Zzp7bmFtZToiTWFpbiBHcmFuZHN0YW5kIFByZW1pdW0iLHRpZXI6ImdyYW5kc3RhbmQiLGRlc2M6IlByZW1pdW0gc2VhdGluZyBibG9ja3Mgb24gdGhlIG1haW4gc3RyYWlnaHQgd2l0aCBlbGV2YXRlZCBzaWdodGxpbmVzIG92ZXIgdGhlIGdyaWQgYW5kIHBpdCBsYW5lLiJ9LCI4ZmY1OGZlYWZlNzA0YmUwYmQ3MDI1YWM3ZGMyODkxMV9jdGciOntuYW1lOiJOb3J0aCBHcmFuZHN0YW5kIix0aWVyOiJncmFuZHN0YW5kIixkZXNjOiJPdmVybG9va2luZyB0aGUgaGVhdnkgYnJha2luZyB6b25lIGF0IHRoZSBlbmQgb2YgdGhlIGJhY2sgc3RyYWlnaHQg4oCUIG9uZSBvZiB0aGUgYmVzdCBvdmVydGFraW5nIHNwb3RzIG9uIHRoZSBjaXJjdWl0LiJ9LGFkMDExZDhmMzk2MzQ1N2E5ZTJiODM1MDlmOTE5OWUyX2N0Zzp7bmFtZToiTm9ydGggR3JhbmRzdGFuZCBQcmVtaXVtIix0aWVyOiJncmFuZHN0YW5kIixkZXNjOiJQcmVtaXVtIGJsb2NrcyBhYm92ZSB0aGUgTm9ydGggaGFpcnBpbiBicmFraW5nIHpvbmUsIHByaW1lIHRlcnJpdG9yeSBmb3IgbGF0ZS1yYWNlIG92ZXJ0YWtlcy4ifSxkM2NiMjU4ZDI5ZTM0MDBhYWE2MDllNzFmMmZkNDg0YV9jdGc6e25hbWU6Ik5vcnRoIFN0cmFpZ2h0Iix0aWVyOiJncmFuZHN0YW5kIixkZXNjOiJTZWF0aW5nIGFsb25nIHRoZSBydW4gZG93biB0byB0aGUgTm9ydGggY29ybmVyIGNvbXBsZXgsIHdpdGggY2FycyBhdCBmdWxsIHNwZWVkIGRpcmVjdGx5IGJlbG93LiJ9LCI2OWM2M2NiMjM3Y2E0ZjZkODQ4NWVhZjU1MGYxYjYyMF9jdGciOntuYW1lOiJOb3J0aCBTdHJhaWdodCBQcmVtaXVtIix0aWVyOiJncmFuZHN0YW5kIixkZXNjOiJQcmVtaXVtIHBvc2l0aW9ucyBvbiB0aGUgYXBwcm9hY2ggdG8gdGhlIE5vcnRoIGNvcm5lcnMuIn0sIjA5MGUxNjUyYmQyYTRmYmFiMzBjY2ZhYzk4YzZmYzNjX2N0ZyI6e25hbWU6Ildlc3QgR3JhbmRzdGFuZCIsdGllcjoiZ3JhbmRzdGFuZCIsZGVzYzoiU2V0IGFnYWluc3QgdGhlIHN3ZWVwaW5nIFdlc3Qgc2VjdGlvbiBiZW5lYXRoIHRoZSBXIEFidSBEaGFiaSBob3RlbCwgY2F0Y2hpbmcgdGhlIGNhcnMgdGhyb3VnaCB0aGUgdHdpbGlnaHQgc3dpdGNoYmFja3MuIn0sIjUwYTA1NjZmMDAzNjQyMDY5MGVmN2Q3NGQxMTYyMzg2X2N0ZyI6e25hbWU6Ildlc3QgR3JhbmRzdGFuZCBQcmVtaXVtIix0aWVyOiJncmFuZHN0YW5kIixkZXNjOiJQcmVtaXVtIGJsb2NrcyBvbiB0aGUgV2VzdCBzZWN0aW9uIHdpdGggdmlld3MgdG93YXJkcyB0aGUgaG90ZWwgYW5kIG1hcmluYS4ifSwiNjQ0NzkyMjdmN2M4NGEzYzgyNjVhMGVmNmM1N2IzOTJfY3RnIjp7bmFtZToiV2VzdCBTdHJhaWdodCIsdGllcjoiZ3JhbmRzdGFuZCIsZGVzYzoiU2VhdGluZyBhbG9uZyB0aGUgd2VzdGVybiBzdHJhaWdodCBhcyB0aGUgY2FycyBidWlsZCBzcGVlZCB0b3dhcmRzIHRoZSBmaW5hbCBzZWN0b3IuIn0sZWJhNzk3ODEzZWZhNDUyNDk1ZjE2YTZmMTg5N2RkYzNfY3RnOntuYW1lOiJTb3V0aCBHcmFuZHN0YW5kIix0aWVyOiJncmFuZHN0YW5kIixkZXNjOiJQb3NpdGlvbmVkIG92ZXIgdGhlIHNvdXRoZXJuIGNvcm5lciBzZXF1ZW5jZSwgd2l0aCBsb25nIHNpZ2h0bGluZXMgYWNyb3NzIG11bHRpcGxlIHR1cm5zLiJ9LCI3NDRiNDY5ZTEyYjc0MmIzYWRiYTA4YzIyMjBiODc1Zl9jdGciOntuYW1lOiJTb3V0aCBHcmFuZHN0YW5kIExvd2VyIix0aWVyOiJncmFuZHN0YW5kIixkZXNjOiJMb3dlci10aWVyIHNlYXRpbmcgaW4gdGhlIFNvdXRoIHN0YW5kLCBjbG9zZSB0byB0aGUgYWN0aW9uIHRocm91Z2ggdGhlIHNvdXRoZXJuIGNvcm5lcnMuIn0sIjk1NWVmOTgxZGIyODQ1NmJiMGFjZThhNDk1YWJmOThiX2N0ZyI6e25hbWU6Ik1hcmluYSBHcmFuZHN0YW5kIix0aWVyOiJncmFuZHN0YW5kIixkZXNjOiJUaGUgc2lnbmF0dXJlIFlhcyBNYXJpbmEgYmFja2Ryb3Ag4oCUIHN1cGVyeWFjaHRzIG9uIG9uZSBzaWRlLCB0aGUgY2lyY3VpdCBvbiB0aGUgb3RoZXIuIn0sIjdkY2MyNDM2ODEzNzRjYTA4Y2Q3ZDkxOWQ5YTI3NmZlX2N0ZyI6e25hbWU6Ik1haW4gQ2x1YiIsdGllcjoibG91bmdlIixkZXNjOiJDbHViIGhvc3BpdGFsaXR5IGJlaGluZCB0aGUgTWFpbiBHcmFuZHN0YW5kIHBhaXJpbmcgcHJlbWl1bSBzZWF0aW5nIHdpdGggYWxsLWRheSBsb3VuZ2UgYWNjZXNzLiJ9LGQ0MTVjODE1ZWNjZjQyODk4ZDU0ODI2ZTA0YmVkOTM3X2N0Zzp7bmFtZToiV2VzdCBDbHViIix0aWVyOiJsb3VuZ2UiLGRlc2M6IkNsdWIgaG9zcGl0YWxpdHkgb24gdGhlIFdlc3Qgc2VjdGlvbiDigJQgbG91bmdlIGFjY2VzcyB3aXRoIGdyYW5kc3RhbmQgc2VhdGluZyBvdmVyIHRoZSBzd2l0Y2hiYWNrcy4ifSxlZDE2NDhlZWM2Mjg0NGUzYjJlZjZiYmI0ZmQxYzk5NF9jdGc6e25hbWU6IlNvdXRoIENsdWIiLHRpZXI6ImxvdW5nZSIsZGVzYzoiQ2x1Yi1sZXZlbCBob3NwaXRhbGl0eSBwYWlyZWQgd2l0aCBTb3V0aCBHcmFuZHN0YW5kIHNlYXRpbmcuIn0sZjU1YjIwMjVlMzkzNDcxMTljNzNhYTMwZWJjYjU0NWJfY3RnOntuYW1lOiJDaGFtcGlvbnMgQ2x1YiIsdGllcjoibG91bmdlIixkZXNjOiJFbGV2YXRlZCBjbHViIGhvc3BpdGFsaXR5IHdpdGggcHJlbWl1bSBkaW5pbmcgYW5kIHNvbWUgb2YgdGhlIGJyb2FkZXN0IHZpZXdzIG9uIHRoZSBjaXJjdWl0LiJ9LGI4NTQxY2I4ZTI0MDRmZjk4MTJmZTgzZDMyNjI4Y2M2X2N0Zzp7bmFtZToiWWFzIExvdW5nZSBOb3J0aCIsdGllcjoibG91bmdlIixkZXNjOiJMb3VuZ2UgaG9zcGl0YWxpdHkgYWJvdmUgdGhlIE5vcnRoIHNlY3Rpb24gYnJha2luZyB6b25lLiJ9LCI2NmJlMzQ2OTlmY2U0MmQ5OTI2ZDg1NGUwYjc1ZmI3N19jdGciOntuYW1lOiJZYXMgTG91bmdlIFdlc3QiLHRpZXI6ImxvdW5nZSIsZGVzYzoiTG91bmdlIGhvc3BpdGFsaXR5IG92ZXJsb29raW5nIHRoZSBXZXN0IHNlY3Rpb24uIn0sIjg1NDA5ZDFjYzFhOTQ3OTY5NDg5ZjRjMDVjMWUzMmQ3X2N0ZyI6e25hbWU6IlRlcnJhY2UgSG9zcGl0YWxpdHkg4oCUIFR1cm4gMSIsdGllcjoibG91bmdlIixkZXNjOiJPcGVuIHRlcnJhY2UgaG9zcGl0YWxpdHkgYWJvdmUgVHVybiAxLCB3YXRjaGluZyB0aGUgZmllbGQgZnVubmVsIGluIG9uIHRoZSBvcGVuaW5nIGxhcC4ifSxhZmM2N2JkOTE0ODY0ODQ4OGMxNDgzNTNiYzY4OTdhMF9jdGc6e25hbWU6IlRlcnJhY2UgSG9zcGl0YWxpdHkg4oCUIEhhaXJwaW4iLHRpZXI6ImxvdW5nZSIsZGVzYzoiVGVycmFjZSBwb3NpdGlvbnMgb3ZlciB0aGUgaGFpcnBpbiwgdGhlIHNsb3dlc3QgYW5kIG1vc3QgZHJhbWF0aWMgY29ybmVyIG9uIHRoZSBsYXAuIn0sY2JmM2Q3NTExOTZiNDM3ZDhiM2E3ODFmMWI5ZTU1MjdfY3RnOntuYW1lOiJNYXJpbmEgTG91bmdlIix0aWVyOiJsb3VuZ2UiLGRlc2M6IkxvdW5nZSBob3NwaXRhbGl0eSBzZXQgYWdhaW5zdCB0aGUgbWFyaW5hLCBjb21iaW5pbmcgdHJhY2tzaWRlIHZpZXdzIHdpdGggdGhlIHdhdGVyZnJvbnQgc2V0dGluZy4ifSxkZGE0NzRlNTdjNzI0YmY3OTYwNmE2YmEzMmQyNjJkMl9jdGc6e25hbWU6IlN1bnNldCBMb3VuZ2UiLHRpZXI6ImxvdW5nZSIsZGVzYzoiV2VzdC1mYWNpbmcgbG91bmdlIGJ1aWx0IGFyb3VuZCB0aGUgdHdpbGlnaHQtaW50by1uaWdodCBjaGFyYWN0ZXIgb2YgdGhlIHJhY2UuIn0sIjRhMTJiZGU0MmI2NTQ0NDE5OGY5NDcxZGVjMWM4NDY0X2N0ZyI6e25hbWU6IlRoZSBEZWNrIEAgTmluZSIsdGllcjoibG91bmdlIixkZXNjOiJUZXJyYWNlIGhvc3BpdGFsaXR5IHBvc2l0aW9uZWQgb3ZlciB0aGUgVHVybiA5IGNvbXBsZXguIn0sIjI5M2JjYzIwZjE4OTRkMzFhYjBiNTU2YmE0NTA0MjRhX2N0ZyI6e25hbWU6Ik1hcmluYSDigJQgVmVsb2NpdHkgRXhwZXJpZW5jZSIsdGllcjoibG91bmdlIixkZXNjOiJNYXJpbmEtc2lkZSBob3NwaXRhbGl0eSBleHBlcmllbmNlIHdpdGggcHJlbWl1bSB2aWV3aW5nIGFjcm9zcyB0aGUgY2lyY3VpdCBiYXNpbi4ifSxjYWJlZWEyNmJjNTg0YTVkYjMwNjY0Y2NjNGZjYTRiYV9jdGc6e25hbWU6IllhcyBTdWl0ZSDigJQgTWFpbiIsdGllcjoic3VpdGUiLGRlc2M6IlByaXZhdGUgc3VpdGUgaG9zcGl0YWxpdHkgYWJvdmUgdGhlIG1haW4gc3RyYWlnaHQsIHdpdGggdGhlIGdyaWQgYW5kIHBpdCBsYW5lIGxhaWQgb3V0IGJlbG93LiJ9LGYyMmRlY2EzZDQzNzQ2MTRiMzI0YTA4YzQ1ODA4YmQwX2N0Zzp7bmFtZToiWWFzIFN1aXRlIOKAlCBNYWluIFByZW1pdW0iLHRpZXI6InN1aXRlIixkZXNjOiJUaGUgcHJlbWl1bSB0aWVyIG9mIE1haW4gc3VpdGVzLCBkaXJlY3RseSBvdmVyIHRoZSBzdGFydOKAk2ZpbmlzaCBsaW5lLiJ9LCI0MTVkZmViM2JmNzE0YTNmOGVjYzg3MmI3Y2ViODJlZV9jdGciOntuYW1lOiJZYXMgU3VpdGUg4oCUIFdlc3QiLHRpZXI6InN1aXRlIixkZXNjOiJQcml2YXRlIHN1aXRlcyBvbiB0aGUgV2VzdCBzZWN0aW9uIHdpdGggaG90ZWwgYW5kIG1hcmluYSB2aWV3cy4ifSwiNDA1ZGQzZmVlZDc1NGMzYjhmYjdkNWRiZTAwNzJhMTBfY3RnIjp7bmFtZToiWWFzIFN1aXRlIOKAlCBXZXN0IFByZW1pdW0iLHRpZXI6InN1aXRlIixkZXNjOiJQcmVtaXVtIFdlc3Qgc3VpdGVzIG92ZXIgdGhlIHN3aXRjaGJhY2sgc2VxdWVuY2UuIn0sIjZmNTMzMzk2ODJhZjQ1NTFiZWZlYTg3MzRkZmE2MTJiX2N0ZyI6e25hbWU6IllhcyBTdWl0ZSDigJQgTm9ydGgiLHRpZXI6InN1aXRlIixkZXNjOiJQcml2YXRlIHN1aXRlcyBhYm92ZSB0aGUgTm9ydGggYnJha2luZyB6b25lLiJ9LCI3ODQzODM1MDgwNDM0NDdkOTNjMjViZGNhNWJhOTE5NF9jdGciOntuYW1lOiJZYXMgU3VpdGUg4oCUIE5vcnRoIFByZW1pdW0iLHRpZXI6InN1aXRlIixkZXNjOiJQcmVtaXVtIE5vcnRoIHN1aXRlcyBvdmVyIHRoZSBjaXJjdWl04oCZcyBiZXN0IG92ZXJ0YWtpbmcgcG9pbnQuIn0sYjVjZDZhMDY2YjFiNDBmNzk1ODA0MTlkOTI2Njg3NThfY3RnOntuYW1lOiJNYXJzYSBTdWl0ZXMiLHRpZXI6InN1aXRlIixkZXNjOiJTdWl0ZSBob3NwaXRhbGl0eSBvbiB0aGUgbWFyaW5hIHNpZGUgb2YgdGhlIGNpcmN1aXQuIn0sYWJkMGYxMzQ3YjIzNDNjNGEzNWQ4YjNiMDU5ZTNmYjBfY3RnOntuYW1lOiJNYXJzYSBCb3hlcyIsdGllcjoic3VpdGUiLGRlc2M6IlByaXZhdGUgYm94ZXMgd2l0aCBtYXJpbmEtc2lkZSBwb3NpdGlvbmluZy4ifSwiOGYyYzgxZDhlNDY2NDk5MGJkMWZjYjA1MGQ5OWU3NTVfY3RnIjp7bmFtZToiTWFyaW5hIFZpZXdzIFN1aXRlIix0aWVyOiJzdWl0ZSIsZGVzYzoiU3VpdGUgaG9zcGl0YWxpdHkgbG9va2luZyBhY3Jvc3MgdGhlIG1hcmluYSBiYXNpbiB0byB0aGUgY2lyY3VpdC4ifSwiNzE3NzhhNDk0YTk3NGMxZjkxMzRmMGY2MzE4NTA3MWNfY3RnIjp7bmFtZToiVHVybiAxIEhvc3BpdGFsaXR5IFN1aXRlIix0aWVyOiJzdWl0ZSIsZGVzYzoiU3VpdGUgcG9zaXRpb25zIGRpcmVjdGx5IGFib3ZlIFR1cm4gMS4ifSwiOGJkZGU5YzFjZmFjNGVhYmExYTE0NDUzNDllNDhiMjNfY3RnIjp7bmFtZToiWWFzIFlhY2h0Iix0aWVyOiJzdWl0ZSIsZGVzYzoiSG9zcGl0YWxpdHkgaG9zdGVkIGFib2FyZCBhIHlhY2h0IGJlcnRoZWQgaW4gWWFzIE1hcmluYSDigJQgdGhlIG1vc3QgZGlzdGluY3RpdmUgc2V0dGluZyBvbiB0aGUgY2lyY3VpdC4ifSxiZDdhOTQ4YTRlNjI0MWFjYTZlY2M5ZmY1N2Q4YzBmN19jdGc6e25hbWU6IkFidSBEaGFiaSBIaWxsIix0aWVyOiJnYSIsZGVzYzoiVGhlIGdyYXNzIGhpbGwgaW5zaWRlIHRoZSBOb3J0aCBzZWN0aW9uIOKAlCBnZW5lcmFsIGFkbWlzc2lvbiB3aXRoIGEgZmVzdGl2YWwgYXRtb3NwaGVyZSBhbmQgY2xlYXIgdHJhY2sgdmlld3MuIn19LGE9e2ZhMzQ5YWZjNTE4NjRjYWNiOTVhMzk5NTVkODJiMzc5X2N0Zzp7ZnJvbTo2MTAwLHN0b2NrOiJpbiIsdXJsOiJodHRwczovL3d3dy5lcy1zcG9ydC5hZS9wcm9kdWN0L2YxLWFidS1kaGFiaS1tYWluLWdyYW5kc3RhbmQtdGlja2V0LyIsc3VtOiJIZWFydCBvZiB0aGUgR3JhbmQgUHJpeCDigJQgc3RhcnRpbmcgZ3JpZCwgcGl0IHN0b3BzLCBmaW5pc2gtbGluZSBkcmFtYSBhbmQgdGhlIHBvZGl1bSBkaXJlY3RseSBpbiBmcm9udCBvZiB5b3UuIix0aXA6IlRJUCAvLyBCUklORyBIRUFEUEhPTkVTIEZPUiBZT1VORyBGQU5TIOKAlCBHUklELVNJREUgTk9JU0UgUEVBS1MgSEVSRS4iLGluYzpbIkYxwq4gRmFuem9uZSArIGFsbCBPYXNpcyBhcmVhcyIsIkFmdGVyLVJhY2UgQ29uY2VydHMgYXQgRXRpaGFkIFBhcmsgKEdBKSIsIjEtZGF5IFlhcyB0aGVtZS1wYXJrIGFjY2VzcyIsIkVudHJ5IHRvIHNlbGVjdGVkIG11c2V1bXMiXSxpZGVhbDpbIlN0YXJ0LXRvLWZpbmlzaCBkcmFtYSIsIkZpcnN0LXRpbWVycyIsIkNlbnRyYWwgcmFjZSB2aWV3cyJdLG5vdGU6Ik1hbmRhdG9yeSAyLW5pZ2h0IEFidSBEaGFiaSBob3RlbCBzdGF5IOKAlCBhZGRlZCBhdCB0aGUgbmV4dCBzdGVwOyBwcmljZSBzaG93biBpcyB0aWNrZXQgb25seS4ifSwiOGZmNThmZWFmZTcwNGJlMGJkNzAyNWFjN2RjMjg5MTFfY3RnIjp7ZnJvbTo1MTAwLHN0b2NrOiJpbiIsdXJsOiJodHRwczovL3d3dy5lcy1zcG9ydC5hZS9wcm9kdWN0L25vcnRoLWdyYW5kc3RhbmQvIixzdW06IlJpZ2h0IGJ5IHRoZSBUdXJuIDUgYnJha2luZyB6b25lIOKAlCBoYXJkIGJyYWtpbmcsIHBvc2l0aW9uIGJhdHRsZXMsIHRoZW4gdGhlIGxhdW5jaCBvbnRvIHRoZSBsb25nZXN0IHN0cmFpZ2h0LiIsdGlwOiJUSVAgLy8gSEVBRFBIT05FUyBBRFZJU0VEIOKAlCBFTkdJTkUgTk9JU0UgUEVBS1MgT05UTyBUSEUgU1RSQUlHSFQuIixpbmM6WyJGMcKuIEZhbnpvbmUgKyBhbGwgT2FzaXMgYXJlYXMiLCJBZnRlci1SYWNlIENvbmNlcnRzIGF0IEV0aWhhZCBQYXJrIChHQSkiLCIxLWRheSBZYXMgdGhlbWUtcGFyayBhY2Nlc3MiLCJFbnRyeSB0byBzZWxlY3RlZCBtdXNldW1zIl0saWRlYWw6WyJUZWNobmljYWwgY29ybmVyaW5nIiwiQnJha2luZyArIG92ZXJ0YWtlcyIsIk5lYXIgRXRpaGFkIFBhcmsgY29uY2VydHMiXX0sZDNjYjI1OGQyOWUzNDAwYWFhNjA5ZTcxZjJmZDQ4NGFfY3RnOntmcm9tOjM3MDAsc3RvY2s6ImluIix1cmw6Imh0dHBzOi8vd3d3LmVzLXNwb3J0LmFlL3Byb2R1Y3Qvbm9ydGgtc3RyYWlnaHQvIixzdW06IkJlc2lkZSB0aGUgbG9uZ2VzdCBzdHJhaWdodCDigJQgY2FycyBhdCBtYXhpbXVtIHZlbG9jaXR5IG1ha2luZyBkZWNpc2l2ZSBvdmVydGFraW5nIG1vdmVzLiIsdGlwOiJUSVAgLy8gV0FUQ0ggRk9SIFNQQVJLUyBBUyBDQVJTIFJJREUgVEhFIEtFUkJTIEFUIEZVTEwgU1BFRUQuIixpbmM6WyJGMcKuIEZhbnpvbmUgKyBhbGwgT2FzaXMgYXJlYXMiLCJBZnRlci1SYWNlIENvbmNlcnRzIGF0IEV0aWhhZCBQYXJrIChHQSkiLCIxLWRheSBZYXMgdGhlbWUtcGFyayBhY2Nlc3MiLCJFbnRyeSB0byBzZWxlY3RlZCBtdXNldW1zIl0saWRlYWw6WyJTdHJhaWdodC1saW5lIHNwZWVkIiwiRnVsbC10aHJvdHRsZSBvdmVydGFrZXMiLCJDb25jZXJ0IHByb3hpbWl0eSJdfSwiMDkwZTE2NTJiZDJhNGZiYWIzMGNjZmFjOThjNmZjM2NfY3RnIjp7ZnJvbTo1MjAwLHN0b2NrOiJpbiIsdXJsOiJodHRwczovL3d3dy5lcy1zcG9ydC5hZS9wcm9kdWN0L3dlc3QtZ3JhbmRzdGFuZC8iLHN1bToiVHJhY2tzaWRlIG9uIHRoZSBsb25nZXN0IHN0cmFpZ2h0IOKAlCB0b3Agc3BlZWQgYmVmb3JlIHRoZSBoZWF2eSBicmFraW5nIHBvaW50IGludG8gVHVybnMgNuKAkzcuIix0aXA6IlRJUCAvLyBUSEUgQklHIE1PVkVTIExBTkQgQVQgVEhFIFQ24oCTVDcgQlJBS0lORyBQT0lOVCwgRElSRUNUTFkgSU4gVklFVy4iLGluYzpbIkYxwq4gRmFuem9uZSArIGFsbCBPYXNpcyBhcmVhcyIsIkFmdGVyLVJhY2UgQ29uY2VydHMgYXQgRXRpaGFkIFBhcmsgKEdBKSIsIjEtZGF5IFlhcyB0aGVtZS1wYXJrIGFjY2VzcyIsIkVudHJ5IHRvIHNlbGVjdGVkIG11c2V1bXMiXSxpZGVhbDpbIlB1cmUgc3BlZWQgem9uZXMiLCJPdmVydGFraW5nIGFjdGlvbiIsIk1heGltdW0gcGFjZSJdfSwiNjQ0NzkyMjdmN2M4NGEzYzgyNjVhMGVmNmM1N2IzOTJfY3RnIjp7ZnJvbTozNDUwLHN0b2NrOiJpbiIsdXJsOiJodHRwczovL3d3dy5lcy1zcG9ydC5hZS9wcm9kdWN0L3dlc3Qtc3RyYWlnaHQvIixzdW06IkFsb25nIHRoZSBydW4gdG8gVHVybnMgNuKAkzcg4oCUIHByZWNpc2lvbiBkcml2aW5nIGFuZCB3aGVlbC10by13aGVlbCByYWNpbmcgYXQgc3BlZWQuIix0aXA6IlRJUCAvLyBUUkFDSyBUSEUgQlJBS0lORyBNQVJLRVJTIOKAlCBBUEVYIFBSRUNJU0lPTiBBVCBUVVJOIDYuIixpbmM6WyJGMcKuIEZhbnpvbmUgKyBhbGwgT2FzaXMgYXJlYXMiLCJBZnRlci1SYWNlIENvbmNlcnRzIGF0IEV0aWhhZCBQYXJrIChHQSkiLCIxLWRheSBZYXMgdGhlbWUtcGFyayBhY2Nlc3MiLCJFbnRyeSB0byBzZWxlY3RlZCBtdXNldW1zIl0saWRlYWw6WyJMYXRlLWJyYWtpbmcgYWN0aW9uIiwiSGlnaC1zcGVlZCBvdmVydGFrZXMiLCJXaGVlbC10by13aGVlbCByYWNpbmciXX0sZGRhNDc0ZTU3YzcyNGJmNzk2MDZhNmJhMzJkMjYyZDJfY3RnOntmcm9tOjEyMzk1LHN0b2NrOiJpbiIsdXJsOiJodHRwczovL3d3dy5lcy1zcG9ydC5hZS9wcm9kdWN0L3N1bnNldC1sb3VuZ2UvIixzdW06IkluZG9vciBsb3VuZ2UgYW5kIHRlcnJhY2Ugb3ZlciBUdXJuIDUg4oCUIHJhY2luZyBieSBkYXksIERKLWxlZCBsb3VuZ2UgZW5lcmd5IGFzIHRoZSBzdW4gZHJvcHMuIix0aXA6IlRJUCAvLyBURVJSQUNFIEFUIExBVEUgQUZURVJOT09OIEZPUiBTVU5TRVQgU0hPVFMgT1ZFUiBUSEUgQ0lSQ1VJVC4iLGluYzpbIkxpdmUgY29va2luZyBzdGF0aW9ucyArIGZyZWUtZmxvd2luZyBiZXZlcmFnZXMiLCJJbmRvb3IgbG91bmdlICsgc3Vuc2V0IHRlcnJhY2UiLCJESi1sZWQgZW50ZXJ0YWlubWVudCIsIkYxwq4gRmFuem9uZSArIGFsbCBPYXNpcyBhcmVhcyIsIkFmdGVyLVJhY2UgQ29uY2VydHMgYXQgRXRpaGFkIFBhcmsgKEdBKSIsIjEtZGF5IFlhcyB0aGVtZS1wYXJrIGFjY2VzcyIsIkVudHJ5IHRvIHNlbGVjdGVkIG11c2V1bXMiXSxpZGVhbDpbIlJhY2luZyB3aXRoIGEgcGFydHkgdmliZSIsIlN1bnNldCArIHNvY2lhbCBlbmVyZ3kiLCJNdXNpYy1sZWQgaG9zcGl0YWxpdHkiXX0sYmQ3YTk0OGE0ZTYyNDFhY2E2ZWNjOWZmNTdkOGMwZjdfY3RnOntmcm9tOjE4MDAsc3RvY2s6ImluIix1cmw6Imh0dHBzOi8vd3d3LmVzLXNwb3J0LmFlL3Byb2R1Y3QvZjEtYWJ1LWRoYWJpLWhpbGwtdGlja2V0LyIsc3VtOiJMYWlkLWJhY2sgb3Blbi1haXIgdmlld2luZyBhY3Jvc3MgVHVybnMgMuKAkzYsIHdpdGggdGhlIGZyZWVkb20gdG8gcm9hbSBiZXR3ZWVuIHZhbnRhZ2UgcG9pbnRzLiIsdGlwOiJUSVAgLy8gQVJSSVZFIEVBUkxZIOKAlCBUSEUgQkVTVCBTUE9UUyBPTiBUSEUgSElMTCBHTyBGSVJTVC4iLGluYzpbIkYxwq4gRmFuem9uZSArIGFsbCBPYXNpcyBhcmVhcyIsIkFmdGVyLVJhY2UgQ29uY2VydHMgYXQgRXRpaGFkIFBhcmsgKEdBKSIsIjEtZGF5IFlhcyB0aGVtZS1wYXJrIGFjY2VzcyIsIkVudHJ5IHRvIHNlbGVjdGVkIG11c2V1bXMiXSxpZGVhbDpbIlJlbGF4ZWQgb3V0ZG9vciB2aWV3aW5nIiwiUGFub3JhbWljIG11bHRpLXR1cm4gdmlld3MiLCJGYW1pbHkgcGljbmljIHN0eWxlIl0sbm90ZToiTWFuZGF0b3J5IDItbmlnaHQgQWJ1IERoYWJpIGhvdGVsIHN0YXkgYXBwbGllcyB0byBIaWxsIHRpY2tldHMuIn19LG49e2ZhMzQ5YWZjNTE4NjRjYWNiOTVhMzk5NTVkODJiMzc5X2N0Zzpbe3NyYzoiMjAyNi8wNy9NQUlOLUdTLTEucG5nIixjYXA6Ik1haW4gR3JhbmRzdGFuZCJ9LHtzcmM6IjIwMjYvMDcvMzEyOTktbWFpbl9ncmFuZHN0YW5kX3lhc19tYXJpbmEtN2ZmZWJmYzIwYTk1NTg0YTlkZGViODgxMTliZDQ4YmYtMS5qcGciLGNhcDoiR3JpZCBWaWV3In0se2Q6Imh0dHBzOi8vd3d3LmVzLXNwb3J0LmFlL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzA4L2VzcC1mMS0wNS5qcGciLGNhcDoiUGFub3JhbWljIHZpZXcgb3ZlciB0aGUgc3RhcnQvZmluaXNoIHN0cmFpZ2h0In1dLCI4ZmY1OGZlYWZlNzA0YmUwYmQ3MDI1YWM3ZGMyODkxMV9jdGciOlt7c3JjOiIyMDI2LzA3L25vcnRoLWdyYW5kc3RhbmQtOTczMzEuanBnIixjYXA6Ik5vcnRoIEdyYW5kc3RhbmQifV0sIjA5MGUxNjUyYmQyYTRmYmFiMzBjY2ZhYzk4YzZmYzNjX2N0ZyI6W3tzcmM6IjIwMjQvMDkvd2VzdC1ncmFuZHN0YW5kLTEucG5nIixjYXA6Ildlc3QgR3JhbmRzdGFuZCJ9LHtkOiJodHRwczovL3d3dy5lcy1zcG9ydC5hZS93cC1jb250ZW50L3VwbG9hZHMvMjAyNi8wOC9lc3AtZjEtMDYuanBnIixjYXA6IlRyYWNrc2lkZSB2aWV3In1dLGJkN2E5NDhhNGU2MjQxYWNhNmVjYzlmZjU3ZDhjMGY3X2N0Zzpbe2Q6Imh0dHBzOi8vd3d3LmVzLXNwb3J0LmFlL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzA4L2VzcC1mMS0wMS5qcGciLGNhcDoiR2VuZXJhbCBhZG1pc3Npb24gbGF3biJ9XSxkZGE0NzRlNTdjNzI0YmY3OTYwNmE2YmEzMmQyNjJkMl9jdGc6W3tkOiJodHRwczovL2Nkbi5lcy1zcG9ydC5hZS93cC1jb250ZW50L3VwbG9hZHMvMjAyNi8xMC9zdW5zZXQtbG91bmdlLWNvbGxhZ2UuanBnIixjYXA6IlN1bnNldCBMb3VuZ2UifSx7c3JjOiIyMDI1LzA1L3RhYl8yX2ltYWdlLTEuanBnIixjYXA6IlN1bnNldCBUZXJyYWNlIn1dLCI2NDQ3OTIyN2Y3Yzg0YTNjODI2NWEwZWY2YzU3YjM5Ml9jdGciOlt7c3JjOiIyMDI0LzA5L3dlc3Qtc3RyYWlnaHQucG5nIixjYXA6Ildlc3QgU3RyYWlnaHQifSx7ZDoiaHR0cHM6Ly93d3cuZXMtc3BvcnQuYWUvd3AtY29udGVudC91cGxvYWRzLzIwMjYvMDgvZXNwLWYxLTA0LmpwZyIsY2FwOiJVbmRlciB0aGUgbGlnaHRzIn1dLGViYTc5NzgxM2VmYTQ1MjQ5NWYxNmE2ZjE4OTdkZGMzX2N0Zzpbe3NyYzoiMjAyNC8wOS93ZXN0LWdyYW5kc3RhbmQucG5nIixjYXA6IlNvdXRoIEdyYW5kc3RhbmQifSx7ZDoiaHR0cHM6Ly93d3cuZXMtc3BvcnQuYWUvd3AtY29udGVudC91cGxvYWRzLzIwMjYvMDgvZXNwLWYxLTA4LmpwZyIsY2FwOiJUcmFja3NpZGUgdmlldyJ9XSwiNTBhMDU2NmYwMDM2NDIwNjkwZWY3ZDc0ZDExNjIzODZfY3RnIjpbe3NyYzoiMjAyNC8wOS93ZXN0LWdyYW5kc3RhbmQtcHJlbWl1bS12aWV3MS5hdmlmIixjYXA6IlByZW1pdW0gVmlldyJ9XSwiOTU1ZWY5ODFkYjI4NDU2YmIwYWNlOGE0OTVhYmY5OGJfY3RnIjpbe3NyYzoiMjAyNC8wOS9ZYXMtTWFyaW5hLUNpcmN1aXQtMDA3LXNjYWxlZC5qcGciLGNhcDoiWWFzIE1hcmluYSJ9XSxjYWJlZWEyNmJjNTg0YTVkYjMwNjY0Y2NjNGZjYTRiYV9jdGc6W3tkOiJodHRwczovL3d3dy5lcy1zcG9ydC5hZS93cC1jb250ZW50L3VwbG9hZHMvMjAyNi8wOC9lc3AtZjEtMTEuanBnIixjYXA6IlRyYWNrc2lkZSB2aWV3In0se2Q6Imh0dHBzOi8vd3d3LmVzLXNwb3J0LmFlL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzA4L2VzcC1mMS0xMi5qcGciLGNhcDoiU3VpdGUgaW50ZXJpb3IifSx7ZDoiaHR0cHM6Ly93d3cuZXMtc3BvcnQuYWUvd3AtY29udGVudC91cGxvYWRzLzIwMjYvMDgvZXNwLWYxLTEzLmpwZyIsY2FwOiJTaGFtcyBTdWl0ZSJ9LHtkOiJodHRwczovL3d3dy5lcy1zcG9ydC5hZS93cC1jb250ZW50L3VwbG9hZHMvMjAyNi8wOC9lc3AtZjEtMTQuanBnIixjYXA6IlNoYW1zIFN1aXRlIn0se2Q6Imh0dHBzOi8vd3d3LmVzLXNwb3J0LmFlL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzA4L2VzcC1mMS0xNS5qcGciLGNhcDoiU2hhbXMgU3VpdGUifV0sIjQwNWRkM2ZlZWQ3NTRjM2I4ZmI3ZDVkYmUwMDcyYTEwX2N0ZyI6W3tkOiJodHRwczovL3d3dy5lcy1zcG9ydC5hZS93cC1jb250ZW50L3VwbG9hZHMvMjAyNi8wOC9lc3AtZjEtMTIuanBnIixjYXA6IlByZW1pdW0gc3VpdGUifV0sIjQxNWRmZWIzYmY3MTRhM2Y4ZWNjODcyYjdjZWI4MmVlX2N0ZyI6W3tkOiJodHRwczovL3d3dy5lcy1zcG9ydC5hZS93cC1jb250ZW50L3VwbG9hZHMvMjAyNi8wOC9lc3AtZjEtMTYuanBnIixjYXA6IlRyYWNrc2lkZSB2aWV3In0se2Q6Imh0dHBzOi8vd3d3LmVzLXNwb3J0LmFlL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzA4L2VzcC1mMS0xNy5qcGciLGNhcDoiU3VpdGUgaW50ZXJpb3IifV0sIjZmNTMzMzk2ODJhZjQ1NTFiZWZlYTg3MzRkZmE2MTJiX2N0ZyI6W3tkOiJodHRwczovL3d3dy5lcy1zcG9ydC5hZS93cC1jb250ZW50L3VwbG9hZHMvMjAyNi8wOC9lc3AtZjEtMTguanBnIixjYXA6IlRyYWNrc2lkZSB2aWV3In0se2Q6Imh0dHBzOi8vd3d3LmVzLXNwb3J0LmFlL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzA4L2VzcC1mMS0xOS5qcGciLGNhcDoiVGVycmFjZSJ9LHtkOiJodHRwczovL3d3dy5lcy1zcG9ydC5hZS93cC1jb250ZW50L3VwbG9hZHMvMjAyNi8wOC9lc3AtZjEtMjAuanBnIixjYXA6IlN1aXRlIGludGVyaW9yIn1dLCI2NmJlMzQ2OTlmY2U0MmQ5OTI2ZDg1NGUwYjc1ZmI3N19jdGciOlt7ZDoiaHR0cHM6Ly93d3cuZXMtc3BvcnQuYWUvd3AtY29udGVudC91cGxvYWRzLzIwMjYvMDgvZXNwLWYxLTIxLmpwZyIsY2FwOiJMb3VuZ2UgYW5kIHRlcnJhY2UifV0sYjg1NDFjYjhlMjQwNGZmOTgxMmZlODNkMzI2MjhjYzZfY3RnOlt7ZDoiaHR0cHM6Ly93d3cuZXMtc3BvcnQuYWUvd3AtY29udGVudC91cGxvYWRzLzIwMjYvMDgvZXNwLWYxLTIyLmpwZyIsY2FwOiJMb3VuZ2UgYW5kIHRlcnJhY2UifV0sZDNjYjI1OGQyOWUzNDAwYWFhNjA5ZTcxZjJmZDQ4NGFfY3RnOlt7ZDoiaHR0cHM6Ly93d3cuZXMtc3BvcnQuYWUvd3AtY29udGVudC91cGxvYWRzLzIwMjYvMDgvZXNwLWYxLTIzLmpwZyIsY2FwOiJBZXJpYWwgb3ZlciB0aGUgYnJha2luZyB6b25lIn0se2Q6Imh0dHBzOi8vd3d3LmVzLXNwb3J0LmFlL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzA4L2VzcC1mMS0yNC5qcGciLGNhcDoiQWVyaWFsIn1dLCI4NTQwOWQxY2MxYTk0Nzk2OTQ4OWY0YzA1YzFlMzJkN19jdGciOlt7ZDoiaHR0cHM6Ly93d3cuZXMtc3BvcnQuYWUvd3AtY29udGVudC91cGxvYWRzLzIwMjYvMDgvZXNwLWYxLTI1LmpwZyIsY2FwOiJUcmFja3NpZGUifSx7ZDoiaHR0cHM6Ly93d3cuZXMtc3BvcnQuYWUvd3AtY29udGVudC91cGxvYWRzLzIwMjYvMDgvZXNwLWYxLTI2LmpwZyIsY2FwOiJEZWNrIn1dLGFmYzY3YmQ5MTQ4NjQ4NDg4YzE0ODM1M2JjNjg5N2EwX2N0Zzpbe2Q6Imh0dHBzOi8vd3d3LmVzLXNwb3J0LmFlL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzA4L2VzcC1mMS0yNy5qcGciLGNhcDoiVHJhY2tzaWRlIn0se2Q6Imh0dHBzOi8vd3d3LmVzLXNwb3J0LmFlL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzA4L2VzcC1mMS0yOC5qcGciLGNhcDoiRGVjayJ9XSxmNTViMjAyNWUzOTM0NzExOWM3M2FhMzBlYmNiNTQ1Yl9jdGc6W3tkOiJodHRwczovL3d3dy5lcy1zcG9ydC5hZS93cC1jb250ZW50L3VwbG9hZHMvMjAyNi8wOC9lc3AtZjEtMjkuanBnIixjYXA6IkludGVyaW9yIn0se2Q6Imh0dHBzOi8vd3d3LmVzLXNwb3J0LmFlL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzA4L2VzcC1mMS0yNC5qcGciLGNhcDoiQWVyaWFsIn1dfSxpPXtiZDdhOTQ4YTRlNjI0MWFjYTZlY2M5ZmY1N2Q4YzBmN19jdGc6Im91dGxpbmUifSxvPXtncmFuZHN0YW5kOiJHcmFuZHN0YW5kIixsb3VuZ2U6IkxvdW5nZSAmIFRlcnJhY2UiLHN1aXRlOiJTdWl0ZSIsZ2E6IkdlbmVyYWwgQWRtaXNzaW9uIn0sYz17Z3JhbmRzdGFuZDoiR1JEIixsb3VuZ2U6IkxORyIsc3VpdGU6IlNURSIsZ2E6IkdBIn0scj0iaHR0cHM6Ly93d3cuZXMtc3BvcnQuYWUvd3AtY29udGVudC91cGxvYWRzLyIscz1bImZhMzQ5YWZjNTE4NjRjYWNiOTVhMzk5NTVkODJiMzc5X2N0ZyIsIjk1NWVmOTgxZGIyODQ1NmJiMGFjZThhNDk1YWJmOThiX2N0ZyIsImJkN2E5NDhhNGU2MjQxYWNhNmVjYzlmZjU3ZDhjMGY3X2N0ZyIsImYyMmRlY2EzZDQzNzQ2MTRiMzI0YTA4YzQ1ODA4YmQwX2N0ZyIsImFhMWFhMDc3MzNjOTRlMWI4OTdmZTAyNTQxMDZiYTk4X2N0ZyJdLGQ9ZnVuY3Rpb24oZSl7cmV0dXJuIkFFRCAiK2UudG9Mb2NhbGVTdHJpbmcoImVuLVVTIil9LGw9d2luZG93Lm1hdGNoTWVkaWEmJndpbmRvdy5tYXRjaE1lZGlhKCIocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKSIpLm1hdGNoZXMsdT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLHA9LyhbMC05YS1mXXszMn1fY3RnKS9nLGY9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm1hcFdyYXAiKSxoPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJtYXBTdGF0dXMiKTtpZihmKXt2YXIgbT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgienBUaWVyIiksZz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgienBDb2RlIiksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgienBUaXRsZSIpLHY9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInpwRGVzYyIpLHk9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInpwTWVkaWEiKSx3PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ6cFNob3RzIiksRT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgienBQa2ciKSxTPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ6cFN0b2NrIiksTD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgienBQcmljZSIpLGs9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInpwU3VtIikseD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgienBUaXAiKSxBPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ6cEluYyIpLFQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInpwSWRlYWwiKSxDPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ6cE5vdGUiKSxJPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ6cEN0YUJvb2siKSxCPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ6cEN0YUVucXVpcmUiKSxNPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ6cFF1aWNrTGlua3MiKSxob3RlbEN0YT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJbZGF0YS1lcy1ob3RlbC1jdGFdIiksXz1udWxsLFA9bnVsbCxOPW51bGw7IWZ1bmN0aW9uKCl7dmFyIGU9e307T2JqZWN0LmtleXModCkuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgbj10W2FdO2Vbbi50aWVyXT0oZVtuLnRpZXJdfHwwKSsxLG4uY29kZT0oY1tuLnRpZXJdfHwiWk4iKSsiLSIrU3RyaW5nKGVbbi50aWVyXSkucGFkU3RhcnQoMiwiMCIpfSk7dmFyIGE9T2JqZWN0LmtleXModCkubGVuZ3RoO2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIiNtYXBGaWx0ZXJzIFtkYXRhLWNvdW50XSIpLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIG49dC5kYXRhc2V0LmNvdW50O3QudGV4dENvbnRlbnQ9U3RyaW5nKCJhbGwiPT09bj9hOmVbbl18fDApLnBhZFN0YXJ0KDIsIjAiKX0pfSgpLHkucXVlcnlTZWxlY3RvcigiLnByZXYiKS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt3LnNjcm9sbEJ5KHtsZWZ0Oi13LmNsaWVudFdpZHRoLGJlaGF2aW9yOmw/ImF1dG8iOiJzbW9vdGgifSl9KSx5LnF1ZXJ5U2VsZWN0b3IoIi5uZXh0IikuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dy5zY3JvbGxCeSh7bGVmdDp3LmNsaWVudFdpZHRoLGJlaGF2aW9yOmw/ImF1dG8iOiJzbW9vdGgifSl9KSxzLmZvckVhY2goZnVuY3Rpb24oZSl7aWYodFtlXSl7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnV0dG9uIik7YS50eXBlPSJidXR0b24iLGEudGV4dENvbnRlbnQ9dFtlXS5uYW1lLGEuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dmFyIGE9TiYmTi5xdWVyeVNlbGVjdG9yKCdbZGF0YS1lcy1pZD0iJytlKyciXScpO0soT2JqZWN0LmFzc2lnbih7aWQ6ZX0sdFtlXSksYXx8bnVsbCl9KSxNLmFwcGVuZENoaWxkKGEpfX0pLGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5waWNrLWNhcmRbZGF0YS16b25lXSIpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt2YXIgYT1lLmRhdGFzZXQuem9uZS50b0xvd2VyQ2FzZSgpLG49bnVsbDtpZihPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGZ1bmN0aW9uKGUpe258fDA9PT10W2VdLm5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKGEpJiYobj1lKX0pLG4pe3ZhciBpPU4mJk4ucXVlcnlTZWxlY3RvcignW2RhdGEtZXMtaWQ9IicrbisnIl0nKTtLKE9iamVjdC5hc3NpZ24oe2lkOm59LHRbbl0pLGl8fG51bGwpLGYuc2Nyb2xsSW50b1ZpZXcoe2JlaGF2aW9yOmw/ImF1dG8iOiJzbW9vdGgiLGJsb2NrOiJjZW50ZXIifSl9fSl9KSxkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIjbWFwRmlsdGVycyAubWFwLWNoaXAiKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiI21hcEZpbHRlcnMgLm1hcC1jaGlwIikuZm9yRWFjaChmdW5jdGlvbihlKXtlLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpfSksZS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKTt2YXIgdD1lLmRhdGFzZXQudGllcjtmLnF1ZXJ5U2VsZWN0b3JBbGwoIi5lcy16b25lIikuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgYT1XKGUpO2UuY2xhc3NMaXN0LnRvZ2dsZSgiZXMtZGltIiwiYWxsIiE9PXQmJighYXx8YS50aWVyIT09dCkpfSksUCYmXyYmKFAuc3R5bGUuZGlzcGxheT1fLmNsYXNzTGlzdC5jb250YWlucygiZXMtZGltIik/Im5vbmUiOiIiKX0pfSk7dmFyIHE9bnVsbCxPPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ6b25lUGFuZWwiKSxSPU8ucGFyZW50RWxlbWVudDsiUmVzaXplT2JzZXJ2ZXIiaW4gd2luZG93P25ldyBSZXNpemVPYnNlcnZlcihaKS5vYnNlcnZlKGYpOndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLFopO3ZhciB6PXdpbmRvdy5tYXRjaE1lZGlhKCIobWF4LXdpZHRoOiA5ODBweCkiKSxIPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ6b25lTW9kYWwiKSxqPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ6bUhvc3QiKSxHPW51bGw7SC5xdWVyeVNlbGVjdG9yQWxsKCJbZGF0YS1jbG9zZS16bV0iKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLFgpfSksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsZnVuY3Rpb24oZSl7IkVzY2FwZSIhPT1lLmtleXx8SC5oaWRkZW58fFgoKX0pLEkmJkkuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLFgpLEImJkIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLFgpO3ZhciBGPWZ1bmN0aW9uKCl7SC5oaWRkZW58fFgoKSxRKCl9O3ouYWRkRXZlbnRMaXN0ZW5lcj96LmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsRik6ei5hZGRMaXN0ZW5lciYmei5hZGRMaXN0ZW5lcihGKSxRKCksZnVuY3Rpb24gdCgpe2lmKCFoKXtyZXR1cm59aC5pbm5lckhUTUw9IjxzcGFuPkxvYWRpbmcgY2lyY3VpdCBnZW9tZXRyeTwvc3Bhbj4iLGZldGNoKGUpLnRoZW4oZnVuY3Rpb24oZSl7aWYoIWUub2spdGhyb3cgbmV3IEVycm9yKCJIVFRQICIrZS5zdGF0dXMpO3JldHVybiBlLnRleHQoKX0pLnRoZW4oZnVuY3Rpb24oZSl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dC5pbm5lckhUTUw9ZS5yZXBsYWNlKC88XD94bWxbXHNcU10qP1w/Pi9nLCIiKS5yZXBsYWNlKC88IURPQ1RZUEVbXHNcU10qPz4vZ2ksIiIpO3ZhciBhPXQucXVlcnlTZWxlY3Rvcigic3ZnIik7aWYoIWEpdGhyb3cgbmV3IEVycm9yKCJObyBTVkcgaW4gcmVzcG9uc2UiKTtoLnJlbW92ZSgpLGYuaW5zZXJ0QmVmb3JlKGEsZi5maXJzdENoaWxkKSxKKGEpLFooKTt2YXIgbj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibWFwU2NhbiIpO24mJiFsJiYobi5jbGFzc0xpc3QuYWRkKCJydW4iKSxuLmFkZEV2ZW50TGlzdGVuZXIoImFuaW1hdGlvbmVuZCIsZnVuY3Rpb24oKXtuLmNsYXNzTGlzdC5yZW1vdmUoInJ1biIpfSx7b25jZTohMH0pKX0pLmNhdGNoKGZ1bmN0aW9uKCl7aC5pbm5lckhUTUw9IjxzcGFuPlRoZSBjaXJjdWl0IG1hcCBjb3VsZCBub3QgYmUgbG9hZGVkLiBDaGVjayB0aGUgY29ubmVjdGlvbiBhbmQgdHJ5IGFnYWluLjwvc3Bhbj4iO3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIpO2UudHlwZT0iYnV0dG9uIixlLnRleHRDb250ZW50PSJSZWxvYWQgdGhlIG1hcCIsZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdCksaC5hcHBlbmRDaGlsZChlKX0pfSgpfWZ1bmN0aW9uIEQoZSl7dmFyIHQsYT0oZS5pZHx8IiIpKyIgIisoZS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKSxuPVtdO2ZvcihwLmxhc3RJbmRleD0wO3Q9cC5leGVjKGEpOyluLmluZGV4T2YodFsxXSk8MCYmbi5wdXNoKHRbMV0pO3JldHVybiBufWZ1bmN0aW9uIFcoZSl7Zm9yKHZhciBhPUQoZSksbj0wO248YS5sZW5ndGg7bisrKWlmKHRbYVtuXV0pcmV0dXJuIE9iamVjdC5hc3NpZ24oe2lkOmFbbl19LHRbYVtuXV0pO3JldHVybiBudWxsfWZ1bmN0aW9uIFkoZSl7dHJ5e2lmKCFQKXJldHVybjtpZighZSlyZXR1cm4gdm9pZChQLnN0eWxlLmRpc3BsYXk9Im5vbmUiKTt2YXIgdD1QLm93bmVyU1ZHRWxlbWVudCxhPXQudmlld0JveC5iYXNlVmFsLG49ZnVuY3Rpb24oZSx0KXt2YXIgYT10LmdldEJCb3goKSxuPWUuZ2V0U2NyZWVuQ1RNKCkuaW52ZXJzZSgpLm11bHRpcGx5KHQuZ2V0U2NyZWVuQ1RNKCkpLGk9W1thLngsYS55XSxbYS54K2Eud2lkdGgsYS55XSxbYS54LGEueSthLmhlaWdodF0sW2EueCthLndpZHRoLGEueSthLmhlaWdodF1dLm1hcChmdW5jdGlvbih0KXt2YXIgYT1lLmNyZWF0ZVNWR1BvaW50KCk7cmV0dXJuIGEueD10WzBdLGEueT10WzFdLGEubWF0cml4VHJhbnNmb3JtKG4pfSksbz1pLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS54fSksYz1pLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS55fSk7cmV0dXJue3g6TWF0aC5taW4uYXBwbHkoMCxvKSx5Ok1hdGgubWluLmFwcGx5KDAsYyksdzpNYXRoLm1heC5hcHBseSgwLG8pLU1hdGgubWluLmFwcGx5KDAsbyksaDpNYXRoLm1heC5hcHBseSgwLGMpLU1hdGgubWluLmFwcGx5KDAsYyl9fSh0LGUpLGk9LjAwNiooYSYmYS53aWR0aD9hLndpZHRoOjkwMCksbz1uLngtaSxjPW4ueS1pLHI9bi53KzIqaSxzPW4uaCsyKmksZD0uMypNYXRoLm1pbihyLHMpO1AuaW5uZXJIVE1MPSc8cGF0aCBkPSJNJytvKyIgIisoYytkKSsiIFYiK2MrIiBIIisobytkKSsiIE0iKyhvK3ItZCkrIiAiK2MrIiBIIisobytyKSsiIFYiKyhjK2QpKyIgTSIrKG8rcikrIiAiKyhjK3MtZCkrIiBWIisoYytzKSsiIEgiKyhvK3ItZCkrIiBNIisobytkKSsiICIrKGMrcykrIiBIIitvKyIgViIrKGMrcy1kKSsnIiBmaWxsPSJub25lIi8+PGNpcmNsZSBjeD0iJysobytyLzIpKyciIGN5PSInKyhjK3MvMikrJyIgcj0iJysuNSppKyciLz4nLFAuc3R5bGUuZGlzcGxheT0iIixsfHwoUC5jbGFzc0xpc3QucmVtb3ZlKCJvbiIpLFAuZ2V0QkJveCgpLFAuY2xhc3NMaXN0LmFkZCgib24iKSl9Y2F0Y2godSl7UCYmKFAuc3R5bGUuZGlzcGxheT0ibm9uZSIpfX1mdW5jdGlvbiBWKGUpe3ZhciB0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJmLWNhdCIpLGE9IkFub3RoZXIgem9uZSI7aWYodClmb3IodmFyIG49MDtuPHQub3B0aW9ucy5sZW5ndGg7bisrKWlmKHQub3B0aW9uc1tuXS50ZXh0PT09ZSl7YT1lO2JyZWFrfUImJkIuc2V0QXR0cmlidXRlKCJkYXRhLWNhdCIsYSl9ZnVuY3Rpb24gZXNFRUJjYXQoZSl7dmFyIGF2PXdpbmRvdy5FRUJfYXZhaWxhYmlsaXR5JiZ3aW5kb3cuRUVCX2F2YWlsYWJpbGl0eSgpLG5tPWZ1bmN0aW9uKHMpe3JldHVybiBTdHJpbmcoc3x8IiIpLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXCtccypob3RlbFxzKiQvLCIiKS5yZXBsYWNlKC9bXmEtejAtOV0vZywiIil9LG91dD1udWxsO2lmKGF2JiZhdi5jYXRlZ29yaWVzKU9iamVjdC5rZXlzKGF2LmNhdGVnb3JpZXMpLmZvckVhY2goZnVuY3Rpb24oayl7dmFyIGM9YXYuY2F0ZWdvcmllc1trXTshb3V0JiZubShjLm5hbWUpPT09bm0oZS5uYW1lKSYmKG91dD17aWQ6ayxjOmN9KX0pO3JldHVybiBvdXR9ZnVuY3Rpb24gZXNFRUJjdGEoZSx0LG4sZCl7dmFyIGNhdD1lc0VFQmNhdChlKSxjaWQ9Y2F0JiZjYXQuaWQsYz1jYXQmJmNhdC5jLGVucT0iaHR0cHM6Ly93d3cuZXMtc3BvcnQuYWUvY29udGFjdC8/ZWViX2V2ZW50PWYxYWQyNiZlZWJfcmVhc29uPW9uLXJlcXVlc3QiKyhjaWQ/IiZlZWJfY2F0ZWdvcnk9IitjaWQ6IiIpO2lmKEkpe0kub25jbGljaz1udWxsO0kuaGlkZGVuPSEwO0kucmVtb3ZlQXR0cmlidXRlKCJocmVmIik7fWlmKCFCKXJldHVybjtpZihlJiZlLmlkPT09ImZhMzQ5YWZjNTE4NjRjYWNiOTVhMzk5NTVkODJiMzc5X2N0ZyIpe0IuaGlkZGVuPSEwO3JldHVybn1CLmhpZGRlbj0hMTtCLnRleHRDb250ZW50PSJFbnF1aXJlIGFib3V0IHRoaXMgem9uZSI7Qi5ocmVmPShjJiZjLmVucXVpcnkpfHxlbnF9ZnVuY3Rpb24gVShlKXt2YXIgdD1lJiZhW2UuaWRdO2lmKGhvdGVsQ3RhKWhvdGVsQ3RhLmhpZGRlbj0hKGUmJmUuaWQ9PT0iZmEzNDlhZmM1MTg2NGNhY2I5NWEzOTk1NWQ4MmIzNzlfY3RnIik7aWYoIXQpcmV0dXJuIEUuaGlkZGVuPSEwLEkmJihJLmhpZGRlbj0hMCksQiYmKEIuaGlkZGVuPSExLEIudGV4dENvbnRlbnQ9IkVucXVpcmUgYWJvdXQgdGhpcyB6b25lIiksdm9pZCBWKGU/ZS5uYW1lOiIiKTtFLmhpZGRlbj0hMTt2YXIgZWM9ZXNFRUJjYXQoZSkscGY9KGUmJmUuaWQ9PT0iZmEzNDlhZmM1MTg2NGNhY2I5NWEzOTk1NWQ4MmIzNzlfY3RnIik/NjEwMDooZWMmJmVjLmMuZnJvbT9lYy5jLmZyb206dC5mcm9tKSxuPSJvdXQiPT09dC5zdG9jaztlYyYmKG49InNvbGQtb3V0Ij09PWVjLmMuc3RhdGUpO1MudGV4dENvbnRlbnQ9bj8iU29sZCBvdXQiOiJBdmFpbGFibGUiLFMuY2xhc3NMaXN0LnRvZ2dsZSgib3V0IixuKSxmdW5jdGlvbihlKXtxJiZjYW5jZWxBbmltYXRpb25GcmFtZShxKTtpZihsKXJldHVybiB2b2lkKEwudGV4dENvbnRlbnQ9ZChlKSk7dmFyIHQ9bnVsbCxhPTYwMCxuPWZ1bmN0aW9uKGUpe3JldHVybiAxLU1hdGgucG93KDEtZSwzKX0saT1mdW5jdGlvbihvKXtudWxsPT09dCYmKHQ9byk7dmFyIGM9TWF0aC5taW4oMSwoby10KS9hKTtMLnRleHRDb250ZW50PWQoTWF0aC5yb3VuZChlKm4oYykpKSxjPDE/cT1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoaSk6KEwudGV4dENvbnRlbnQ9ZChlKSxxPW51bGwpfTtxPXJlcXVlc3RBbmltYXRpb25GcmFtZShpKX0ocGYpLGsudGV4dENvbnRlbnQ9dC5zdW0seC50ZXh0Q29udGVudD0odC50aXB8fCIiKS5yZXBsYWNlKC9eVElQXHMqXC9cL1xzKi9pLCJUaXA6ICIpLEEuaW5uZXJIVE1MPSIiLCh0LmluY3x8W10pLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dC50ZXh0Q29udGVudD1lLEEuYXBwZW5kQ2hpbGQodCl9KSxULmlubmVySFRNTD0iIiwodC5pZGVhbHx8W10pLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpO3QudGV4dENvbnRlbnQ9ZSxULmFwcGVuZENoaWxkKHQpfSksQy5oaWRkZW49IXQubm90ZSx0Lm5vdGUmJihDLnRleHRDb250ZW50PXQubm90ZSksZXNFRUJjdGEoZSx0LG4sZCl9ZnVuY3Rpb24gSyhlLHQpe18mJl8uY2xhc3NMaXN0LnJlbW92ZSgiZXMtYWN0aXZlIiksKF89dHx8bnVsbCkmJl8uY2xhc3NMaXN0LmFkZCgiZXMtYWN0aXZlIiksWShfKSxtLnRleHRDb250ZW50PW9bZS50aWVyXXx8IlpvbmUiLGcudGV4dENvbnRlbnQ9ZS5jb2RlLGIudGV4dENvbnRlbnQ9ZS5uYW1lLHYudGV4dENvbnRlbnQ9ZS5kZXNjLGZ1bmN0aW9uKGUpe3ZhciB0PWUmJm5bZS5pZF07aWYody5pbm5lckhUTUw9IiIsdy5zY3JvbGxMZWZ0PTAsdCYmdC5sZW5ndGgpe3ZhciBhPTA7dC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO24uY2xhc3NOYW1lPSJ6cC1zaG90Ijt2YXIgaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKTtpZihpLmxvYWRpbmc9ImxhenkiLGkuZGVjb2Rpbmc9ImFzeW5jIixpLmFsdD1lLm5hbWUrKHQuY2FwPyIsICIrdC5jYXA6IiIpLGkuc3JjPXQuZD90LmQ6L14oZGF0YTp8aHR0cHM/OikvLnRlc3QodC5zcmMpP3Quc3JjOnIrdC5zcmMsaS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtuLnJlbW92ZSgpLHcucXVlcnlTZWxlY3RvcigiLnpwLXNob3QiKXx8KHkuaGlkZGVuPSEwKX0pLG4uYXBwZW5kQ2hpbGQoaSksdC5jYXApe3ZhciBvPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO28uY2xhc3NOYW1lPSJjYXAiLG8udGV4dENvbnRlbnQ9dC5jYXAsbi5hcHBlbmRDaGlsZChvKX13LmFwcGVuZENoaWxkKG4pLGErK30pLHkuaGlkZGVuPTA9PT1hfWVsc2UgeS5oaWRkZW49ITB9KGUpLFUoZSk7dmFyIGEsaT1PLnF1ZXJ5U2VsZWN0b3IoIi56cC1zY3JvbGwiKTtpJiYoaS5zY3JvbGxUb3A9MCxsfHwoaS5jbGFzc0xpc3QucmVtb3ZlKCJzd2FwIiksaS5vZmZzZXRXaWR0aCxpLmNsYXNzTGlzdC5hZGQoInN3YXAiKSkpLHoubWF0Y2hlcyYmKFEoKSxjbGVhclRpbWVvdXQoRyksSC5jbGFzc0xpc3QucmVtb3ZlKCJpcy1jbG9zaW5nIiksSC5oaWRkZW49ITEsKGE9d2luZG93LmlubmVyV2lkdGgtZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKT4wJiYoZG9jdW1lbnQuYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQ9YSsicHgiKSxkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93PSJoaWRkZW4iLEgub2Zmc2V0V2lkdGgsSC5jbGFzc0xpc3QuYWRkKCJpcy1vcGVuIikpfWZ1bmN0aW9uICQoZSl7dmFyIHQ9ZS52aWV3Qm94JiZlLnZpZXdCb3guYmFzZVZhbDshZnVuY3Rpb24oZSx0KXt0cnl7dmFyIGE9WyJHRU5FUkFMIEFETUlTU0lPTiIsIkdFTkVSQUwiLCJBRE1JU1NJT04iLCJHUkFORFNUQU5EUyIsIkdSQU5EU1RBTkQiLCJIT1NQSVRBTElUWSIsIkxPVU5HRVMiLCJTVUlURVMiLCJMRUdFTkQiLCJLRVkiXSxuPWZ1bmN0aW9uKGUpe3JldHVybiBhLmluZGV4T2YoZnVuY3Rpb24oZSl7cmV0dXJuKGV8fCIiKS5yZXBsYWNlKC9ccysvZywiICIpLnRyaW0oKS50b1VwcGVyQ2FzZSgpfShlKSk+PTB9LGk9dCYmdC53aWR0aD90LndpZHRoOjkwMDtlLnF1ZXJ5U2VsZWN0b3JBbGwoInRleHQsIHRzcGFuIikuZm9yRWFjaChmdW5jdGlvbihlKXtpZihuKGUudGV4dENvbnRlbnQpKXt2YXIgdD1lLmNsb3Nlc3QoInRleHQiKXx8ZTt0LnN0eWxlLmRpc3BsYXk9Im5vbmUiO3ZhciBhPXQucHJldmlvdXNFbGVtZW50U2libGluZzthJiYvXihyZWN0fHBhdGh8cG9seWdvbnxjaXJjbGUpJC9pLnRlc3QoYS50YWdOYW1lKSYmKGEuc3R5bGUuZGlzcGxheT0ibm9uZSIpfX0pLGUucXVlcnlTZWxlY3RvckFsbCgiZyIpLmZvckVhY2goZnVuY3Rpb24oZSl7aWYoImVzLWxvY2siIT09ZS5pZCl7dmFyIHQ9ZS5xdWVyeVNlbGVjdG9yQWxsKCJ0ZXh0Iik7aWYodC5sZW5ndGgpe3ZhciBhPUFycmF5LnByb3RvdHlwZS5ldmVyeS5jYWxsKHQsZnVuY3Rpb24oZSl7cmV0dXJuIG4oZS50ZXh0Q29udGVudCl9KSxpPWUucXVlcnlTZWxlY3RvcignW2NsYXNzKj0iX2N0ZyJdJyl8fC9fY3RnLy50ZXN0KGUuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIik7YSYmIWkmJihlLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX19fSksZS5xdWVyeVNlbGVjdG9yQWxsKCJyZWN0LCBwYXRoLCBwb2x5Z29uLCBjaXJjbGUiKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2lmKCFlLmNsb3Nlc3QoJ1tjbGFzcyo9Il9jdGciXScpJiYhZS5jbG9zZXN0KCJkZWZzIikpe3ZhciB0PWUuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIjtpZighL3RyYWNrLXxjdXJ2ZS18ZmxhZy18ZXMtem9uZS8udGVzdCh0KSl0cnl7dmFyIGE9ZS5nZXRCQm94KCk7aWYoYS53aWR0aD49LjAzNSppfHxhLmhlaWdodD49LjAzNSppKXJldHVybjt2YXIgbj0oZ2V0Q29tcHV0ZWRTdHlsZShlKS5maWxsfHwiIikubWF0Y2goL3JnYmE/XCgoXGQrKSxccyooXGQrKSxccyooXGQrKS8pO2lmKCFuKXJldHVybjsuMjEyNipuWzFdKy43MTUyKm5bMl0rLjA3MjIqblszXTw0OCYmKGUuc3R5bGUuZGlzcGxheT0ibm9uZSIpfWNhdGNoKG8pe319fSl9Y2F0Y2gobyl7fX0oZSx0KTt0cnl7dmFyIGE9ZS5nZXRCQm94KCk7aWYoYSYmYS53aWR0aD41MCYmYS5oZWlnaHQ+NTApe3ZhciBuPS4wMjUqYS53aWR0aCxpPS4wNDUqYS5oZWlnaHQ7ZS5zZXRBdHRyaWJ1dGUoInZpZXdCb3giLGEueC1uKyIgIisoYS55LWkpKyIgIisoYS53aWR0aCsyKm4pKyIgIisoYS5oZWlnaHQrMippKSksdD1lLnZpZXdCb3guYmFzZVZhbH19Y2F0Y2gocil7fXZhciBvPU1hdGgubWF4KDQsKHQmJnQud2lkdGg/dC53aWR0aDo5MDApLzE2MCk7ZS5zdHlsZS5zZXRQcm9wZXJ0eSgiLS1oYXRjaFNoaWZ0IiwuOCpvKyJweCIpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh1LCJkZWZzIik7Yy5pbm5lckhUTUw9JzxwYXR0ZXJuIGlkPSJlc0hhdGNoIiB3aWR0aD0iJytvKyciIGhlaWdodD0iJytvKyciIHBhdHRlcm5Vbml0cz0idXNlclNwYWNlT25Vc2UiIHBhdHRlcm5UcmFuc2Zvcm09InJvdGF0ZSg0NSkiPjxyZWN0IHdpZHRoPSInK28rJyIgaGVpZ2h0PSInK28rJyIgZmlsbD0icmdiYSgyMzUsMTgwLDcwLDAuMjApIi8+PGxpbmUgeDE9IjAiIHkxPSIwIiB4Mj0iMCIgeTI9IicrbysnIiBzdHJva2U9InJnYmEoMjM1LDE4MCw3MCwwLjU1KSIgc3Ryb2tlLXdpZHRoPSInKy4xOCpvKyciLz48L3BhdHRlcm4+PHBhdHRlcm4gaWQ9ImVzSGF0Y2hIb3QiIHdpZHRoPSInKy44Km8rJyIgaGVpZ2h0PSInKy44Km8rJyIgcGF0dGVyblVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgcGF0dGVyblRyYW5zZm9ybT0icm90YXRlKDQ1KSI+PHJlY3Qgd2lkdGg9IicrLjgqbysnIiBoZWlnaHQ9IicrLjgqbysnIiBmaWxsPSJyZ2JhKDIzNSwxODAsNzAsMC4zNCkiLz48bGluZSB4MT0iMCIgeTE9IjAiIHgyPSIwIiB5Mj0iJysuOCpvKyciIHN0cm9rZT0icmdiYSgyMzUsMTgwLDcwLDAuOTUpIiBzdHJva2Utd2lkdGg9IicrLjIyKm8rJyIvPjwvcGF0dGVybj4nLGUuaW5zZXJ0QmVmb3JlKGMsZS5maXJzdENoaWxkKX1mdW5jdGlvbiBKKGUpe2UuY2xhc3NMaXN0LmFkZCgidmVudWUiKSxlLnJlbW92ZUF0dHJpYnV0ZSgid2lkdGgiKSxlLnJlbW92ZUF0dHJpYnV0ZSgiaGVpZ2h0IiksJChlKTt2YXIgbj0icGF0aCxwb2x5Z29uLHJlY3QsY2lyY2xlIixvPUFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChlLnF1ZXJ5U2VsZWN0b3JBbGwoIioiKSxmdW5jdGlvbihlKXtpZighRChlKS5sZW5ndGgpcmV0dXJuITE7dmFyIHQ9ZS50YWdOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImciPT09dD8hIWUucXVlcnlTZWxlY3RvcihuKTpuLmluZGV4T2YodCk+PTB9KSxjPW8uZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiJnIj09PWUudGFnTmFtZS50b0xvd2VyQ2FzZSgpJiYhby5zb21lKGZ1bmN0aW9uKHQpe3JldHVybiB0IT09ZSYmZS5jb250YWlucyh0KSYmRCh0KS5qb2luKCkhPT1EKGUpLmpvaW4oKX0pfSkscj1jLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4hYy5zb21lKGZ1bmN0aW9uKHQpe3JldHVybiB0IT09ZSYmdC5jb250YWlucyhlKX0pfSkscz1yLmNvbmNhdChvLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4iZyIhPT1lLnRhZ05hbWUudG9Mb3dlckNhc2UoKSYmIXIuc29tZShmdW5jdGlvbih0KXtyZXR1cm4gdC5jb250YWlucyhlKX0pfSkpO2Z1bmN0aW9uIGQoZSx0KXtlLmNsYXNzTGlzdC5hZGQoImVzLXpvbmUiKSx0JiYoZS5kYXRhc2V0LmVzSWQ9dC5pZCxhW3QuaWRdJiZlLmNsYXNzTGlzdC5hZGQoImVzLXBrZyIpLCJvdXRsaW5lIj09PWlbdC5pZF0mJmUuY2xhc3NMaXN0LmFkZCgiZXMtb3V0bGluZSIpLGUuc2V0QXR0cmlidXRlKCJyb2xlIiwiYnV0dG9uIiksZS5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IiwiMCIpLGUuc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIix0Lm5hbWUrIiwgIit0LmNvZGUpLGUuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixmdW5jdGlvbihlKXtlLnByZXZlbnREZWZhdWx0KCl9KSxlLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbihhKXthLnN0b3BQcm9wYWdhdGlvbigpLEsodCxlKX0pLGUuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsZnVuY3Rpb24oYSl7IkVudGVyIiE9PWEua2V5JiYiICIhPT1hLmtleXx8KGEucHJldmVudERlZmF1bHQoKSxhLnN0b3BQcm9wYWdhdGlvbigpLEsodCxlKSl9KSl9cy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2QoZSxXKGUpKX0pO3ZhciBsPXt9O3MuZm9yRWFjaChmdW5jdGlvbihlKXtEKGUpLmZvckVhY2goZnVuY3Rpb24oZSl7bFtlXT0hMH0pfSksT2JqZWN0LmtleXModCkuZm9yRWFjaChmdW5jdGlvbihlKXtpZighbFtlXSl7dmFyIGE9by5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIEQodCkuaW5kZXhPZihlKT49MH0pO2EubGVuZ3RoJiZkKGFbYS5sZW5ndGgtMV0sT2JqZWN0LmFzc2lnbih7aWQ6ZX0sdFtlXSkpfX0pLE49ZSxQPWZ1bmN0aW9uKGUpe3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh1LCJnIik7cmV0dXJuIHQuc2V0QXR0cmlidXRlKCJpZCIsImVzLWxvY2siKSx0LnN0eWxlLmRpc3BsYXk9Im5vbmUiLGUuYXBwZW5kQ2hpbGQodCksdH0oZSl9ZnVuY3Rpb24gWigpe3oubWF0Y2hlc3x8Ty5wYXJlbnRFbGVtZW50IT09Uj9PLnN0eWxlLmhlaWdodD0iIjpPLnN0eWxlLmhlaWdodD1mLm9mZnNldEhlaWdodCsicHgifWZ1bmN0aW9uIFEoKXt6Lm1hdGNoZXM/Ty5wYXJlbnRFbGVtZW50IT09aiYmai5hcHBlbmRDaGlsZChPKTooTy5wYXJlbnRFbGVtZW50IT09UiYmUi5hcHBlbmRDaGlsZChPKSxaKCkpfWZ1bmN0aW9uIFgoKXtILmhpZGRlbnx8KEguY2xhc3NMaXN0LnJlbW92ZSgiaXMtb3BlbiIpLEguY2xhc3NMaXN0LmFkZCgiaXMtY2xvc2luZyIpLGNsZWFyVGltZW91dChHKSxHPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgZTtILmhpZGRlbj0hMCxILmNsYXNzTGlzdC5yZW1vdmUoImlzLWNsb3NpbmciKSwoZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicmZpTW9kYWwiKSkmJiFlLmhpZGRlbnx8KGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3c9IiIsZG9jdW1lbnQuYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQ9IiIpfSxsPzA6MjYwKSl9fSgpLGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciBlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJmLWNhdCIpO2UmJmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIltkYXRhLWNhdF0iKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7Zm9yKHZhciBhPXQuZ2V0QXR0cmlidXRlKCJkYXRhLWNhdCIpLG49MDtuPGUub3B0aW9ucy5sZW5ndGg7bisrKWlmKGUub3B0aW9uc1tuXS50ZXh0PT09YSlyZXR1cm4gdm9pZChlLnNlbGVjdGVkSW5kZXg9bil9KX0pfSgpLGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciBlPXdpbmRvdy5tYXRjaE1lZGlhJiZ3aW5kb3cubWF0Y2hNZWRpYSgiKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSkiKS5tYXRjaGVzLHQ9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnN0YXRzIC5zdGF0IC5uIikpO2lmKHQubGVuZ3RoJiYhZSYmIkludGVyc2VjdGlvbk9ic2VydmVyImluIHdpbmRvdyl7dmFyIGE9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS50ZXh0Q29udGVudC50cmltKCksYT10Lm1hdGNoKC9eKFxkKykoSz9cKz8pJC8pO2lmKGEpe3ZhciBuPXBhcnNlSW50KGFbMV0sMTApLGk9YVsyXXx8IiIsbz1hWzFdLmxlbmd0aCxjPW51bGwscj1mdW5jdGlvbihhKXtudWxsPT09YyYmKGM9YSk7Zm9yKHZhciBzLGQ9TWF0aC5taW4oMSwoYS1jKS8xNDAwKSxsPU1hdGgucm91bmQobioocz1kLDEtTWF0aC5wb3coMS1zLDMpKSksdT1TdHJpbmcobCk7dS5sZW5ndGg8bzspdT0iMCIrdTtlLnRleHRDb250ZW50PXUraSxkPDE/cmVxdWVzdEFuaW1hdGlvbkZyYW1lKHIpOmUudGV4dENvbnRlbnQ9dH07cmVxdWVzdEFuaW1hdGlvbkZyYW1lKHIpfX0sbj1uZXcgV2Vha1NldCxpPW5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihmdW5jdGlvbihlKXtlLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5pc0ludGVyc2VjdGluZyYmIW4uaGFzKGUudGFyZ2V0KSYmKG4uYWRkKGUudGFyZ2V0KSxhKGUudGFyZ2V0KSxpLnVub2JzZXJ2ZShlLnRhcmdldCkpfSl9LHt0aHJlc2hvbGQ6LjV9KTt0LmZvckVhY2goZnVuY3Rpb24oZSl7aS5vYnNlcnZlKGUpfSl9fSgpLGZ1bmN0aW9uKCl7aWYoKCF3aW5kb3cubWF0Y2hNZWRpYXx8IXdpbmRvdy5tYXRjaE1lZGlhKCIocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKSIpLm1hdGNoZXMpJiYiSW50ZXJzZWN0aW9uT2JzZXJ2ZXIiaW4gd2luZG93KXtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgibW8iKTt2YXIgZT1bIi5zdGFjayA+IC5pdGVtIiwiLmFjYy1pdGVtIiwiLmZhcS1pdGVtIiwiLmJvdXQiLCIudnN0b3J5IiwiLnRrYm94IiwiLmFiLWZyYW1lIiwiLmNtcCB0Ym9keSB0ZCIsIi5jbXAgdGhlYWQgdGgiLCIudGFwZS1jZWxsIiwiLnZzLXJvdyIsIi52ZW51ZS1zcGVjcyA+ICoiLCIuenAtdGllciIsIi50a2dyaWQgdGQiLCIuc3RhdHMgPiAuc3RhdCIsIi5zdGF0cyA+IC5zdCIsIi52aXRhbHMgPiAudml0YWwiLCIuaGVyby1tZXRhID4gLmhtIiwiLnRpZXJzID4gLnRpZXIiLCIudmdyaWQgPiAudmJsb2NrIiwiLmtjLWNhcmQiLCIuYWItc3BlYyIsIi5pbmMtbGlzdCA+IGxpIiwiLmFydHMgPiAuYXJ0IiwiLmZvcmsgPiAucm91dGUiLCIuY2F0YWxvZ3VlIC5uY2FyZCIsIi5vY2FyZCIsIi5wY2FyZCIsIi5iY2FyZCIsIi5wY2FyZHAiLCIuZml2ZXctZ3JpZCA+ICoiLCIubG9nb3MgPiAubG9nbyIsIi5lc20tYmFuZCIsIi5tYXAtY2hpcCIsIi50YXBlLWdyaWQgPiAudGFwZS1jZWxsIiwiLmdjYXJkIl0sdD1lLmpvaW4oIiwiKTtkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJbZGF0YS1tb10iKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UubWF0Y2hlcyh0KXx8ZS5yZW1vdmVBdHRyaWJ1dGUoImRhdGEtbW8iKX0pO3ZhciBhPVtdO2lmKGUuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdCxuPW51bGwsaT0wO3RyeXt0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoZSl9Y2F0Y2gobyl7cmV0dXJufXQuZm9yRWFjaChmdW5jdGlvbihlKXtpZighZS5oYXNBdHRyaWJ1dGUoImRhdGEtbW8iKSl7dmFyIHQ9ZS5wYXJlbnROb2RlO2k9dD09PW4/aSsxOjAsbj10LGUuc2V0QXR0cmlidXRlKCJkYXRhLW1vIiwiIiksZS5zdHlsZS5zZXRQcm9wZXJ0eSgiLS1tby1kIixNYXRoLm1pbig1MCppLDMwMCkrIm1zIiksYS5wdXNoKGUpfX0pfSksYS5sZW5ndGgpe3ZhciBuPW5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihmdW5jdGlvbihlKXtlLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5pc0ludGVyc2VjdGluZyYmKGUudGFyZ2V0LmNsYXNzTGlzdC5hZGQoIm1vLWxpdCIpLG4udW5vYnNlcnZlKGUudGFyZ2V0KSl9KX0se3Jvb3RNYXJnaW46IjBweCAwcHggLTYlIDBweCIsdGhyZXNob2xkOi4wNX0pO2EuZm9yRWFjaChmdW5jdGlvbihlKXtuLm9ic2VydmUoZSl9KSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2lmKCFlLmNsYXNzTGlzdC5jb250YWlucygibW8tbGl0Iikpe3ZhciB0PWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7dC50b3A8aW5uZXJIZWlnaHQmJnQuYm90dG9tPjAmJmUuY2xhc3NMaXN0LmFkZCgibW8tbGl0Iil9fSl9LDRlMyksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe2EuZm9yRWFjaChmdW5jdGlvbihlKXtpZighZS5jbGFzc0xpc3QuY29udGFpbnMoIm1vLWxpdCIpKXt2YXIgdD1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3QudG9wPGlubmVySGVpZ2h0JiZ0LmJvdHRvbT4wJiZ0LmhlaWdodCYmZS5jbGFzc0xpc3QuYWRkKCJtby1saXQiKX19KX0sNjApfSl9fX0oKSxmdW5jdGlvbigpe1sieHFGb3JtIiwicmZpIl0uZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChlKTt0JiZ0LmFkZEV2ZW50TGlzdGVuZXIoInN1Ym1pdCIsZnVuY3Rpb24oZSl7dC5jaGVja1ZhbGlkaXR5KCkmJigodC5nZXRBdHRyaWJ1dGUoImRhdGEtZW5kcG9pbnQiKXx8IiIpLnRyaW0oKXx8KHdpbmRvdy5sb2NhdGlvbi5ocmVmPWZ1bmN0aW9uKGUpe3ZhciB0PVtdLGE9ZS5xdWVyeVNlbGVjdG9yKCJbbmFtZT1ldmVudC1uYW1lXSIpO3JldHVybiBhJiZ0LnB1c2goIkVucXVpcnk6ICIrYS52YWx1ZSksZS5xdWVyeVNlbGVjdG9yQWxsKCJpbnB1dDpub3QoW3R5cGU9aGlkZGVuXSksc2VsZWN0LHRleHRhcmVhIikuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgbj1lLnF1ZXJ5U2VsZWN0b3IoJ2xhYmVsW2Zvcj0iJythLmlkKyciXScpLGk9bj9uLnRleHRDb250ZW50LnRyaW0oKTphLm5hbWV8fGEuaWQ7YS52YWx1ZSYmdC5wdXNoKGkrIjogIithLnZhbHVlKX0pLCJtYWlsdG86aW5mb0Blcy1zcG9ydC5hZT9zdWJqZWN0PSIrZW5jb2RlVVJJQ29tcG9uZW50KChhP2EudmFsdWU6IldlYnNpdGUgZW5xdWlyeSIpKyIgLSBlbnF1aXJ5IikrIiZib2R5PSIrZW5jb2RlVVJJQ29tcG9uZW50KHQuam9pbigiXG4iKSl9KHQpKSl9LCEwKX0pO3ZhciBlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ4cU1vZGFsIik7aWYoZSYmIWRvY3VtZW50LmJvZHkuaGFzQXR0cmlidXRlKCJkYXRhLXhxLW5hdGl2ZSIpKXt2YXIgdCxhPXdpbmRvdy5tYXRjaE1lZGlhJiZtYXRjaE1lZGlhKCIocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKSIpLm1hdGNoZXMsbj1udWxsO2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIltkYXRhLW9wZW4teHFdIikuZm9yRWFjaChmdW5jdGlvbihpKXtpLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbihvKXtvLnByZXZlbnREZWZhdWx0KCksZnVuY3Rpb24oaSl7Y2xlYXJUaW1lb3V0KHQpLG49aSxlLmhpZGRlbj0hMSxkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93PSJoaWRkZW4iLGUub2Zmc2V0V2lkdGgsZS5jbGFzc0xpc3QuYWRkKCJpcy1vcGVuIiksc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciB0PWUucXVlcnlTZWxlY3RvcigiaW5wdXQ6bm90KFt0eXBlPWhpZGRlbl0pIik7dCYmdC5mb2N1cyh7cHJldmVudFNjcm9sbDohMH0pfSxhPzA6MjYwKX0oaSl9KX0pLGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIltkYXRhLWNsb3NlLXhxXSIpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsbyl9KSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixmdW5jdGlvbih0KXsiRXNjYXBlIiE9PXQua2V5fHxlLmhpZGRlbnx8bygpfSk7dmFyIGk9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInhxRm9ybSIpO2kmJmkuYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IixmdW5jdGlvbihlKXtpZihlLnByZXZlbnREZWZhdWx0KCksaS5jaGVja1ZhbGlkaXR5KCkpe3ZhciB0PWkuZ2V0QXR0cmlidXRlKCJkYXRhLWVuZHBvaW50IiksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgieHFTZW50Iiksbj1mdW5jdGlvbigpe2EmJmEuY2xhc3NMaXN0LmFkZCgib24iKTtpLnJlc2V0KCk7c2V0VGltZW91dChmdW5jdGlvbigpe2EmJmEuY2xhc3NMaXN0LnJlbW92ZSgib24iKX0sNzAwMCl9O3Q/ZmV0Y2godCx7bWV0aG9kOiJQT1NUIixib2R5Om5ldyBGb3JtRGF0YShpKX0pLnRoZW4obikuY2F0Y2gobik6bigpfWVsc2UgaS5yZXBvcnRWYWxpZGl0eSgpfSl9ZnVuY3Rpb24gbygpe2UuaGlkZGVufHwoZS5jbGFzc0xpc3QucmVtb3ZlKCJpcy1vcGVuIiksY2xlYXJUaW1lb3V0KHQpLHQ9c2V0VGltZW91dChmdW5jdGlvbigpe2UuaGlkZGVuPSEwLGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3c9IiIsbiYmbi5mb2N1cyYmbi5mb2N1cygpLG49bnVsbH0sYT8wOjM2MCkpfX0oKX0oKTsKOyhmdW5jdGlvbigpe3ZhciBuPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJuYXYiKTtpZighbilyZXR1cm47dmFyIGY9ZnVuY3Rpb24oKXtuLmNsYXNzTGlzdC50b2dnbGUoInNjcm9sbGVkIix3aW5kb3cuc2Nyb2xsWT42MCl9O2YoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicGFnZXNob3ciLGYpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixmKTt9KSgpOwovKiBWZW51ZSBtYXAgem9vbSwgb25lIHJvdXRpbmUgZm9yIHRoZSBGMSBodWIgKDczMjksIC5tYXAtd3JhcCA+IHN2Zy52ZW51ZSkgYW5kIHRoZSBEdWJhaSA3cyBzcGVjdGF0b3IgbWFwCiAgICg3MzIzLCAuZDctbWFwLXdyYXAgPiBzdmcuZDctdmVudWUpOiB0aGUgVUZDIHNlYXQgbWFwJ3MgYmVoYXZpb3VyIChMb3VpcywgOCBPY3QgMjAyNjogInRoZSB6b29taW5nIGluIG9yIG91dAogICBmZWF0dXJlIGlzIGRvbmUgYnkgYnV0dG9ucywgd2hlcmVhcyB5b3UgY2FuIHNjcm9sbCBvbiB0aGUgdWZjIG1hcC4gY2FuIHRoZSBmdW5jdGlvbiBiZSB0aGUgc2FtZSBvbiB0aGUgN3MgYW5kIGYxCiAgIG1hcHMgYXMgdGhlIHVmYyIpLiBDaGFuZ2UgbG9nIENMLTIwMjYxMDA4LTA0OyBDdHJsICsgc2Nyb2xsIGFuZCB0aGUgaGludHMgQ0wtMjAyNjEwMDgtMTQgKCJjYW4gYWxsIG1hcHMgYmUKICAgY3RybCtzY3JvbGwgYW5kIGJlIHNob3duIHRoYXQgdGhhdHMgdGhlIGNhc2UsIGFsc28gZW5zdXJpbmcgdGhhdCBhIG5vcm1hbCBtb3VzZSBob3ZlciBhbmQgc2Nyb2xsIHdoaWxzdCBjdXJzb3IgaXMKICAgb3ZlciBhbGwgdGhlIG1hcHMgcmVzdWx0cyBpbiB0aGUgcGFnZSBzY3JvbGxpbmcgYXMgbm9ybWFsIikuIEFwcGxpZWQgYnkgc2NyaXB0cy9tYXBfem9vbV8yMDI2LTEwLTA4LnB5IGFuZAogICBzY3JpcHRzL21hcF93aGVlbF8yMDI2LTEwLTA4LnB5LgogICAtIEN0cmwgKyBzY3JvbGwgKG9yIENtZCwgb3IgYSB0cmFja3BhZCBwaW5jaCwgd2hpY2ggYnJvd3NlcnMgcmVwb3J0IGFzIGEgd2hlZWwgd2l0aCBjdHJsS2V5KSB6b29tcyBhYm91dCB0aGUKICAgICBjdXJzb3I7IGEgcGxhaW4gc2Nyb2xsIGlzIGxlZnQgdG8gdGhlIHBhZ2UgYW5kIHRoZSBtYXAgc2hvd3MgIkN0cmwgKyBzY3JvbGwgdG8gem9vbSIgZm9yIGEgbW9tZW50OwogICAtIGRyYWcgcGFucyBvbmNlIHpvb21lZDsgYSBkcmFnIG9mIG1vcmUgdGhhbiA0cHggaXMgbm90IGEgY2xpY2ssIHNvIGEgem9uZSBpcyBub3QgcGlja2VkIGJ5IGFjY2lkZW50OwogICAtIHR3byBwb2ludGVycyBwaW5jaCBhYm91dCB0aGVpciBtaWRwb2ludDsgb24gdG91Y2ggdGhlIHdyYXAgYWxsb3dzIHBhZ2Ugc2Nyb2xsaW5nIChwYW4teSkgdW50aWwgdGhlIG1hcCBpcwogICAgIHpvb21lZCwgdGhlbiB0YWtlcyB0aGUgdG91Y2ggZm9yIHBhbm5pbmc7CiAgIC0gKyAvIG1pbnVzIC8gcmVzZXQgYnV0dG9ucyBhdCB0aGUgbWFwJ3MgdG9wLXJpZ2h0IGNvcm5lciwgaW5zaWRlIHRoZSB3cmFwLCB3aXRoIHRoZSBoaW50IHVuZGVyIHRoZW0gb24gZGV2aWNlcwogICAgIHRoYXQgaGF2ZSBhIHBvaW50ZXIgdGhhdCBob3ZlcnM7CiAgIC0gdGhlIGRyYXdpbmcgaXMgc2NhbGVkIHdpdGggYSBDU1MgdHJhbnNmb3JtIGFuZCBjbGlwcGVkIGJ5IHRoZSB3cmFwIChvdmVyZmxvdyBoaWRkZW4gaW4gdGhlIENTUyBibG9jayksIGFuZAogICAgIGNsYW1wZWQgc28gdGhlIG1hcCBhbHdheXMg
ZmlsbHMgaXRzIGJveDsgYSB3aWR0aCBjaGFuZ2UgcHV0cyBpdCBiYWNrIHRvIDEgKHRoZSBGMSBtYXAgc2NyaXB0IHNpemVzIGl0cwogICAgIGxhYmVscyBmcm9tIHRoZSByZW5kZXJlZCB3aWR0aCksIGEgaGVpZ2h0LW9ubHkgY2hhbmdlIChhIHBob25lJ3MgYWRkcmVzcyBiYXIpIGxlYXZlcyBpdCBhbG9uZS4gKi8KOyhmdW5jdGlvbigpewp2YXIgdHJpZXM9MDsKZnVuY3Rpb24gZmxhc2goZWwsbXNnKXsKICB2YXIgZj1lbC5xdWVyeVNlbGVjdG9yKCIubWFwLWZsYXNoIik7CiAgaWYoIWYpe2Y9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc05hbWU9Im1hcC1mbGFzaCI7Zi5zZXRBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIiwidHJ1ZSIpO2VsLmFwcGVuZENoaWxkKGYpfQogIGYudGV4dENvbnRlbnQ9bXNnO2YuY2xhc3NMaXN0LmFkZCgib24iKTtjbGVhclRpbWVvdXQoZi5fdCk7Zi5fdD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5jbGFzc0xpc3QucmVtb3ZlKCJvbiIpfSwxNDAwKTsKfQp3aW5kb3cuZXNNYXBGbGFzaD1mbGFzaDsKZnVuY3Rpb24gZ28oKXsKICB2YXIgdz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIuZXMtcGcgLm1hcC13cmFwLC5lcy1wZyAuZDctbWFwLXdyYXAiKSxzPXcmJncucXVlcnlTZWxlY3Rvcigic3ZnLnZlbnVlLHN2Zy5kNy12ZW51ZSIpOwogIGlmKCF3fHwhcyl7aWYodHJpZXMrKzwxMDApc2V0VGltZW91dChnbywxMDApO3JldHVybn0KICBpZih3LnF1ZXJ5U2VsZWN0b3IoIi5tYXB6IikpcmV0dXJuOwogIHZhciBrPTEseD0wLHk9MCxNQVg9NixjdGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgY3RsLmNsYXNzTmFtZT0ibWFweiI7Y3RsLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsIk1hcCB6b29tIik7CiAgY3RsLmlubmVySFRNTD0nPGJ1dHRvbiB0eXBlPSJidXR0b24iIGRhdGEtej0iKyIgYXJpYS1sYWJlbD0iWm9vbSBpbiIgdGl0bGU9Ilpvb20gaW4gKEN0cmwgKyBzY3JvbGwpIj4rPC9idXR0b24+PGJ1dHRvbiB0eXBlPSJidXR0b24iIGRhdGEtej0iLSIgYXJpYS1sYWJlbD0iWm9vbSBvdXQiIHRpdGxlPSJab29tIG91dCAoQ3RybCArIHNjcm9sbCkiPiZtaW51czs8L2J1dHRvbj48YnV0dG9uIHR5cGU9ImJ1dHRvbiIgZGF0YS16PSIwIiBhcmlhLWxhYmVsPSJSZXNldCBtYXAiIHRpdGxlPSJSZXNldCBtYXAiPiYjODYzNDs8L2J1dHRvbj48c3BhbiBjbGFzcz0ibWFwei1oaW50Ij5DdHJsICsgc2Nyb2xsIHRvIHpvb208L3NwYW4+JzsKICB3LmFwcGVuZENoaWxkKGN0bCk7CiAgcy5zdHlsZS50cmFuc2Zvcm1PcmlnaW49IjAgMCI7CiAgLyogdGhlIGRyYXdpbmcncyB1bnRyYW5zZm9ybWVkIGJveDogaXRzIHJlbmRlcmVkIGJveCB3aXRoIHRoZSBjdXJyZW50IHRyYW5zZm9ybSB0YWtlbiBvZmYgKi8KICBmdW5jdGlvbiBiYXNlKCl7dmFyIHI9cy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm57bDpyLmxlZnQteCx0OnIudG9wLXksdzpyLndpZHRoL2ssaDpyLmhlaWdodC9rfX0KICAvKiBjbGFtcCBhZ2FpbnN0IHRoZSB3cmFwJ3MgYm94OiBvbmNlIHRoZSBzY2FsZWQgZHJhd2luZyBpcyBsYXJnZXIgdGhhbiB0aGUgYm94IGl0IG11c3QgY292ZXIgaXQgKG5vIGJsYW5rCiAgICAgYmFuZCBhdCBhbiBlZGdlKTsgd2hpbGUgaXQgaXMgc21hbGxlciwgYXMgdGhlIDdzIG1hcCBpcyBhdCBmaXJzdCBpbiBpdHMgdGFsbGVyIHdyYXAsIGl0IHN0YXlzIGluc2lkZSAqLwogIGZ1bmN0aW9uIGNsYW1wKHYsYSxiKXt2YXIgbG89TWF0aC5taW4oYSxiKSxoaT1NYXRoLm1heChhLGIpO3JldHVybiBNYXRoLm1pbihoaSxNYXRoLm1heChsbyx2KSl9CiAgZnVuY3Rpb24gYXAoKXsKICAgIHZhciBiPWJhc2UoKSxXPXcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICBpZihrPDEuMDAxKXtrPTE7eD0wO3k9MH0KICAgIGVsc2V7eD1jbGFtcCh4LFcubGVmdC1iLmwsVy5yaWdodC1iLncqay1iLmwpO3k9Y2xhbXAoeSxXLnRvcC1iLnQsVy5ib3R0b20tYi5oKmstYi50KX0KICAgIHMuc3R5bGUudHJhbnNmb3JtPWs9PT0xPyIiOiJ0cmFuc2xhdGUoIit4KyJweCwiK3krInB4KSBzY2FsZSgiK2srIikiOwogICAgdmFyIHdhcz13LmNsYXNzTGlzdC5jb250YWlucygiaXMtem9vbSIpOwogICAgdy5jbGFzc0xpc3QudG9nZ2xlKCJpcy16b29tIixrPjEpOwogICAgLyogdW56b29tZWQsIGEgZmluZ2VyIG9uIHRoZSBtYXAgc2Nyb2xscyB0aGUgcGFnZTsgem9vbWVkLCBpdCBwYW5zIHRoZSBtYXAgKi8KICAgIHcuc3R5bGUudG91Y2hBY3Rpb249az4xPyJub25lIjoicGFuLXkiOwogICAgLyogYmFjayBhdCAxOiB0aGUgRjEgbWFwIHNjcmlwdCBzaXplcyBpdHMgbGFiZWxzIGZyb20gdGhlIHJlbmRlcmVkIHdpZHRoIG9uIHJlc2l6ZSwgc28gbGV0IGl0IG1lYXN1cmUgYWdhaW4gKi8KICAgIGlmKHdhcyYmaz09PTEpc2V0VGltZW91dChmdW5jdGlvbigpe3dpbmRvdy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgicmVzaXplIikpfSwwKTsKICB9CiAgZnVuY3Rpb24gem9vbShmLGN4LGN5KXsKICAgIHZhciBiPWJhc2UoKSxuaz1NYXRoLm1pbihNQVgsTWF0aC5tYXgoMSxrKmYpKTsKICAgIGlmKG5rPT09aylyZXR1cm47CiAgICB2YXIgcHg9KGN4LWIubC14KS9rLHB5PShjeS1iLnQteSkvazsKICAgIHgtPXB4Kihuay1rKTt5LT1weSoobmstayk7az1uazthcCgpOwogIH0KICBmdW5jdGlvbiBtaWQoKXt2YXIgcj13LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybltyLmxlZnQrci53aWR0aC8yLHIudG9wK3IuaGVpZ2h0LzJdfQogIGN0bC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oZSl7CiAgICB2YXIgYj1lLnRhcmdldC5jbG9zZXN0KCJidXR0b24iKTtpZighYilyZXR1cm47CiAgICB2YXIgej1iLmdldEF0dHJpYnV0ZSgiZGF0YS16IiksYz1taWQoKTsKICAgIGlmKCIwIj09PXope2s9MTt4PTA7eT0wO2FwKCl9ZWxzZSB6b29tKCIrIj09PXo/MS40NToxLzEuNDUsY1swXSxjWzFdKTsKICB9KTsKICB3LmFkZEV2ZW50TGlzdGVuZXIoIndoZWVsIixmdW5jdGlvbihlKXsKICAgIGlmKCFlLmN0cmxLZXkmJiFlLm1ldGFLZXkpe2ZsYXNoKHcsIkN0cmwgKyBzY3JvbGwgdG8gem9vbSIpO3JldHVybn0KICAgIGUucHJldmVudERlZmF1bHQoKTt6b29tKGUuZGVsdGFZPDA/MS4xODoxLzEuMTgsZS5jbGllbnRYLGUuY2xpZW50WSk7CiAgfSx7cGFzc2l2ZTpmYWxzZX0pOwogIHZhciBwdHM9e30sZDA9bnVsbCxkcmFnPWZhbHNlLGxhc3Q9bnVsbCxtb3ZlZD0wLHN3YWxsb3c9ZmFsc2U7CiAgdy5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVyZG93biIsZnVuY3Rpb24oZSl7CiAgICBpZihlLnRhcmdldC5jbG9zZXN0KCIubWFweiIpKXJldHVybjsKICAgIHB0c1tlLnBvaW50ZXJJZF09e3g6ZS5jbGllbnRYLHk6ZS5jbGllbnRZfTsKICAgIHZhciBpZHM9T2JqZWN0LmtleXMocHRzKTsKICAgIGlmKGlkcy5sZW5ndGg9PT0yKXt2YXIgYT1wdHNbaWRzWzBdXSxiPXB0c1tpZHNbMV1dO2QwPU1hdGguaHlwb3QoYS54LWIueCxhLnktYi55KTtkcmFnPWZhbHNlO3JldHVybn0KICAgIGRyYWc9dHJ1ZTttb3ZlZD0wO2xhc3Q9e3g6ZS5jbGllbnRYLHk6ZS5jbGllbnRZfTsKICB9KTsKICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicG9pbnRlcm1vdmUiLGZ1bmN0aW9uKGUpewogICAgaWYoIXB0c1tlLnBvaW50ZXJJZF0pcmV0dXJuOwogICAgcHRzW2UucG9pbnRlcklkXT17eDplLmNsaWVudFgseTplLmNsaWVudFl9OwogICAgdmFyIGlkcz1PYmplY3Qua2V5cyhwdHMpOwogICAgaWYoaWRzLmxlbmd0aD09PTImJmQwKXsKICAgICAgdmFyIGE9cHRzW2lkc1swXV0sYj1wdHNbaWRzWzFdXSxkPU1hdGguaHlwb3QoYS54LWIueCxhLnktYi55KTsKICAgICAgem9vbShkL2QwLChhLngrYi54KS8yLChhLnkrYi55KS8yKTtkMD1kO21vdmVkPTk5O2UucHJldmVudERlZmF1bHQoKTtyZXR1cm47CiAgICB9CiAgICBpZighZHJhZylyZXR1cm47CiAgICB2YXIgZHg9ZS5jbGllbnRYLWxhc3QueCxkeT1lLmNsaWVudFktbGFzdC55O2xhc3Q9e3g6ZS5jbGllbnRYLHk6ZS5jbGllbnRZfTsKICAgIG1vdmVkKz1NYXRoLmFicyhkeCkrTWF0aC5hYnMoZHkpOwogICAgaWYobW92ZWQ+NCl3LmNsYXNzTGlzdC5hZGQoImlzLXBhbm5pbmciKTsKICAgIGlmKGs+MSl7eCs9ZHg7eSs9ZHk7YXAoKX0KICB9LHtwYXNzaXZlOmZhbHNlfSk7CiAgZnVuY3Rpb24gdXAoZSl7CiAgICBpZighcHRzW2UucG9pbnRlcklkXSlyZXR1cm47CiAgICBkZWxldGUgcHRzW2UucG9pbnRlcklkXTsKICAgIGlmKE9iamVjdC5rZXlzKHB0cykubGVuZ3RoPDIpZDA9bnVsbDsKICAgIGRyYWc9ZmFsc2U7dy5jbGFzc0xpc3QucmVtb3ZlKCJpcy1wYW5uaW5nIik7CiAgICBpZihtb3ZlZD40KXtzd2FsbG93PXRydWU7c2V0VGltZW91dChmdW5jdGlvbigpe3N3YWxsb3c9ZmFsc2V9LDApfQogIH0KICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicG9pbnRlcnVwIix1cCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJjYW5jZWwiLHVwKTsKICB3LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbihlKXtpZihzd2FsbG93KXtlLnN0b3BQcm9wYWdhdGlvbigpO2UucHJldmVudERlZmF1bHQoKX19LHRydWUpOwogIC8qIGEgd2lkdGggY2hhbmdlIChyb3RhdGlvbiwgYSB3aW5kb3cgcmVzaXplZCkgcmVzZXRzIHRoZSBtYXA7IGEgaGVpZ2h0LW9ubHkgY2hhbmdlIGRvZXMgbm90LCBiZWNhdXNlIGEgcGhvbmUncwogICAgIGFkZHJlc3MgYmFyIHNob3dpbmcgYW5kIGhpZGluZyBmaXJlcyByZXNpemUgYXMgdGhlIHBhZ2Ugc2Nyb2xscyAqLwogIHZhciBsYXN0Vz13aW5kb3cuaW5uZXJXaWR0aDsKICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIixmdW5jdGlvbigpe2lmKHdpbmRvdy5pbm5lcldpZHRoPT09bGFzdFcpcmV0dXJuO2xhc3RXPXdpbmRvdy5pbm5lcldpZHRoO2s9MTt4PTA7eT0wO2FwKCl9KTsKICBhcCgpOwp9CmdvKCk7Cn0pKCk7Cg0K
LyogZXNDYXJKczogY2Fyb3VzZWwgYXJyb3dzIGZvbGxvdyB0aGUgRXhwZXJpZW5jZXMgc3RhbmRhcmQgb24gZXZlcnkgcGFnZSAoQ0wtMjAyNjEwMDUtMDMs
IDUgT2N0IDIwMjYpLgogICBBIGNhcm91c2VsIHdob3NlIGNhcmRzIGFsbCBmaXQgc2hvd3Mgbm8gYXJyb3dzOiBlYWNoIC5jYXItbmF2IGdldHMgLm5vLXNj
cm9sbCB3aGlsZSB0aGUgdHJhY2sgaXRzIGJ1dHRvbnMgcG9pbnQgYXQKICAgKGRhdGEtdGFyZ2V0KSBoYXMgbm90aGluZyB0byBzY3JvbGwuIFJlLWNoZWNr
ZWQgd2hlbiB0aGUgdHJhY2sgb3IgYSBjYXJkIGNoYW5nZXMgc2l6ZSAod2luZG93IHJlc2l6ZSwgdGhlCiAgIEV4cGVyaWVuY2VzIGZpbHRlciBjaGlwcyBo
aWRpbmcgY2FyZHMpIGFuZCBvbiBsb2FkLCB3aGVuIGxhdGUgZm9udHMgYW5kIGltYWdlcyBoYXZlIHNldHRsZWQuCiAgIFNvdXJjZSBvZiB0cnV0aDogdGVt
cGxhdGUvZnJhZ21lbnRzL2Nhcm91c2VsLWpzLmpzLCBzaGlwcGVkIGJ5IHNjcmlwdHMvY2Fyb3VzZWxfYXJyb3dzXzIwMjYtMTAtMDUucHkuICovCihmdW5j
dGlvbiAoKSB7CiAgdmFyIG5hdnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuY2FyLW5hdicpOwogIGlmICghbmF2cy5sZW5ndGgpIHJldHVybjsK
ICBmdW5jdGlvbiB3YXRjaChuYXYpIHsKICAgIHZhciBidG4gPSBuYXYucXVlcnlTZWxlY3RvcignLmNhci1idG5bZGF0YS10YXJnZXRdJyk7CiAgICB2YXIg
dHJhY2sgPSBidG4gPyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChidG4uZ2V0QXR0cmlidXRlKCdkYXRhLXRhcmdldCcpKSA6IG51bGw7CiAgICBpZiAoIXRy
YWNrKSByZXR1cm47CiAgICBmdW5jdGlvbiBzeW5jKCkgeyBuYXYuY2xhc3NMaXN0LnRvZ2dsZSgnbm8tc2Nyb2xsJywgdHJhY2suc2Nyb2xsV2lkdGggLSB0
cmFjay5jbGllbnRXaWR0aCA8PSA0KTsgfQogICAgc3luYygpOwogICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHN5bmMpOwogICAgd2lu
ZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBzeW5jKTsKICAgIGlmICh3aW5kb3cuUmVzaXplT2JzZXJ2ZXIpIHsKICAgICAgdmFyIHJvID0gbmV3IFJl
c2l6ZU9ic2VydmVyKHN5bmMpOwogICAgICByby5vYnNlcnZlKHRyYWNrKTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmFjay5jaGlsZHJlbi5sZW5n
dGg7IGkrKykgcm8ub2JzZXJ2ZSh0cmFjay5jaGlsZHJlbltpXSk7CiAgICB9CiAgfQogIGZvciAodmFyIGkgPSAwOyBpIDwgbmF2cy5sZW5ndGg7IGkrKykg
d2F0Y2gobmF2c1tpXSk7Cn0pKCk7Cg==
LyogZXNGb3JtSnM6IGVucXVpcnkgZm9ybXMgZGVsaXZlciBzb21ld2hlcmUgYW5kIHRlbGwgdGhlIHRydXRoIChDTC0yMDI2MTAwMi0xMiwgMiBPY3QgMjAy
Njsgc3RhdHVzIG5hbWVzIGZpeGVkIGluCiAgIENMLTIwMjYxMDAyLTE0IHRoZSBzYW1lIG5pZ2h0KS4KICAgVGFrZXMgdGhlIHN1Ym1pdCBvZiAjcmZpIGFu
ZCAjeHFGb3JtIGF0IHRoZSBjYXB0dXJlIHBoYXNlLCBhaGVhZCBvZiB0aGUgb2xkZXIgaGFuZGxlcnMgaW4gdGhlIG1haW4gYW5kIGV2ZW50CiAgIHBheWxv
YWRzICh3aGljaCBzaG93ZWQgUmVjZWl2ZWQgd2l0aCBubyBkZWxpdmVyeSwgb3IgaGFuZGVkIGEgbWFpbHRvOiBsaW5rIHRvIHRoZSBtYWlsIGNsaWVudCku
CiAgIFJvdXRlIDE6IGRhdGEtZW5kcG9pbnQgc2V0IChhbiBodHRwcyBVUkwsIGUuZy4gdGhlIG44biB3ZWJob29rKTogUE9TVCB0aGUgRm9ybURhdGEgdGhl
cmUsIHN1Y2Nlc3Mgb24gYSAyeHguCiAgIFJvdXRlIDI6IG5vIGVuZHBvaW50OiBoYW5kIHRoZSBlbnF1aXJ5IHRvIHRoZSBzaXRlJ3Mgb3duIENvbnRhY3Qg
Rm9ybSA3IGZvcm0gODY3LCB3aGljaCBpcyBpbiB0aGUgcGFnZSAodGhlIG9sZAogICB0aGVtZSdzIGVucXVpcnkgcG9wdXApLCB3aXRoIENGNydzIHJlQ0FQ
VENIQSB2MyBhbmQgQWtpc21ldCBjaGVja3MsIGFuZCByZWFkIENGNydzIG91dGNvbWUuCiAgIENGNyByZXBvcnRzIHRoZSBvdXRjb21lIHR3aWNlOiB0aGUg
d3BjZjdzdWJtaXQgZXZlbnQgb24gdGhlIGZvcm0ncyB3cmFwcGVyIGNhcnJpZXMgdGhlIEFQSSBzdGF0dXMgKG1haWxfc2VudCwKICAgbWFpbF9mYWlsZWQs
IHZhbGlkYXRpb25fZmFpbGVkLCBhY2NlcHRhbmNlX21pc3NpbmcsIHNwYW0sIGFib3J0ZWQpLCBhbmQgdGhlIHdwY2Y3c3RhdHVzY2hhbmdlZCBldmVudCBv
biB0aGUgZm9ybQogICBjYXJyaWVzIHRoZSBzaG9ydCBmb3JtIChzZW50LCBmYWlsZWQsIGludmFsaWQsIHVuYWNjZXB0ZWQsIHNwYW0sIGFib3J0ZWQpLiBC
b3RoIGFyZSBhY2NlcHRlZCBoZXJlOyB0aGUgZmlyc3QKICAgdmVyc2lvbiBsaXN0ZW5lZCBmb3IgdGhlIGxvbmcgbmFtZXMgb24gdGhlIHNlY29uZCBldmVu
dCwgc28gc2VudCBhbmQgZmFpbGVkIHdlcmUgbmV2ZXIgc2VlbiBhbmQgdGhlIGZvcm0gd2FpdGVkCiAgIGZvciB0aGUgdGltZW91dC4gQW55dGhpbmcgYnV0
IHN1Y2Nlc3Mgc2hvd3MgYW4gZXJyb3Igd2l0aCB0aGUgb2ZmaWNlIGVtYWlsIGFuZCBwaG9uZSBhbmQga2VlcHMgdGhlIHZhbHVlcy4gKi8KKGZ1bmN0aW9u
ICgpIHsKICB2YXIgRk9STVMgPSAnZm9ybSNyZmksIGZvcm0jeHFGb3JtJzsKICB2YXIgRU1BSUwgPSAnaW5mb0Blcy1zcG9ydC5hZScsIFBIT05FID0gJys5
NzEgNCA0MzUgNjYxMicsIENGN19JRCA9ICc4NjcnLCBXQUlUID0gNDUwMDA7CiAgdmFyIE9LID0geyBtYWlsX3NlbnQ6IDEsIHNlbnQ6IDEgfTsKICB2YXIg
QkFEID0geyBtYWlsX2ZhaWxlZDogMSwgZmFpbGVkOiAxLCBzcGFtOiAxLCB2YWxpZGF0aW9uX2ZhaWxlZDogMSwgaW52YWxpZDogMSwgYWNjZXB0YW5jZV9t
aXNzaW5nOiAxLCB1bmFjY2VwdGVkOiAxLCBhYm9ydGVkOiAxLCBwYXltZW50X3JlcXVpcmVkOiAxLCAncGF5bWVudC1yZXF1aXJlZCc6IDEgfTsKICB2YXIg
TE9ORyA9IHsgc2VudDogJ21haWxfc2VudCcsIGZhaWxlZDogJ21haWxfZmFpbGVkJywgaW52YWxpZDogJ3ZhbGlkYXRpb25fZmFpbGVkJywgdW5hY2NlcHRl
ZDogJ2FjY2VwdGFuY2VfbWlzc2luZycsICdwYXltZW50LXJlcXVpcmVkJzogJ3BheW1lbnRfcmVxdWlyZWQnIH07CiAgdmFyIFJFQVNPTiA9IHsgdmFsaWRh
dGlvbl9mYWlsZWQ6ICdhIGZpZWxkIHdhcyByZWplY3RlZCcsIHNwYW06ICd0aGUgc3BhbSBmaWx0ZXIgYmxvY2tlZCBpdCcsIG1haWxfZmFpbGVkOiAndGhl
IG1haWwgc2VydmVyIGRpZCBub3QgYWNjZXB0IGl0JywKICAgICAgICAgICAgICAgICBhY2NlcHRhbmNlX21pc3Npbmc6ICdjb25zZW50IHdhcyBtaXNzaW5n
JywgYWJvcnRlZDogJ2l0IHdhcyBpbnRlcnJ1cHRlZCcsIHBheW1lbnRfcmVxdWlyZWQ6ICdwYXltZW50IHdhcyByZXF1ZXN0ZWQnLCB0aW1lb3V0OiAnbm8g
cmVwbHkgaW4gdGltZScsCiAgICAgICAgICAgICAgICAgbmV0d29yazogJ2EgY29ubmVjdGlvbiBwcm9ibGVtJywgZXhjZXB0aW9uOiAnYSBzY3JpcHQgZXJy
b3InLCAnbm8gZGVzdGluYXRpb24nOiAndGhlIGZvcm0gaGFzIG5vd2hlcmUgdG8gc2VuZCcgfTsKICB2YXIgRklFTEQgPSB7ICd5b3VyLW5hbWUnOiAnZmly
c3QgbmFtZScsICdsYXN0LW5hbWUnOiAnbGFzdCBuYW1lJywgJ3RleHQtOTk4JzogJ2NvbXBhbnknLCAneW91ci1lbWFpbCc6ICdlbWFpbCcsICd5b3VyLXRl
bCc6ICdwaG9uZScsICd5b3VyLW1lc3NhZ2UnOiAnbWVzc2FnZScgfTsKICBmdW5jdGlvbiBsb2coeCkgeyB0cnkgeyAod2luZG93LmVzRm9ybUxvZyA9IHdp
bmRvdy5lc0Zvcm1Mb2cgfHwgW10pLnB1c2goeCk7IH0gY2F0Y2ggKGVycikge30gfQogIGZ1bmN0aW9uIHNlbnRFbChmKSB7IHJldHVybiBmLnF1ZXJ5U2Vs
ZWN0b3IoJy5zZW50JykgfHwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlbnQnKTsgfQogIGZ1bmN0aW9uIHNob3coZiwgb2ssIG1zZykgewogICAgdmFy
IHMgPSBzZW50RWwoZik7IGlmICghcykgcmV0dXJuOwogICAgaWYgKCFzLmdldEF0dHJpYnV0ZSgnZGF0YS1vcmlnJykpIHMuc2V0QXR0cmlidXRlKCdkYXRh
LW9yaWcnLCBzLnRleHRDb250ZW50KTsKICAgIHMudGV4dENvbnRlbnQgPSBvayA/IHMuZ2V0QXR0cmlidXRlKCdkYXRhLW9yaWcnKSA6IG1zZzsKICAgIHMu
Y2xhc3NMaXN0LnRvZ2dsZSgnaXMtZXJyJywgIW9rKTsgcy5jbGFzc0xpc3QuYWRkKCdvbicpOwogICAgY2xlYXJUaW1lb3V0KHMuX2VzVCk7CiAgICBzLl9l
c1QgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgcy5jbGFzc0xpc3QucmVtb3ZlKCdvbicpOyBzLmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWVycicpOyBzLnRl
eHRDb250ZW50ID0gcy5nZXRBdHRyaWJ1dGUoJ2RhdGEtb3JpZycpOyB9LCBvayA/IDcwMDAgOiAyNTAwMCk7CiAgfQogIGZ1bmN0aW9uIGJ1c3koZiwgb24p
IHsKICAgIHZhciBiID0gZi5xdWVyeVNlbGVjdG9yKCdbdHlwZT0ic3VibWl0Il0nKTsgaWYgKCFiKSByZXR1cm47CiAgICBiLmRpc2FibGVkID0gb247CiAg
ICBpZiAob24pIHsgaWYgKCFiLmdldEF0dHJpYnV0ZSgnZGF0YS1sYWJlbCcpKSBiLnNldEF0dHJpYnV0ZSgnZGF0YS1sYWJlbCcsIGIudGV4dENvbnRlbnQp
OyBiLnRleHRDb250ZW50ID0gJ1NlbmRpbmcnOyB9CiAgICBlbHNlIGlmIChiLmdldEF0dHJpYnV0ZSgnZGF0YS1sYWJlbCcpKSBiLnRleHRDb250ZW50ID0g
Yi5nZXRBdHRyaWJ1dGUoJ2RhdGEtbGFiZWwnKTsKICB9CiAgZnVuY3Rpb24gdmFsKGYsIG4pIHsgdmFyIGUgPSBmLnF1ZXJ5U2VsZWN0b3IoJ1tuYW1lPSIn
ICsgbiArICciXScpOyByZXR1cm4gZSA/IFN0cmluZyhlLnZhbHVlIHx8ICcnKS5yZXBsYWNlKC9eXHMrfFxzKyQvZywgJycpIDogJyc7IH0KICBmdW5jdGlv
biBjb25zZW50KGYpIHsgdmFyIGMgPSBmLnF1ZXJ5U2VsZWN0b3IoJ1tuYW1lPSJjb25zZW50Il0nKTsgcmV0dXJuIGMgJiYgYy5jaGVja2VkID8gJ3llcycg
OiAnbm8nOyB9CiAgZnVuY3Rpb24gY2Y3Zm9ybSgpIHsgdmFyIGkgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dFtuYW1lPSJfd3BjZjciXVt2YWx1
ZT0iJyArIENGN19JRCArICciXScpOyByZXR1cm4gaSA/IGkuY2xvc2VzdCgnZm9ybScpIDogbnVsbDsgfQogIGZ1bmN0aW9uIHZpYUNmNyhmLCBkb25lKSB7
CiAgICB2YXIgYyA9IGNmN2Zvcm0oKTsKICAgIGlmICghYyB8fCAhd2luZG93LndwY2Y3IHx8IHR5cGVvZiB3aW5kb3cud3BjZjcuc3VibWl0ICE9PSAnZnVu
Y3Rpb24nKSByZXR1cm4gZmFsc2U7CiAgICBmdW5jdGlvbiBzZXQobiwgdikgeyB2YXIgZSA9IGMucXVlcnlTZWxlY3RvcignW25hbWU9IicgKyBuICsgJyJd
Jyk7IGlmIChlKSBlLnZhbHVlID0gdjsgfQogICAgdmFyIGludGVyZXN0ID0gdmFsKGYsICdpbnRlcmVzdCcpLCBldiA9IHZhbChmLCAnZXZlbnQtbmFtZScp
IHx8ICdXZWJzaXRlIGVucXVpcnknOwogICAgc2V0KCd5b3VyLW5hbWUnLCB2YWwoZiwgJ2ZpcnN0LW5hbWUnKSB8fCAnV2Vic2l0ZScpOyBzZXQoJ2xhc3Qt
bmFtZScsIHZhbChmLCAnbGFzdC1uYW1lJykgfHwgJ0VucXVpcnknKTsKICAgIHNldCgndGV4dC05OTgnLCB2YWwoZiwgJ2NvbXBhbnknKSB8fCAnTm90IGdp
dmVuJyk7IHNldCgneW91ci1lbWFpbCcsIHZhbChmLCAnZW1haWwnKSk7IHNldCgneW91ci10ZWwnLCB2YWwoZiwgJ3Bob25lJykpOwogICAgc2V0KCdpbnRl
cmVzdGVkLWluJywgaW50ZXJlc3QpOyBzZXQoJ2V2ZW50LW5hbWUnLCBldik7CiAgICBzZXQoJ3lvdXItbWVzc2FnZScsIFt2YWwoZiwgJ21lc3NhZ2UnKSB8
fCAnTm8gbWVzc2FnZSBsZWZ0LicsICcnLCAnSW50ZXJlc3RlZCBpbjogJyArIGludGVyZXN0LCAnRXZlbnQ6ICcgKyBldiwKICAgICAgJ1JvdXRpbmc6ICcg
KyB2YWwoZiwgJ2VlYl9ldmVudCcpICsgJyAvICcgKyB2YWwoZiwgJ2VlYl9jYXRlZ29yeScpICsgJyAvICcgKyB2YWwoZiwgJ2VlYl9yZWFzb24nKSwKICAg
ICAgJ0NvbnNlbnQgdG8gY29udGFjdDogJyArIGNvbnNlbnQoZiksICdTZW50IGZyb206ICcgKyBsb2NhdGlvbi5ocmVmXS5qb2luKCdcbicpKTsKICAgIHZh
ciBzZXR0bGVkID0gZmFsc2UsIHQ7CiAgICBmdW5jdGlvbiBmaW5pc2gob2ssIHN0YXR1cywgZXh0cmEpIHsKICAgICAgaWYgKHNldHRsZWQpIHJldHVybjsg
c2V0dGxlZCA9IHRydWU7IGNsZWFyVGltZW91dCh0KTsKICAgICAgYy5yZW1vdmVFdmVudExpc3RlbmVyKCd3cGNmN3N0YXR1c2NoYW5nZWQnLCBvblN0YXR1
cyk7IGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3dwY2Y3c3VibWl0Jywgb25TdWJtaXQpOwogICAgICBkb25lKG9rLCBzdGF0dXMsIGV4dHJhKTsK
ICAgIH0KICAgIGZ1bmN0aW9uIHNldHRsZShzdCwgZCkgewogICAgICBzdCA9IFN0cmluZyhzdCB8fCAnJyk7CiAgICAgIGlmIChPS1tzdF0pIHsgZmluaXNo
KHRydWUsICdtYWlsX3NlbnQnKTsgcmV0dXJuOyB9CiAgICAgIGlmICghQkFEW3N0XSkgcmV0dXJuOwogICAgICB2YXIgZXh0cmEgPSAnJywgaW52ID0gZCAm
JiBkLmFwaVJlc3BvbnNlICYmIGQuYXBpUmVzcG9uc2UuaW52YWxpZF9maWVsZHM7CiAgICAgIGlmIChpbnYgJiYgaW52Lmxlbmd0aCkgeyB2YXIgbmFtZXMg
PSBbXTsgZm9yICh2YXIgaSA9IDA7IGkgPCBpbnYubGVuZ3RoOyBpKyspIG5hbWVzLnB1c2goRklFTERbaW52W2ldLmZpZWxkXSB8fCBpbnZbaV0uZmllbGQp
OyBleHRyYSA9IG5hbWVzLmpvaW4oJywgJyk7IH0KICAgICAgaWYgKGQgJiYgZC5hcGlSZXNwb25zZSAmJiBkLmFwaVJlc3BvbnNlLm1lc3NhZ2UpIGxvZygn
Y2Y3OiAnICsgZC5hcGlSZXNwb25zZS5tZXNzYWdlKTsKICAgICAgZmluaXNoKGZhbHNlLCBMT05HW3N0XSB8fCBzdCwgZXh0cmEpOwogICAgfQogICAgLyog
c3RhdHVzY2hhbmdlZCBmaXJlcyBmaXJzdCwgaW5zaWRlIENGNydzIHNldFN0YXR1czsgYSB0aWNrIGxhdGVyIHRoZSBzdWJtaXQgZXZlbnQgYnJpbmdzIHRo
ZSBkZXRhaWwgKHJlamVjdGVkCiAgICAgICBmaWVsZHMsIG1lc3NhZ2UpLCBzbyBsZXQgdGhhdCBvbmUgc2V0dGxlIGZpcnN0IHdoZW4gaXQgY29tZXMgKi8K
ICAgIGZ1bmN0aW9uIG9uU3RhdHVzKGUpIHsgdmFyIHN0ID0gKGUuZGV0YWlsICYmIGUuZGV0YWlsLnN0YXR1cykgfHwgYy5nZXRBdHRyaWJ1dGUoJ2RhdGEt
c3RhdHVzJyk7IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyBzZXR0bGUoc3QpOyB9LCAwKTsgfQogICAgZnVuY3Rpb24gb25TdWJtaXQoZSkgeyB2YXIgZCA9
IGUuZGV0YWlsIHx8IHt9OyBpZiAoU3RyaW5nKGQuY29udGFjdEZvcm1JZCkgIT09IENGN19JRCkgcmV0dXJuOyBzZXR0bGUoZC5zdGF0dXMsIGQpOyB9CiAg
ICBjLmFkZEV2ZW50TGlzdGVuZXIoJ3dwY2Y3c3RhdHVzY2hhbmdlZCcsIG9uU3RhdHVzKTsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3dwY2Y3
c3VibWl0Jywgb25TdWJtaXQpOwogICAgdCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyBmaW5pc2goZmFsc2UsICd0aW1lb3V0Jyk7IH0sIFdBSVQpOwog
ICAgdHJ5IHsgd2luZG93LndwY2Y3LnN1Ym1pdChjKTsgfSBjYXRjaCAoZXJyKSB7IGZpbmlzaChmYWxzZSwgJ2V4Y2VwdGlvbicpOyB9CiAgICByZXR1cm4g
dHJ1ZTsKICB9CiAgZnVuY3Rpb24gdmlhRW5kcG9pbnQoZiwgdXJsLCBkb25lKSB7CiAgICB2YXIgY3RsID0gKCdBYm9ydENvbnRyb2xsZXInIGluIHdpbmRv
dykgPyBuZXcgQWJvcnRDb250cm9sbGVyKCkgOiBudWxsOwogICAgdmFyIHQgPSBjdGwgPyBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgY3RsLmFib3J0KCk7
IH0sIFdBSVQpIDogbnVsbDsKICAgIHZhciBvcHRzID0geyBtZXRob2Q6ICdQT1NUJywgYm9keTogbmV3IEZvcm1EYXRhKGYpIH07IGlmIChjdGwpIG9wdHMu
c2lnbmFsID0gY3RsLnNpZ25hbDsKICAgIGZldGNoKHVybCwgb3B0cykudGhlbihmdW5jdGlvbiAocikgeyBpZiAodCkgY2xlYXJUaW1lb3V0KHQpOyBkb25l
KHIub2ssICdodHRwICcgKyByLnN0YXR1cyk7IH0pCiAgICAgIC5jYXRjaChmdW5jdGlvbiAoKSB7IGlmICh0KSBjbGVhclRpbWVvdXQodCk7IGRvbmUoZmFs
c2UsICduZXR3b3JrJyk7IH0pOwogIH0KICBmdW5jdGlvbiBmYWlsKGYsIHN0YXR1cywgZXh0cmEpIHsKICAgIGJ1c3koZiwgZmFsc2UpOwogICAgdmFyIHdo
eSA9IChSRUFTT05bc3RhdHVzXSB8fCBzdGF0dXMpICsgKGV4dHJhID8gJzogJyArIGV4dHJhIDogJycpOwogICAgc2hvdyhmLCBmYWxzZSwgJ1NvcnJ5LCB0
aGF0IGRpZCBub3Qgc2VuZCAoJyArIHdoeSArICcpLiBFbWFpbCAnICsgRU1BSUwgKyAnIG9yIGNhbGwgJyArIFBIT05FICsgJy4nKTsKICAgIGxvZyhzdGF0
dXMpOwogIH0KICBmdW5jdGlvbiBzdWNjZXNzKGYpIHsgYnVzeShmLCBmYWxzZSk7IHNob3coZiwgdHJ1ZSk7IGYucmVzZXQoKTsgbG9nKCdtYWlsX3NlbnQn
KTsgfQogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3N1Ym1pdCcsIGZ1bmN0aW9uIChlKSB7CiAgICB2YXIgZiA9IGUudGFyZ2V0OwogICAgaWYgKCFm
IHx8ICFmLm1hdGNoZXMgfHwgIWYubWF0Y2hlcyhGT1JNUykpIHJldHVybjsKICAgIGUucHJldmVudERlZmF1bHQoKTsgZS5zdG9wUHJvcGFnYXRpb24oKTsg
ZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgIGlmICghZi5jaGVja1ZhbGlkaXR5KCkpIHsgZi5yZXBvcnRWYWxpZGl0eSgpOyByZXR1cm47IH0K
ICAgIGlmIChmLmdldEF0dHJpYnV0ZSgnZGF0YS1zZW5kaW5nJykgPT09ICcxJykgcmV0dXJuOwogICAgZi5zZXRBdHRyaWJ1dGUoJ2RhdGEtc2VuZGluZycs
ICcxJyk7IGJ1c3koZiwgdHJ1ZSk7CiAgICB2YXIgZG9uZSA9IGZ1bmN0aW9uIChvaywgc3RhdHVzLCBleHRyYSkgeyBmLnJlbW92ZUF0dHJpYnV0ZSgnZGF0
YS1zZW5kaW5nJyk7IGlmIChvaykgc3VjY2VzcyhmKTsgZWxzZSBmYWlsKGYsIHN0YXR1cywgZXh0cmEpOyB9OwogICAgdmFyIHVybCA9IChmLmdldEF0dHJp
YnV0ZSgnZGF0YS1lbmRwb2ludCcpIHx8ICcnKS5yZXBsYWNlKC9eXHMrfFxzKyQvZywgJycpOwogICAgaWYgKHVybCkgeyB2aWFFbmRwb2ludChmLCB1cmws
IGRvbmUpOyByZXR1cm47IH0KICAgIGlmICh2aWFDZjcoZiwgZG9uZSkpIHJldHVybjsKICAgIGRvbmUoZmFsc2UsICdubyBkZXN0aW5hdGlvbicpOwogIH0s
IHRydWUpOwogIC8qIHRoZSBvZmZpY2UgZm9ybSB0aGF0IHJlY2VpdmVzIHRoZSBlbnF1aXJ5IHJlcXVpcmVzIGEgcGhvbmUgbnVtYmVyICovCiAgdmFyIGZv
cm1zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChGT1JNUyk7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBmb3Jtcy5sZW5ndGg7IGkrKykgeyB2YXIgcCA9
IGZvcm1zW2ldLnF1ZXJ5U2VsZWN0b3IoJ1tuYW1lPSJwaG9uZSJdJyk7IGlmIChwKSBwLnJlcXVpcmVkID0gdHJ1ZTsgfQp9KSgpOwo=
LyogZXNSZmlKczogb3BlbmluZyB0aGUgZW5xdWlyeSBmb3JtIGtlZXBzIHRoZSBwYWdlIHdoZXJlIGl0IGlzIChDTC0yMDI2MTAwNi0wMSwgNiBPY3QgMjAy
NikuCiAgIEV2ZXJ5IGNvbnRyb2wgdGhhdCBvcGVucyBhIGZvcm0gaXMgYW4gYW5jaG9yIHRvICNlbnF1aXJlLCB0aGUgaW4tcGFnZSBmYWxsYmFjayBmb3Ig
cmVhZGVycyB3aXRob3V0IHNjcmlwdC4KICAgVGhlIG9sZCB0aGVtZSdzIGN1c3RvbS1zY3JpcHQuanMgbGlzdGVucyBvbiBkb2N1bWVudCBmb3IgZXZlcnkg
Y2xpY2sgb24gYVtocmVmKj0iIyJdIGFuZCBzbW9vdGgtc2Nyb2xscyB0bwogICB0aGF0IHNlY3Rpb24sIHNvIHRoZSBwYWdlIHNsaWQgdG8gdGhlIGJvdHRv
bSB1bmRlciB0aGUgb3BlbiBmb3JtLiBPdXIgb3BlbmVyIHJ1bnMgb24gdGhlIGVsZW1lbnQgYW5kIGNhbGxzCiAgIHByZXZlbnREZWZhdWx0LCB3aGljaCBk
b2VzIG5vdCBzdG9wIGEgZGVsZWdhdGVkIGhhbmRsZXIgb24gZG9jdW1lbnQ7IHN0b3BwaW5nIHRoZSBjbGljayBmcm9tIHJlYWNoaW5nIGRvY3VtZW50CiAg
IGRvZXMuIFRoZSBzdG9wIGhhcHBlbnMgb24gYm9keSwgYWZ0ZXIgZXZlcnkgaGFuZGxlciBvbiB0aGUgZWxlbWVudCBpdHNlbGYgaGFzIHJ1biAodGhlIG9w
ZW5lciwgdGhlCiAgICJJbnRlcmVzdGVkIGluIiBwcmVzZWxlY3QpLCBhbmQgb25seSBmb3IgY2xpY2tzIG9uIGEgZm9ybSBvcGVuZXIuIExpbmtzIHRoYXQg
b25seSBwb2ludCBhdCAjZW5xdWlyZSBzdGlsbCBzY3JvbGwuCiAgIFNvdXJjZSBvZiB0cnV0aDogdGVtcGxhdGUvZnJhZ21lbnRzL3JmaS1qcy5qcywgc2hp
cHBlZCBieSBzY3JpcHRzL3JmaV9ub19zY3JvbGxfMjAyNi0xMC0wNi5weS4gKi8KKGZ1bmN0aW9uICgpIHsKICB2YXIgU0VMID0gJ1tkYXRhLW9wZW4tcmZp
XSwgW2RhdGEtb3Blbi14cV0nOwogIHZhciBib2R5ID0gZG9jdW1lbnQuYm9keTsKICBpZiAoIWJvZHkgfHwgIWJvZHkuYWRkRXZlbnRMaXN0ZW5lcikgcmV0
dXJuOwogIGJvZHkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZSkgewogICAgdmFyIGVsID0gZS50YXJnZXQ7CiAgICB3aGlsZSAoZWwg
JiYgZWwgIT09IGJvZHkpIHsKICAgICAgaWYgKGVsLm1hdGNoZXMgJiYgZWwubWF0Y2hlcyhTRUwpKSB7IGUuc3RvcFByb3BhZ2F0aW9uKCk7IHJldHVybjsg
fQogICAgICBlbCA9IGVsLnBhcmVudE5vZGU7CiAgICB9CiAgfSwgZmFsc2UpOwp9KSgpOwo=
LyogZXNDYXJ0SnM6IHRoZSBjYXJ0IGljb24gaW4gdGhlIG5hdiBzaG93cyBob3cgbWFueSBpdGVtcyBhcmUgaW4gdGhlIHZpc2l0b3IncyBiYXNrZXQgKENM
LTIwMjYxMDA5LTAyLCA5IE9jdCAyMDI2KS4KICAgTG91aXM6ICJDYW4gd2UgYWRkIGEgY2FydCBpY29uIHRvIHRoZSB0b3AgcmlnaHQgb2YgdGhlIG5ldyBz
aXRlIHNvIHRoYXQgcGVvcGxlIGNhbiBuYXZpZ2F0ZSB0aGUgd2Vic2l0ZSBhZnRlcgogICBhZGRlZCB0byBjYXJ0IGFuZCB0aGVuIGdvIGJhY2sgdG8gcGF5
PyBPdGhlcndpc2UgaXQncyBub3Qgb2J2aW91cyBob3cgeW91J2Qgc2VlIHdoYXQncyBpbiB5b3VyIGJhc2tldCBpZiB5b3UKICAgbmF2aWdhdGVkIGF3YXkg
ZnJvbSB0aGUgY2hlY2tvdXQgcGFnZSIuIFRoZSBpY29uIGl0c2VsZiBpcyBwbGFpbiBtYXJrdXAgKGEgbGluayB0byAvY2FydC8pLCBzbyBpdCB3b3JrcyB3
aXRob3V0CiAgIHNjcmlwdC4gVGhpcyByZWFkcyB0aGUgV29vQ29tbWVyY2UgU3RvcmUgQVBJIGZvciB0aGUgdmlzaXRvcidzIG93biBzZXNzaW9uIChzYW1l
LW9yaWdpbiBjb29raWVzLCBubyBub25jZSBuZWVkZWQKICAgZm9yIGEgcmVhZCkgYW5kIHNob3dzIHRoZSBjb3VudCBiYWRnZSB3aGVuIHRoZSBiYXNrZXQg
aGFzIGFueXRoaW5nIGluIGl0OyBhIGZhaWxlZCBvciBlbXB0eSByZWFkIGxlYXZlcyB0aGUgYmFkZ2UKICAgaGlkZGVuLiBSZS1yZWFkIHdoZW4gdGhlIHBh
Z2UgaXMgc2hvd24gYWdhaW4gZnJvbSB0aGUgYmFjay1mb3J3YXJkIGNhY2hlLCB3aGljaCBpcyBob3cgcGVvcGxlIGNvbWUgYmFjayBmcm9tIHRoZQogICBj
YXJ0LiBTb3VyY2Ugb2YgdHJ1dGg6IHRlbXBsYXRlL2ZyYWdtZW50cy9jYXJ0LWpzLmpzLCBzaGlwcGVkIGJ5IHNjcmlwdHMvY2FydF9pY29uXzIwMjYtMTAt
MDkucHkuICovCihmdW5jdGlvbiAoKSB7CiAgdmFyIGJhZGdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25hdkNhcnROJyk7CiAgaWYgKCFiYWRnZSkg
cmV0dXJuOwogIHZhciBVUkwgPSAnaHR0cHM6Ly93d3cuZXMtc3BvcnQuYWUvd3AtanNvbi93Yy9zdG9yZS92MS9jYXJ0JzsKICBmdW5jdGlvbiBzaG93KG4p
IHsKICAgIG4gPSBwYXJzZUludChuLCAxMCkgfHwgMDsKICAgIGJhZGdlLnRleHRDb250ZW50ID0gbiA+IDk5ID8gJzk5KycgOiBTdHJpbmcobik7CiAgICBi
YWRnZS5oaWRkZW4gPSBuIDwgMTsKICAgIHZhciBhID0gYmFkZ2UucGFyZW50Tm9kZTsKICAgIGlmIChhKSBhLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcs
IG4gPiAwID8gJ1lvdXIgY2FydCwgJyArIG4gKyAobiA9PT0gMSA/ICcgaXRlbScgOiAnIGl0ZW1zJykgOiAnWW91ciBjYXJ0Jyk7CiAgfQogIGZ1bmN0aW9u
IHJlYWQoKSB7CiAgICBpZiAoIXdpbmRvdy5mZXRjaCkgcmV0dXJuOwogICAgZmV0Y2goVVJMLCB7IGNyZWRlbnRpYWxzOiAnc2FtZS1vcmlnaW4nLCBjYWNo
ZTogJ25vLXN0b3JlJywgaGVhZGVyczogeyAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL2pzb24nIH0gfSkKICAgICAgLnRoZW4oZnVuY3Rpb24gKHIpIHsgcmV0
dXJuIHIub2sgPyByLmpzb24oKSA6IG51bGw7IH0pCiAgICAgIC50aGVuKGZ1bmN0aW9uIChjKSB7IGlmIChjKSBzaG93KGMuaXRlbXNfY291bnQpOyB9KQog
ICAgICAuY2F0Y2goZnVuY3Rpb24gKCkge30pOwogIH0KICByZWFkKCk7CiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3BhZ2VzaG93JywgZnVuY3Rpb24g
KGUpIHsgaWYgKGUucGVyc2lzdGVkKSByZWFkKCk7IH0pOwogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCBmdW5jdGlv
biAoKSB7IGlmIChkb2N1bWVudC52aXNpYmlsaXR5U3RhdGUgPT09ICd2aXNpYmxlJykgcmVhZCgpOyB9KTsKfSkoKTsK
Step 1 of 5
When are you staying?
Your package includes a minimum two-night stay by default. Please adjust the dates if you’re planning to stay a longer..
Dates and guests
Check in – check out
Select dates
Mo Tu We Th Fr Sa Su
Select check-in, then check-out · min 2 nights
Guests and rooms
1 adult · 1 room
Adults
18 and over · one race ticket each
Children
2–12 · circuit entry is free
Rooms
Max 4 guests per room
Step 2 of 5
Pick your hotel
← Back to all hotels
Step 3 of 5
Choose a room
Step 4 of 5
Who is travelling?
Names must match the passport or Emirates ID used at check-in and at the circuit gate. Tickets are issued in the lead guest's name.
Step 5 of 5
Check it over
Nothing is charged yet. The cart holds your rate for 20 minutes.
I've checked the guest names and dates, and I accept the ticket and hotel terms. ES Sport can contact me about this booking.